Re: timing bug in clone() ? [BUGFIX-PATCH attached]

"Carlos O'Donell" <[email protected]>
Newsgroups gmane.linux.ports.hppa
Message-ID <[email protected]>
On 1/1/07, Helge Deller <[email protected]> wrote:
> I've found the bug now... :-)
> Patch is attached below, and the problem was not in the kernel, but in glibc.
>
> The first hunk in the patch below ("Save the PIC register.") is the fix for the arguments check which I posted before (http://lists.parisc-linux.org/pipermail/parisc-linux/2006-December/031029.html). This hunk fixes LTP's clone04 test.
>
> The second and third hunk fixes the "return 0" bug as reported by LTP's clone06 test.
> It first saves the current FPIC register on the child's stack (to %arg0 instead of %sr0,%sp) and later reads it back from there in the third hunk just before calling _exit().
> That way the PIC register has the correct value and exit() doesn't crashes any more.
>
> Now all clone()-tests from LTP succeeds :-)
>
> Helge
>
>
> --- glibc-2.3.6.ds1/build-tree/glibc-2.3.6/debian/sysdeps/unix/sysv/linux/hppa/clone.S.org      2006-12-29 08:49:25.000000000 +0100
> +++ glibc-2.3.6.ds1/build-tree/glibc-2.3.6/debian/sysdeps/unix/sysv/linux/hppa/clone.S  2007-01-01 19:53:00.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
> @@ -41,10 +46,8 @@
>         /* Save the fn ptr and arg on the new stack.  */
>         stwm    %arg0,64(%arg1)
>         stw     %arg3,-60(%arg1)
> -
> -       /* Save the PIC register. */
>  #ifdef PIC
> -       stw     %r19,-32(%sr0, %sp)     /* parent */
> +       stw     %r19,-32(%arg1)         /* save PIC on child's stack */
>  #endif
>
>         /* Do the system call */
> @@ -88,6 +91,11 @@
>         bl      $$dyncall,%r31
>         copy    %r31,%rp
>
> +       /* Restore PIC register for exit() */
> +#ifdef PIC
> +       ldw     -32(%sr0, %sp), %r19    /* parent */
> +#endif
> +
>         bl      _exit,%rp
>         copy    %ret0,%arg0

Ah, I found this already and fixed it in upstream. You need to submit
this patch to debian's bts and get it applied to their fixed glibc
version.

In the upstream versrion I allocated r4 as a temporary register
instead of spilling to the stack and back.

c.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.