NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

kern/41076: sigwaitinfo and sigtimedwait don't properly set siginfo



>Number:         41076
>Category:       kern
>Synopsis:       sigwaitinfo and sigtimedwait don't properly set siginfo
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    kern-bug-people
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Wed Mar 25 23:05:00 +0000 2009
>Originator:     Matteo Beccati
>Release:        4.0 (XEN DOM0)
>Organization:
>Environment:
NetBSD epia.hq.beccati.com 4.0 NetBSD 4.0 (EPIA) #2: Sun Aug 10 00:15:28 CEST 
2008  
root%epia.hq.beccati.com@localhost:/mnt/usb/src/sys/arch/i386/compile/obj/EPIA 
i386

>Description:
As far as I could see, sigtimedwait and sigwaitinfo only set si_signo and 
si_code. According to the manual, si_pid and si_uid should be set when si_code 
== SI_USER (== 0), and si_sigval should be set when si_code == SI_TIMER (== 
-2). That doesn't seem to happen.
>How-To-Repeat:
user@epia:~$ cat sigwaitinfo.c
#include <stdio.h>
#include <signal.h>

int main(int argc, char **argv)
{
        pid_t pid = getpid();
        sigset_t mask;
        siginfo_t info;

        printf("Pid: %d\n", pid);

        sigemptyset(&mask);
        sigaddset(&mask, SIGTERM);

        sigprocmask(SIG_BLOCK, &mask, NULL);

        kill(pid, SIGTERM);

        sigwaitinfo(&mask, &info);

        printf("Signal: %d, Code: %d, Pid: %d, Uid %d\n", info.si_signo, 
info.si_code, info.si_pid, info.si_uid);

        sigaddset(&mask, SIGALRM);

        sigprocmask(SIG_BLOCK, &mask, NULL);

        alarm(2);

        sigwaitinfo(&mask, &info);

        printf("Signal: %d, Code: %d, Sigval: %d\n", info.si_signo, 
info.si_code, info.si_sigval);

        return 0;
}
user@epia:~$ gcc sigwaitinfo.c
user@epia:~$ ./a.out
Pid: 19765
Signal: 15, Code: 0, Pid: 0, Uid 0
Signal: 14, Code: -2, Sigval: 0

>Fix:



Home | Main Index | Thread Index | Old Index