mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Ken Foskey <foskey@optushome.com.au>
To: linux-kernel@vger.kernel.org
Subject: Re: K 2.6 test6 strange signal behaviour
Date: Tue, 21 Oct 2003 11:56:10 +1000	[thread overview]
Message-ID: <1066701370.1079.13.camel@gandalf.foskey.org> (raw)
In-Reply-To: <20031020132805.5e5a59f1.akpm@osdl.org>

On Tue, 2003-10-21 at 06:28, Andrew Morton wrote:
> Ken Foskey <foskey@optushome.com.au> wrote:
> >
> > I have a problem with signals.
> 
> You should be using sigsetjmp(), not setjmp().

No difference.  Note that this is K 2.6 specific, it "works" in K 2.4.

I am reading on sigaction now, I will recode with SA_RESTART tonight.  
I think this is not the solution because I am explicitly setting the
signal handler before every call.  I think this simply leaves the signal
handler active ie old BSD style.

I also received this comment:

> Unblock the signal handler before you raise the signal again.

I think this means sigprocmask with UNBLOCK.  "Should" this be
required.  After reading and Andrews comments I added a reset and
siglongjmp here is my current handler:

static void SignalHdl( int sig )
{
  bSignal = 1;
  
  fprintf( stderr, "Signal %d caught\n", sig );
  signal( sig, SIG_DFL );  /* reset handler back */
  siglongjmp( check_env, sig );  /* return to code */
}

I do have a work around, I am pursuing this because the signal handler
is behaving differently in K 2.6 than K 2.4.  The error may be mine
however it may also be a bug with the kernel.

-- 
Thanks
KenF
OpenOffice.org developer

Current code:

#include <stdio.h>
#include <signal.h>
#include <setjmp.h>

/*************************************************************************
|*	Typdeclarations for memory access test functions
*************************************************************************/
typedef int (*TestFunc)( void* );

/*************************************************************************
*************************************************************************/
static sigjmp_buf check_env;
static int bSignal;
static void SignalHdl( int sig )
{
  bSignal = 1;
  
  fprintf( stderr, "Signal %d caught\n", sig );
  signal( sig, SIG_DFL );
  siglongjmp( check_env, sig );
}

/*************************************************************************
*************************************************************************/
void check( TestFunc func, void* p )
{
  int result;

  fprintf( stderr, "Setting Jump\n" );
  if ( !sigsetjmp( check_env, 0 ) )
  {
	signal( SIGSEGV,	SignalHdl );
	signal( SIGBUS,		SignalHdl );
    fprintf( stderr, "Running \n" );
	result = func( p );
    fprintf( stderr, "Finished \n" );
	signal( SIGSEGV,	SIG_DFL );
	signal( SIGBUS,		SIG_DFL );
  }
  fprintf( stderr, "After jump \n" );
}

/*************************************************************************
*************************************************************************/
static int GetAtAddress( void* p )
{
  return *((char*)p);
}

/*************************************************************************
*************************************************************************/
static int SetAtAddress( void* p )
{
  return *((char*)p)	= 0;
}

/*************************************************************************
*************************************************************************/
void CheckGetAccess( void* p )
{
  check( (TestFunc)GetAtAddress, p );
}
/*************************************************************************
*************************************************************************/
void CheckSetAccess( void* p )
{
  check( (TestFunc)SetAtAddress, p );
}

/*************************************************************************
*************************************************************************/
int main( int argc, char* argv[] )
{
  {
	char* p = NULL;
	fprintf( stderr, "Getting from NULL\n" );
    CheckGetAccess( p );
	fprintf( stderr, "Setting to NULL\n" );
    CheckSetAccess( p );
	fprintf( stderr, "After Setting to NULL\n" );
  }

  exit( 0 );
}



  reply	other threads:[~2003-10-21  1:56 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-10-20 13:01 Ken Foskey
2003-10-20 13:48 ` Richard B. Johnson
2003-10-20 19:26   ` Ken Foskey
2003-10-20 20:38     ` Richard B. Johnson
2003-10-20 20:28 ` Andrew Morton
2003-10-21  1:56   ` Ken Foskey [this message]
2003-11-05  8:11     ` Alex Riesen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1066701370.1079.13.camel@gandalf.foskey.org \
    --to=foskey@optushome.com.au \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®