[PATCH] fix error condition in glibc's clone() call
Helge Deller <[email protected]>
| Newsgroups | gmane.linux.ports.hppa |
|---|---|
| Message-ID | <[email protected]> |
Hello, The following patch to glibc fixes an error which is triggered by the Linux Test Projects clone04 test, and was already mentioned and analyzed by Mike and Joel (see links to mail threads below). The problem is, that if clone(<function>, <stack>, ...) is called and <function> or <stack> is NULL, then %r19 is restored from a location which wasn't initialized. Something like this... clone: if <function> == NULL goto .Lerror if <stack>== NULL goto .Lerror save_%r19_on_stack ..... .Lerror: restore_%r19_from_stack ##### <- may read from stack without %r19 having been saved here ! goto __syscall_error The patch below moves the "save_%r19_on_stack" part above the checks, so that "restore_%r19_from_stack" always reads the correct value. Any takers to bring this patch into glibc ? Helge Original threads: http://lists.parisc-linux.org/pipermail/parisc-linux/2006-January/028088.html http://lists.parisc-linux.org/pipermail/parisc-linux/2006-March/028552.html http://sourceware.org/ml/libc-alpha/2003-12/msg00120.html PATCH: --- ../glibc-2.3.6/sysdeps/unix/sysv/linux/hppa/clone.S.org 2006-12-29 08:49:25.000000000 +0100 +++ ../glibc-2.3.6/sysdeps/unix/sysv/linux/hppa/clone.S 2006-12-29 16:58:30.000000000 +0100 @@ -32,6 +32,11 @@ ENTRY(__clone) /* FIXME: I have no idea how profiling works on hppa. */ + /* Save the PIC register. */ +#ifdef PIC + stw %r19,-32(%sr0, %sp) /* parent */ +#endif + /* Sanity check arguments. */ comib,= 0,%arg0,.Lerror /* no NULL function pointers */ ldi -EINVAL,%ret0 @@ -42,11 +47,6 @@ stwm %arg0,64(%arg1) stw %arg3,-60(%arg1) - /* Save the PIC register. */ -#ifdef PIC - stw %r19,-32(%sr0, %sp) /* parent */ -#endif - /* Do the system call */ copy %arg2,%arg0 ble 0x100(%sr2,%r0)