https://bugs.kde.org/show_bug.cgi?id=418840
Bug ID: 418840 Summary: SIG_IGN doesn't clear pending signal if SIG_IGN is already the handler Product: valgrind Version: 3.15 SVN Platform: unspecified OS: Linux Status: REPORTED Severity: normal Priority: NOR Component: general Assignee: jsew...@acm.org Reporter: plros...@gmail.com Target Milestone: --- Created attachment 126773 --> https://bugs.kde.org/attachment.cgi?id=126773&action=edit Demo program SUMMARY There is a difference between native Linux and Valgrind w.r.t. signal handling. If a signal is blocked and pending, its handler is SIG_IGN and another SIG_IGN handler is installed, Linux clears the signal but Valgrind doesn't. I don't know if there is a specified behavior, but I believe the value of the old handler should play no role. The behavior of Valgrind depends on the old handler. If the old handler is not SIG_IGN, the pending signal is cleared. I suspect the logic in the Valgrind code skips some actions if the signal handler is unchanged, but it skips the signal clearing incorrectly. STEPS TO REPRODUCE 1. Block a signal 2. Install the SIG_IGN handler 3. Raise that signal 4. Install the SIG_IGN handler again 5. Check if the signal is pending See the attached program that demonstrated the issue. OBSERVED RESULT The signal is pending The last status line of the demo program is Signal: pending, blocked, ignored EXPECTED RESULT The signal is not pending The last status line of the demo program is Signal: not pending, blocked, ignored SOFTWARE/OS VERSIONS Valgrind 3.15.0 (also today's git master branch) Ubuntu 18.04 Linux roskinp-p7510 5.3.0-40-generic #32~18.04.1-Ubuntu SMP Mon Feb 3 14:05:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux ADDITIONAL INFORMATION roskinp@roskinp-p7510:~/src/valgrind-signal$ ./signaltest Signal: not pending, unblocked, handled Blocking signal Signal: not pending, blocked, handled Ignoring signal Signal: not pending, blocked, ignored Raising signal Signal: pending, blocked, ignored Ignoring signal Signal: not pending, blocked, ignored Finished roskinp@roskinp-p7510:~/src/valgrind-signal$ /home/roskinp/valgrind/bin/valgrind -v ./signaltest ==7609== Memcheck, a memory error detector ==7609== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. ==7609== Using Valgrind-3.16.0.GIT-95df121886-20200313 and LibVEX; rerun with -h for copyright info ==7609== Command: ./signaltest ==7609== --7609-- Valgrind options: --7609-- -v --7609-- Contents of /proc/version: --7609-- Linux version 5.3.0-40-generic (buildd@lcy01-amd64-024) (gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1)) #32~18.04.1-Ubuntu SMP Mon Feb 3 14:05:59 UTC 2020 --7609-- --7609-- Arch and hwcaps: AMD64, LittleEndian, amd64-cx16-lzcnt-rdtscp-sse3-ssse3-avx-avx2-bmi-f16c-rdrand --7609-- Page sizes: currently 4096, max supported 4096 --7609-- Valgrind library directory: /home/roskinp/valgrind/lib/valgrind --7609-- Reading syms from /home/roskinp/src/valgrind-signal/signaltest --7609-- Reading syms from /lib/x86_64-linux-gnu/ld-2.27.so --7609-- Considering /lib/x86_64-linux-gnu/ld-2.27.so .. --7609-- .. CRC mismatch (computed 1b7c895e wanted 2943108a) --7609-- Considering /usr/lib/debug/lib/x86_64-linux-gnu/ld-2.27.so .. --7609-- .. CRC is valid --7609-- Reading syms from /home/roskinp/valgrind/lib/valgrind/memcheck-amd64-linux --7609-- object doesn't have a dynamic symbol table --7609-- Scheduler: using generic scheduler lock implementation. --7609-- Reading suppressions file: /home/roskinp/valgrind/lib/valgrind/default.supp ==7609== embedded gdbserver: reading from /tmp/vgdb-pipe-from-vgdb-to-7609-by-roskinp-on-??? ==7609== embedded gdbserver: writing to /tmp/vgdb-pipe-to-vgdb-from-7609-by-roskinp-on-??? ==7609== embedded gdbserver: shared mem /tmp/vgdb-pipe-shared-mem-vgdb-7609-by-roskinp-on-??? ==7609== ==7609== TO CONTROL THIS PROCESS USING vgdb (which you probably ==7609== don't want to do, unless you know exactly what you're doing, ==7609== or are doing some strange experiment): ==7609== /home/roskinp/valgrind/lib/valgrind/../../bin/vgdb --pid=7609 ...command... ==7609== ==7609== TO DEBUG THIS PROCESS USING GDB: start GDB like this ==7609== /path/to/gdb ./signaltest ==7609== and then give GDB the following command ==7609== target remote | /home/roskinp/valgrind/lib/valgrind/../../bin/vgdb --pid=7609 ==7609== --pid is optional if only one valgrind process is running ==7609== --7609-- REDIR: 0x401f2f0 (ld-linux-x86-64.so.2:strlen) redirected to 0x58119398 (vgPlain_amd64_linux_REDIR_FOR_strlen) --7609-- REDIR: 0x401f0d0 (ld-linux-x86-64.so.2:index) redirected to 0x581193b2 (vgPlain_amd64_linux_REDIR_FOR_index) --7609-- Reading syms from /home/roskinp/valgrind/lib/valgrind/vgpreload_core-amd64-linux.so --7609-- Reading syms from /home/roskinp/valgrind/lib/valgrind/vgpreload_memcheck-amd64-linux.so ==7609== WARNING: new redirection conflicts with existing -- ignoring it --7609-- old: 0x0401f2f0 (strlen ) R-> (0000.0) 0x58119398 vgPlain_amd64_linux_REDIR_FOR_strlen --7609-- new: 0x0401f2f0 (strlen ) R-> (2007.0) 0x04c33190 strlen --7609-- REDIR: 0x401d360 (ld-linux-x86-64.so.2:strcmp) redirected to 0x4c34240 (strcmp) --7609-- REDIR: 0x401f830 (ld-linux-x86-64.so.2:mempcpy) redirected to 0x4c37c40 (mempcpy) --7609-- Reading syms from /lib/x86_64-linux-gnu/libc-2.27.so --7609-- Considering /lib/x86_64-linux-gnu/libc-2.27.so .. --7609-- .. CRC mismatch (computed b1c74187 wanted 042cc048) --7609-- Considering /usr/lib/debug/lib/x86_64-linux-gnu/libc-2.27.so .. --7609-- .. CRC is valid --7609-- REDIR: 0x4edbc70 (libc.so.6:memmove) redirected to 0x4a2a740 (_vgnU_ifunc_wrapper) --7609-- REDIR: 0x4edad40 (libc.so.6:strncpy) redirected to 0x4a2a740 (_vgnU_ifunc_wrapper) --7609-- REDIR: 0x4edbf50 (libc.so.6:strcasecmp) redirected to 0x4a2a740 (_vgnU_ifunc_wrapper) --7609-- REDIR: 0x4eda790 (libc.so.6:strcat) redirected to 0x4a2a740 (_vgnU_ifunc_wrapper) --7609-- REDIR: 0x4edad70 (libc.so.6:rindex) redirected to 0x4a2a740 (_vgnU_ifunc_wrapper) --7609-- REDIR: 0x4edd7c0 (libc.so.6:rawmemchr) redirected to 0x4a2a740 (_vgnU_ifunc_wrapper) --7609-- REDIR: 0x4efa410 (libc.so.6:wmemchr) redirected to 0x4a2a740 (_vgnU_ifunc_wrapper) --7609-- REDIR: 0x4edbde0 (libc.so.6:mempcpy) redirected to 0x4a2a740 (_vgnU_ifunc_wrapper) --7609-- REDIR: 0x4edbc10 (libc.so.6:bcmp) redirected to 0x4a2a740 (_vgnU_ifunc_wrapper) --7609-- REDIR: 0x4edad00 (libc.so.6:strncmp) redirected to 0x4a2a740 (_vgnU_ifunc_wrapper) --7609-- REDIR: 0x4eda800 (libc.so.6:strcmp) redirected to 0x4a2a740 (_vgnU_ifunc_wrapper) --7609-- REDIR: 0x4edbd40 (libc.so.6:memset) redirected to 0x4a2a740 (_vgnU_ifunc_wrapper) --7609-- REDIR: 0x4ef90f0 (libc.so.6:wcschr) redirected to 0x4a2a740 (_vgnU_ifunc_wrapper) --7609-- REDIR: 0x4edaca0 (libc.so.6:strnlen) redirected to 0x4a2a740 (_vgnU_ifunc_wrapper) --7609-- REDIR: 0x4eda870 (libc.so.6:strcspn) redirected to 0x4a2a740 (_vgnU_ifunc_wrapper) --7609-- REDIR: 0x4edbfa0 (libc.so.6:strncasecmp) redirected to 0x4a2a740 (_vgnU_ifunc_wrapper) --7609-- REDIR: 0x4eda840 (libc.so.6:strcpy) redirected to 0x4a2a740 (_vgnU_ifunc_wrapper) --7609-- REDIR: 0x4edc0e0 (libc.so.6:memcpy@@GLIBC_2.14) redirected to 0x4a2a740 (_vgnU_ifunc_wrapper) --7609-- REDIR: 0x4efb6c0 (libc.so.6:wcsnlen) redirected to 0x4a2a740 (_vgnU_ifunc_wrapper) --7609-- REDIR: 0x4edada0 (libc.so.6:strpbrk) redirected to 0x4a2a740 (_vgnU_ifunc_wrapper) --7609-- REDIR: 0x4eda7c0 (libc.so.6:index) redirected to 0x4a2a740 (_vgnU_ifunc_wrapper) --7609-- REDIR: 0x4edac70 (libc.so.6:strlen) redirected to 0x4a2a740 (_vgnU_ifunc_wrapper) --7609-- REDIR: 0x4ee56c0 (libc.so.6:memrchr) redirected to 0x4a2a740 (_vgnU_ifunc_wrapper) --7609-- REDIR: 0x4edbff0 (libc.so.6:strcasecmp_l) redirected to 0x4a2a740 (_vgnU_ifunc_wrapper) --7609-- REDIR: 0x4edbbe0 (libc.so.6:memchr) redirected to 0x4a2a740 (_vgnU_ifunc_wrapper) --7609-- REDIR: 0x4ef9eb0 (libc.so.6:wcslen) redirected to 0x4a2a740 (_vgnU_ifunc_wrapper) --7609-- REDIR: 0x4edb050 (libc.so.6:strspn) redirected to 0x4a2a740 (_vgnU_ifunc_wrapper) --7609-- REDIR: 0x4edbf20 (libc.so.6:stpncpy) redirected to 0x4a2a740 (_vgnU_ifunc_wrapper) --7609-- REDIR: 0x4edbef0 (libc.so.6:stpcpy) redirected to 0x4a2a740 (_vgnU_ifunc_wrapper) --7609-- REDIR: 0x4edd7f0 (libc.so.6:strchrnul) redirected to 0x4a2a740 (_vgnU_ifunc_wrapper) --7609-- REDIR: 0x4edc040 (libc.so.6:strncasecmp_l) redirected to 0x4a2a740 (_vgnU_ifunc_wrapper) --7609-- REDIR: 0x4fcb3c0 (libc.so.6:__strrchr_avx2) redirected to 0x4c32b20 (rindex) --7609-- REDIR: 0x4fcb1d0 (libc.so.6:__strchrnul_avx2) redirected to 0x4c37770 (strchrnul) --7609-- REDIR: 0x4ed4070 (libc.so.6:malloc) redirected to 0x4c2febe (malloc) --7609-- REDIR: 0x4fcb590 (libc.so.6:__strlen_avx2) redirected to 0x4c330d0 (strlen) --7609-- REDIR: 0x4fcbab0 (libc.so.6:__mempcpy_avx_unaligned_erms) redirected to 0x4c37880 (mempcpy) Signal: not pending, unblocked, handled Blocking signal Signal: not pending, blocked, handled Ignoring signal Signal: not pending, blocked, ignored Raising signal Signal: pending, blocked, ignored Ignoring signal Signal: pending, blocked, ignored Finished --7609-- REDIR: 0x4ed4950 (libc.so.6:free) redirected to 0x4c30fb8 (free) ==7609== ==7609== HEAP SUMMARY: ==7609== in use at exit: 0 bytes in 0 blocks ==7609== total heap usage: 1 allocs, 1 frees, 1,024 bytes allocated ==7609== ==7609== All heap blocks were freed -- no leaks are possible ==7609== ==7609== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) -- You are receiving this mail because: You are watching all bug changes.