Andy Polyakov via RT a écrit : >>>> I see a very strange bug in crypto/sparcv9cap.c. OpenSSL 1.0.0d checks >>>> sparc capabilities with SIGILL signal. On sparc64 (both Linux and >>>> solaris, with UltraSPARC III+ and T1 CPU's), SIGILL handler is called >>>> and program terminates with SIGILL in _sparcv9_fmadd_probe: >>>> >>>> 00000001002a32d0<_sparcv9_fmadd_probe>: >>>> 1002a32d0: 81 b0 0d 80 impdep1 108, %f0, %f0, %f0 >>>> 1002a32d4: 85 b0 8d 82 impdep1 108, %f2, %f2, %f2 >>>> 1002a32d8: 81 c3 e0 08 retl >>>> 1002a32dc: 81 b8 04 40 impdep2 34, %f0, %f0, %f0<= here
Question : if sparc processor cannot execute impdep2 instruction, SIGILL is caught and program has to jump to signal handler. >>>> If I add printf() in signal handler, I see that it is called, and that >>>> siglongjmp() works. With my printf(), my program doesn't abort with >>>> SIGILL anymore but with SIGBUS (?!). >>> Could you 'truss -v sigaction,sigprocmask apps/openssl version' and >>> submit output? >> >> I cannot. My server doesn't run Solaris but Linux/sparc. I just have >> seen the same bug a long time ago on Solaris but I don't have any >> solaris server anymore. > > Then run 'strace -v apps/openssl version'. Output is attached. Regards, JKB
execve("apps/openssl", ["apps/openssl", "version"], ["NNTPSERVER=news.nerim.net", "TERM=xterm", "SHELL=/bin/bash", "XDG_SESSION_COOKIE=22b98fd860dcc"..., "SSH_CLIENT=192.168.0.4 56019 22", "SSH_TTY=/dev/pts/8", "USER=bertrand", "USERNAME=bertrand", "MAIL=/var/mail/bertrand", "PATH=/import/home/bertrand/bin:/"..., "PWD=/import/home/bertrand/gopher"..., "EDITOR=vim", "LANG=fr_FR.UTF-8", "SHLVL=1", "HOME=/import/home/bertrand", "BASH_ENV=/import/home/bertrand/."..., "LOGNAME=bertrand", "SSH_CONNECTION=192.168.0.4 56019"..., "DISPLAY=localhost:11.0", "_=/usr/bin/strace", "OLDPWD=/import/home/bertrand/gop"...]) = 0 brk(0) = 0x1f0000 uname({sysname="Linux", nodename="rayleigh", release="2.6.36.2", version="#1 SMP Sun Jan 2 11:50:13 CET 2011", machine="sparc64"}) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xf7ff0000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY) = 3 fstat64(3, {st_dev=makedev(9, 1), st_ino=208843, st_mode=S_IFREG|0644, st_nlink=1, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=296, st_size=146907, st_atime=2011/07/19-14:25:20, st_mtime=2011/07/19-14:25:18, st_ctime=2011/07/19-14:25:19}) = 0 mmap(NULL, 146907, PROT_READ, MAP_PRIVATE, 3, 0) = 0xf7f98000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/lib/sparc-linux-gnu/libdl.so.2", O_RDONLY) = 3 read(3, "\177ELF\1\2\1\0\0\0\0\0\0\0\0\0\0\3\0\22\0\0\0\1\0\0\v\340\0\0\0004"..., 512) = 512 fstat64(3, {st_dev=makedev(9, 1), st_ino=202436, st_mode=S_IFREG|0644, st_nlink=1, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=40, st_size=18316, st_atime=2011/07/19-13:30:01, st_mtime=2011/06/13-03:46:26, st_ctime=2011/06/26-13:27:57}) = 0 mmap(NULL, 82424, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xf7f80000 mprotect(0xf7f84000, 57344, PROT_NONE) = 0 mmap(0xf7f92000, 16384, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0xf7f92000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/lib/sparc-linux-gnu/libc.so.6", O_RDONLY) = 3 read(3, "\177ELF\1\2\1\0\0\0\0\0\0\0\0\0\0\3\0\22\0\0\0\1\0\2\n\240\0\0\0004"..., 512) = 512 fstat64(3, {st_dev=makedev(9, 1), st_ino=202432, st_mode=S_IFREG|0755, st_nlink=1, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=2952, st_size=1505436, st_atime=2011/07/19-13:30:01, st_mtime=2011/06/13-03:46:26, st_ctime=2011/06/26-13:27:57}) = 0 mmap(NULL, 1580552, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xf7dfc000 mprotect(0xf7f66000, 65536, PROT_NONE) = 0 mmap(0xf7f76000, 24576, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x16a000) = 0xf7f76000 mmap(0xf7f7c000, 7688, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xf7f7c000 close(3) = 0 mprotect(0xf7f76000, 8192, PROT_READ) = 0 mprotect(0xf7f92000, 8192, PROT_READ) = 0 mprotect(0xf7fec000, 8192, PROT_READ) = 0 munmap(0xf7f98000, 146907) = 0 rt_sigprocmask(SIG_SETMASK, ~[ILL TRAP EMT FPE BUS SEGV RT_0 RT_1], [], 8) = 0 rt_sigaction(SIGILL, {0x14afc0, ~[ILL TRAP EMT FPE BUS SEGV RT_0 RT_1], 0}, {SIG_DFL, [], 0}, 0xf7e34318, 4294967295) = 0 rt_sigaction(SIGBUS, {0x14afc0, ~[ILL TRAP EMT FPE BUS SEGV RT_0 RT_1], 0}, {SIG_DFL, [], 0}, 0xf7e34318, 4294967295) = 0 rt_sigprocmask(SIG_BLOCK, NULL, ~[ILL TRAP EMT FPE KILL BUS SEGV STOP RT_0 RT_1], 8) = 0 rt_sigprocmask(SIG_BLOCK, NULL, ~[ILL TRAP EMT FPE KILL BUS SEGV STOP RT_0 RT_1], 8) = 0 rt_sigprocmask(SIG_BLOCK, NULL, ~[ILL TRAP EMT FPE KILL BUS SEGV STOP RT_0 RT_1], 8) = 0 --- SIGILL (Illegal instruction) @ 0 (0) --- rt_sigprocmask(SIG_SETMASK, ~[ILL TRAP EMT FPE KILL BUS SEGV STOP RT_0 RT_1], NULL, 8) = 0 rt_sigaction(SIGBUS, {SIG_DFL, [], 0}, NULL, 0xf7e34318, 4294967295) = 0 rt_sigaction(SIGILL, {SIG_DFL, [], 0}, NULL, 0xf7e34318, 4294967295) = 0 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 brk(0) = 0x1f0000 brk(0x212000) = 0x212000 rt_sigaction(SIGPIPE, {SIG_IGN, [PIPE], SA_RESTART}, {SIG_DFL, [], 0}, 0xf7e34318, 4294967295) = 0 open("/usr/local/ssl/openssl.cnf", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory) write(2, "WARNING: can't open config file:"..., 60WARNING: can't open config file: /usr/local/ssl/openssl.cnf ) = 60 open("/proc/meminfo", O_RDONLY) = 3 fstat64(3, {st_dev=makedev(0, 3), st_ino=4026531938, st_mode=S_IFREG|0444, st_nlink=1, st_uid=0, st_gid=0, st_blksize=1024, st_blocks=0, st_size=0, st_atime=2011/07/20-10:00:40, st_mtime=2011/07/20-10:00:40, st_ctime=2011/07/20-10:00:40}) = 0 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xf7fea000 read(3, "MemTotal: 2072560 kB\nMemF"..., 1024) = 1024 close(3) = 0 munmap(0xf7fea000, 8192) = 0 rt_sigaction(SIGPIPE, {SIG_IGN, [PIPE], SA_RESTART}, {SIG_IGN, [PIPE], SA_RESTART}, 0xf7e34318, 4294967295) = 0 fstat64(1, {st_dev=makedev(9, 7), st_ino=27987282, st_mode=S_IFREG|0644, st_nlink=1, st_uid=1000, st_gid=1000, st_blksize=4096, st_blocks=16, st_size=5240, st_atime=2011/07/20-10:00:37, st_mtime=2011/07/20-10:00:41, st_ctime=2011/07/20-10:00:41}) = 0 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xf7fea000 write(1, "OpenSSL 1.0.0d 8 Feb 2011\n", 26OpenSSL 1.0.0d 8 Feb 2011 ) = 26 exit_group(0) = ?