2015-02-27 04:09:56 +00:00
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
# include <dlfcn.h>
2015-02-23 22:37:40 +00:00
# include <fcntl.h>
2015-02-15 15:52:02 +00:00
# include <unistd.h>
# include <sys/mman.h>
# include <sys/wait.h>
2015-02-23 22:37:40 +00:00
# include <sys/sendfile.h>
2015-02-15 15:52:02 +00:00
int main ( void )
{
2015-02-27 04:09:56 +00:00
const unsigned long pagesize = sysconf ( _SC_PAGESIZE ) ;
2015-02-15 15:52:02 +00:00
2015-03-02 20:04:34 -05:00
# ifdef __s390__
/*
* The si_addr field is unreliable :
* https : //marc.info/?l=linux-s390&m=142515870124248&w=2
*/
return 77 ;
# endif
2015-02-15 15:52:02 +00:00
/* write instruction pointer length to the log */
if ( write ( - 1 , NULL , 2 * sizeof ( void * ) ) > = 0 )
return 77 ;
2015-02-23 22:37:40 +00:00
2015-02-15 15:52:02 +00:00
/* just a noticeable line in the log */
2015-02-23 22:37:40 +00:00
if ( munmap ( & main , 0 ) > = 0 )
2015-02-15 15:52:02 +00:00
return 77 ;
int pid = fork ( ) ;
if ( pid < 0 )
return 77 ;
if ( ! pid ) {
2015-02-27 04:09:56 +00:00
const unsigned long mask = ~ ( pagesize - 1 ) ;
unsigned long addr = ( unsigned long ) & main & mask ;
unsigned long size = pagesize < < 1 ;
# ifdef HAVE_DLADDR
Dl_info info ;
if ( dladdr ( & main , & info ) ) {
const unsigned long base =
( unsigned long ) info . dli_fbase & mask ;
if ( base < addr ) {
size + = addr - base ;
addr = base ;
}
} else
# endif
{
addr - = size ;
size < < = 1 ;
}
2015-02-23 22:37:40 +00:00
2015-02-15 15:52:02 +00:00
/* SIGSEGV is expected */
2015-02-27 04:09:56 +00:00
( void ) munmap ( ( void * ) addr , size ) ;
( void ) munmap ( ( void * ) addr , size ) ;
2015-02-15 15:52:02 +00:00
return 77 ;
}
int status ;
if ( wait ( & status ) ! = pid | |
! WIFSIGNALED ( status ) | |
WTERMSIG ( status ) ! = SIGSEGV )
return 77 ;
2015-02-23 22:37:40 +00:00
/* dump process map for debug purposes */
close ( 0 ) ;
if ( ! open ( " /proc/self/maps " , O_RDONLY ) )
2015-02-27 04:09:56 +00:00
( void ) sendfile ( 1 , 0 , NULL , pagesize ) ;
2015-02-23 22:37:40 +00:00
2015-02-15 15:52:02 +00:00
return 0 ;
}