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    [from the cache]
©2003-2011 Jasper Spaans