Comment 10 for bug 72814

Revision history for this message
didier (did447-deactivatedaccount) wrote : Re: [Bug 72814] Re: Crash at login

Hi

On 3/9/07, Sebastien Bacher <email address hidden> wrote:
> didier, have you read the Debian bug? why do you say that's a liboild
> bug? do you have a code change to fix it, in which case could you attach
> it to launchpad?
Yes I did read it and I have a G3 around too :)

From man setjmp page:

      POSIX does not specify whether setjmp() will save the signal
context. (In System V it will not. In 4.3BSD it will, and there is
a function _setjmp that will not.) If you want to save signal masks,
use sigsetjmp().

From man signal

       According to POSIX, the behaviour of a process is undefined
after it ignores a SIGFPE, SIGILL, or SIGSEGV signal that was
not generated by the kill(2) or the raise(3) functions.

output of strace -f gnome-sound-properties without a ~/.gstreamer-0.10
directory.
...
32021 open("/usr/lib/liboil-0.3.so.0", O_RDONLY) = 5
32021 rt_sigaction(SIGILL, {0xe0a3120, [], 0}, {SIG_DFL}, 8) = 0
...
32021 --- SIGILL (Illegal instruction) @ 0 (0) ---
32021 rt_sigaction(SIGILL, {SIG_DFL}, NULL, 8) = 0
32021 rt_sigaction(SIGILL, {0xe0a3120, [], 0}, {SIG_DFL}, 8) = 0
32021 rt_sigaction(SIGILL, {SIG_DFL}, NULL, 8) = 0
32021 rt_sigaction(SIGSEGV, {SIG_DFL}, NULL, 8) = 0
...
32021 open("/usr/lib/libvisual-0.4.so.0", O_RDONLY) = 5
....
32021 rt_sigaction(SIGILL, {0xe03b884, [ILL], SA_RESTART}, {SIG_DFL}, 8) = 0
                      SIGILL is now blocked...
32021 rt_sigprocmask(SIG_BLOCK, NULL, [ILL], 8) = 0
32021 --- SIGILL (Illegal instruction) @ 0 (0) ---
                 undefined behaviour...
32020 <... read resumed> "", 1) = 0
32020 --- SIGCHLD (Child exited) @ 0 (0) ---
32020 close(3) = 0

with the soon to be attached patch
4258 open("/usr/lib/liboil-0.3.so.0", O_RDONLY) = 5
4258 rt_sigaction(SIGILL, {0xe07f120, [], 0}, {SIG_DFL}, 8) = 0
4258 rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
4258 --- SIGILL (Illegal instruction) @ 0 (0) ---
4258 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
4258 rt_sigaction(SIGILL, {SIG_DFL}, NULL, 8) = 0
4258 rt_sigaction(SIGILL, {0xe07f120, [], 0}, {SIG_DFL}, 8) = 0
4258 rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
(*) 4258 rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
...
4258 rt_sigaction(SIGILL, {SIG_DFL}, NULL, 8) = 0
4258 rt_sigaction(SIGSEGV, {SIG_DFL}, NULL, 8) = 0
...
4258 open("/usr/lib/libvisual-0.4.so.0", O_RDONLY) = 5
...
4258 rt_sigaction(SIGILL, {0xdfdfd30, [ILL], SA_RESTART}, {SIG_DFL}, 8) = 0
4258 rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
4258 --- SIGILL (Illegal instruction) @ 0 (0) ---
4258 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
4258 rt_sigaction(SIGILL, {SIG_DFL}, {0xdfdfd30, [ILL], SA_RESTART}, 8) = 0
....

Notes:
- (*) got a lot of them maybe a glibc bug.
- libs should save,block SIGILL before using them and reset after.