[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <20021014160552.B1875@hamsec>
From: silvio at big.net.au (silvio@....net.au)
Subject: Gl1bC L1nuxThreadz ADV1SORY, was Re: bombings in bali
On Mon, Oct 14, 2002 at 05:18:06PM -0500, Ron DuFresne wrote:
>
> Of course, none of this is relevant to the full disclosure list, nor even
> unix-virus, though, being your own list you are able to pushout whatever
> you wish.
>
> This spam needs to be filtered if it persists also.
I filter everything except CNN, since its the my source of current world
events.
> Thanks,
>
> Ron DuFresne
Erm..
SORRY Pops!
--
[ for curiosity sake.. i have not forwarded this to unix-virus, only f-d ]
hopefully, i wont pump up the spam meter with this post, though i can't
garauntee it!
THREATCON at 0.3 now -->
glibc-2.1.3/linuxthreads/signals.c
int sigaction(int sig, const struct sigaction * act,
struct sigaction * oact)
{
struct sigaction newact;
struct sigaction *newactp;
if (sig == __pthread_sig_restart ||
sig == __pthread_sig_cancel ||
(sig == __pthread_sig_debug && __pthread_sig_debug > 0))
return EINVAL;
if (act)
{
newact = *act;
if (act->sa_handler != SIG_IGN && act->sa_handler != SIG_DFL
&& sig > 0 && sig < NSIG)
{
if (act->sa_flags & SA_SIGINFO)
newact.sa_handler = (__sighandler_t) pthread_sighandler_rt;
else
newact.sa_handler = (__sighandler_t) pthread_sighandler;
}
newactp = &newact;
}
^^ ok, so act gets passed directly basically..
/* The wrapper around user-provided signal handlers */
static void pthread_sighandler(int signo, SIGCONTEXT ctx)
{
pthread_descr self = thread_self();
char * in_sighandler;
/* If we're in a sigwait operation, just record the signal received
and return without calling the user's handler */
if (THREAD_GETMEM(self, p_sigwaiting)) {
THREAD_SETMEM(self, p_sigwaiting, 0);
THREAD_SETMEM(self, p_signal, signo);
return;
}
/* Record that we're in a signal handler and call the user's
handler function */
in_sighandler = THREAD_GETMEM(self, p_in_sighandler);
if (in_sighandler == NULL)
THREAD_SETMEM(self, p_in_sighandler, CURRENT_STACK_FRAME);
sighandler[signo].old(signo, SIGCONTEXT_EXTRA_ARGS ctx);
if (in_sighandler == NULL)
THREAD_SETMEM(self, p_in_sighandler, NULL);
}
But...
/* Record that we're in a signal handler and call the user's
handler function */
in_sighandler = THREAD_GETMEM(self, p_in_sighandler);
if (in_sighandler == NULL)
[ lets pause for a while because we are under heavy load.. then deliver
another signal that isnt being blocked and switch ]
THREAD_SETMEM(self, p_in_sighandler, CURRENT_STACK_FRAME);
sighandler[signo].old(signo, SIGCONTEXT_EXTRA_ARGS ctx);
if (in_sighandler == NULL)
THREAD_SETMEM(self, p_in_sighandler, NULL);
erm.. *shrug*..
glibc 2.2 aint much better..
my suggestion for making sure your code doesnt hit the above problem,
just mask off all signals for signal handling, if possible when registering
with sigaction.
yes. glibc people know about this for a while, and its not a major problem
IMO.
--
Silvio
Powered by blists - more mailing lists