misc/141956: siginfo->si_pid null in signal handler

BERTRAND Joël joel.bertrand at systella.fr
Thu Dec 24 16:20:03 UTC 2009


>Number:         141956
>Category:       misc
>Synopsis:       siginfo->si_pid null in signal handler
>Confidential:   no
>Severity:       serious
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Thu Dec 24 16:20:02 UTC 2009
>Closed-Date:
>Last-Modified:
>Originator:     BERTRAND Joël
>Release:        8.0-STABLE
>Organization:
>Environment:
FreeBSD gauss.systella.fr 8.0-STABLE FreeBSD 8.0-STABLE #1: Mon Dec  7 15:46:01 CET 2009     root at gauss.systella.fr:/usr/obj/usr/src/sys/CUSTOM  i386

>Description:
RPL/2 (http://www.rpl2.net) enters in deadlock when I try to quit application with ABORT intrinsic. I have written some test code and I find that the following code

void
interruption5(int signal, siginfo_t *siginfo, void *context)
{
    pthread_t               thread;
    struct_processus        *s_etat_processus;

    verrouillage_gestionnaire_signaux();

    uprintf("<1> %d %d\n", (*siginfo).si_pid, getpid());
    // uprintf is a macro defined by fprintf(stderr, ...)
    exit(0);
    ...
} // from src/interruptions.c

prints :

gauss:[~/rpl/build/src] > ./rpl -is
+++RPL/2 (R) version 4.0.8 (Thursday 12/24/09, 16:54:22 CET)
+++Copyright (C) 1989 à 2008, 2009 BERTRAND Joël

+++Ce logiciel est un logiciel libre sans aucune garantie de fonctionnement.
+++Pour plus de détails, utilisez la commande 'warranty'.

RPL/2> abort
<1> 0 32877
gauss:[~/rpl/build/src] > 

In this case, I have to see :
<1> 32877 32877
because calling process is in my case 32877 and cannot be null. RPL/2 uses this value to send a signal to a specified thread. As this value is always null, signal cannot be processed.

Of course, signal handler specification is :

        action.sa_sigaction = interruption5;
        action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO;
        // from src/rpl.c

thus siginfo->si_pid has to be filled.
>How-To-Repeat:
Build RPL/2 and try to quit application with ABORT. The same program worked fine with FreeBSD 7.x (and with NetBSD, Linux, Solaris...).
>Fix:


>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list