[uClibc-cvs] cvs commit to uClibc/libc/sysdeps/linux/i386 by andersen

cvs at uclinux.org cvs at uclinux.org
Fri Oct 5 11:31:49 UTC 2001


Repository: uClibc/libc/sysdeps/linux/i386
who:        andersen
time:       Fri Oct  5 07:31:48 EDT 2001


Log Message:

Wohoo!  David McCullough found the bug!  His comments follow:

    I had a look at it and you won't believe it was always broken.

    I'll try and explain it,  let me know if it doesn't make sense.

    * ash calls setjmp,  which messes with the stack to look like it has
      two args instead of one and then jmps (actually falls) into
    sigsetjmp.

      BUG

    * sigsetjmp then saves the registers and "jumps" to __sigset_save,  a C
      function.

    BUG1 - because the caller pops its args off the stack,  a program that
	   changes it's number of args is broken because the caller will
    not
	       pop the correct number of args.

    I think that jumping from the sigsetjmp asm to the 'C' code is unsafe
    but I can't think of an example.  Anyway,  I have attached what I think
    is
    a working fix.

    The reason this worked without -fomit-frame-pointer is that the
    _sigset_save 'C' code would restore the stack pointer from %ebp (the
    frame
    pointer) and because none of the asm had moded it,  when we returned
    from
    __sigset_save the stack was back to it's correct position for 1
    argument
    despite our best attempts to stuff it up ;-)



Files:

changed:    setjmp.S






More information about the uClibc-cvs mailing list