lkml.org 
[lkml]   [1998]   [Nov]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    SubjectAn exec and signal bug
    Date
    Hi, Linus,

    This is an exec/signal bug discovered by the POSIX test. On linux,
    I got

    # gcc test.c
    # a.out
    zsh: 21000 abort ./a.out

    On Solaris and HP-UX, I got

    # gcc test.c
    # a.out
    PASS

    Thanks.


    --
    H.J. Lu (hjl@gnu.org)
    ---
    #include <unistd.h>
    #include <signal.h>
    #include <errno.h>
    #include <stdlib.h>
    #include <stdio.h>

    static int sig_recvd = 0;

    static
    void
    sig_catch (int sg_num)
    {
    sig_recvd = sg_num;
    }

    static
    int
    sig_init (int signum, sigset_t *sigmask, void (*sigfunc)(),
    int sigflags)
    {
    struct sigaction act;
    act.sa_flags = sigflags;
    act.sa_mask = *sigmask;
    act.sa_handler = sigfunc;
    return(sigaction(signum, &act, (struct sigaction *)NULL));
    }

    static
    void
    parent (const char *prog)
    {
    sigset_t set;

    sigemptyset(&set);
    if (sig_init (SIGHUP, &set, sig_catch, 0) < 0)
    {
    perror ("parent sigaction");
    exit (1);
    }

    sigemptyset(&set);
    sigaddset(&set, SIGHUP);
    if(sigprocmask(SIG_SETMASK, &set, (sigset_t *)NULL) != 0)
    {
    perror ("sigprocmask");
    exit (1);
    }

    if (kill(getpid (), SIGHUP) < 0)
    {
    perror ("kill");
    exit (1);
    }

    if (sig_recvd)
    {
    printf ("sigprocmask() did not block signal\n");
    exit (2);
    }

    if (execl (prog, prog, "1", NULL))
    {
    perror ("execl");
    exit (1);
    }

    exit (1);
    }

    static
    void
    child ()
    {
    sigset_t set;

    sigemptyset(&set);
    if (sig_init (SIGHUP, &set, sig_catch, 0) < 0)
    {
    perror ("child sigaction");
    exit (1);
    }

    sigemptyset(&set);
    sigaddset(&set, SIGHUP);
    if(sigprocmask(SIG_UNBLOCK, &set, (sigset_t *)NULL) != 0)
    {
    perror ("sigprocmask");
    exit (1);
    }

    if (sig_recvd == SIGHUP)
    {
    printf ("PASS\n");
    exit (0);
    }
    else
    abort ();
    }

    int
    main (int argc, char **argv)
    {
    if (argc > 1)
    child ();
    else
    parent (argv [0]);
    }

    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.rutgers.edu
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2005-03-22 13:45    [W:0.027 / U:89.080 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site