Skip to content

Commit

Permalink
Mark success return value as volatile to work around rescheduling
Browse files Browse the repository at this point in the history
Resolves #15921

The test case nptl/tst-cleanup2 fails on s390x and power6 due to
instruction sheduling in gcc.  This was reported in gcc:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58034

but it was concluded that gcc is allowed to assume that the first
argument to sprintf is a character array - NULL not being a valid
character array.
  • Loading branch information
Siddhesh Poyarekar committed Sep 3, 2013
1 parent 18d4371 commit 6c8bbad
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 2 deletions.
2 changes: 1 addition & 1 deletion NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ Version 2.19
* The following bugs are resolved with this release:

14155, 14699, 15522, 15531, 15532, 15736, 15749, 15797, 15867, 15890,
15897, 15905, 15909.
15897, 15905, 15909, 15921.

* CVE-2013-4237 The readdir_r function could write more than NAME_MAX bytes
to the d_name member of struct dirent, or omit the terminating NUL
Expand Down
6 changes: 6 additions & 0 deletions nptl/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
2013-09-03 Siddhesh Poyarekar <siddhesh@redhat.com>

[BZ #15921]
* tst-cleanup2.c (do_test): New volatile variable RET to
return success.

2013-08-30 Ondřej Bílka <neleai@seznam.cz>

* sysdeps/pthread/pthread.h: Fix typos.
Expand Down
8 changes: 7 additions & 1 deletion nptl/tst-cleanup2.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,12 @@ static int
do_test (void)
{
char *p = NULL;
/* gcc can overwrite the success written value by scheduling instructions
around sprintf. It is allowed to do this since according to C99 the first
argument of sprintf is a character array and NULL is not a valid character
array. Mark the return value as volatile so that it gets reloaded on
return. */
volatile int ret = 0;
struct sigaction sa;

sa.sa_handler = sig_handler;
Expand All @@ -50,7 +56,7 @@ do_test (void)
if (setjmp (jmpbuf))
{
puts ("Exiting main...");
return 0;
return ret;
}

sprintf (p, "This should segv\n");
Expand Down

0 comments on commit 6c8bbad

Please sign in to comment.