On Mon, Oct 20, 2003 at 11:07:40PM +1000, Ken Foskey wrote:

> 
> If anyone is on a very fresh version of K2.6 with extra patches can you
> please run this code and see if it crashes.  It fails on all K2.6 up to
> Test6 release.  I would be interested to hear of any success.

I don't think it's related to the kernel version.

> There should be no segfault and another signal caught.
> 
> If there is any obvious blunder with this code let me know.  Looks
> pretty right to me though I don't use signals much at all.

The problem is that you never return from the signal handler. Now you're
getting a SIGSEGV during execution of the SIGSEGV handler and the signal is
probably forced to SIG_DFL, otherwise you could get an infinite signal
loop. Return from the handler instead of a longjmp and you should be ok.

/Martin

> #include <stdio.h>
> #include <signal.h>
> #include <setjmp.h>
> 
> /*************************************************************************
> |*    Typdeclarations for memory access test functions
> *************************************************************************/
> typedef int (*TestFunc)( void* );
> 
> /*************************************************************************
> *************************************************************************/
> static jmp_buf check_env;
> static int bSignal;
> static void SignalHdl( int sig )
> {
>   bSignal = 1;
>   
>   fprintf( stderr, "Signal %d caught\n", sig );
>   longjmp( check_env, sig );
> }
> 
> /*************************************************************************
> *************************************************************************/
> void check( TestFunc func, void* p )
> {
>   int result;
> 
>   fprintf( stderr, "Setting Jump\n" );
>   if ( !setjmp( check_env ) )
>   {
>       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 );
> }



-- 
"If there are no stupid questions, then what kind of questions do stupid
people ask? Do they get smart just in time to ask questions?"

       - Scott Adams

-- 
SLUG - Sydney Linux User's Group - http://slug.org.au/
More Info: http://lists.slug.org.au/listinfo/slug

Reply via email to