Full Disclosure mailing list archives

Gl1bC L1nuxThreadz ADV1SORY, was Re: bombings in bali


From: silvio () big net au
Date: Mon, 14 Oct 2002 16:05:52 -0700

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

_______________________________________________
Full-Disclosure - We believe in it.
Charter: http://lists.netsys.com/full-disclosure-charter.html


Current thread: