2014-09-28 00:57:12 +00:00
# include "phpdbg_sigsafe.h"
# include "phpdbg.h"
ZEND_EXTERN_MODULE_GLOBALS ( phpdbg ) ;
# define STR(x) #x
# define EXP_STR(x) STR(x)
2014-10-24 17:29:50 +00:00
static void * zend_mm_mem_alloc ( zend_mm_storage * storage , size_t size , size_t alignment ) {
2014-09-28 00:57:12 +00:00
if ( EXPECTED ( size = = PHPDBG_SIGSAFE_MEM_SIZE & & ! PHPDBG_G ( sigsafe_mem ) . allocated ) ) {
PHPDBG_G ( sigsafe_mem ) . allocated = 1 ;
2014-10-24 17:29:50 +00:00
return PHPDBG_G ( sigsafe_mem ) . mem ;
2014-09-28 00:57:12 +00:00
}
write ( PHPDBG_G ( io ) [ PHPDBG_STDERR ] . fd , ZEND_STRL ( " Tried to allocate more than " EXP_STR ( PHPDBG_SIGSAFE_MEM_SIZE ) " bytes from stack memory in signal handler ... bailing out of signal handler \n " ) ) ;
if ( * EG ( bailout ) ) {
LONGJMP ( * EG ( bailout ) , FAILURE ) ;
}
write ( PHPDBG_G ( io ) [ PHPDBG_STDERR ] . fd , ZEND_STRL ( " Bailed out without a bailout address in signal handler! \n " ) ) ;
return NULL ;
}
2014-10-24 17:29:50 +00:00
static void zend_mm_mem_free ( zend_mm_storage * storage , void * ptr , size_t size ) {
2014-09-28 00:57:12 +00:00
}
2014-12-13 22:06:14 +00:00
void phpdbg_set_sigsafe_mem ( char * buffer ) {
2014-09-28 00:57:12 +00:00
phpdbg_signal_safe_mem * mem = & PHPDBG_G ( sigsafe_mem ) ;
mem - > mem = buffer ;
mem - > allocated = 0 ;
2014-10-24 17:29:50 +00:00
mem - > storage . chunk_alloc = zend_mm_mem_alloc ;
mem - > storage . chunk_free = zend_mm_mem_free ;
mem - > heap = zend_mm_startup_ex ( & mem - > storage ) ;
2014-12-13 22:06:14 +00:00
mem - > old_heap = zend_mm_set_heap ( mem - > heap ) ;
2014-09-28 00:57:12 +00:00
}
2014-12-13 22:06:14 +00:00
zend_mm_heap * phpdbg_original_heap_sigsafe_mem ( void ) {
2014-10-02 23:29:41 +00:00
return PHPDBG_G ( sigsafe_mem ) . old_heap ;
}
2014-12-13 22:06:14 +00:00
void phpdbg_clear_sigsafe_mem ( void ) {
zend_mm_set_heap ( phpdbg_original_heap_sigsafe_mem ( ) ) ;
2014-09-28 00:57:12 +00:00
PHPDBG_G ( sigsafe_mem ) . mem = NULL ;
}
2014-12-13 22:06:14 +00:00
zend_bool phpdbg_active_sigsafe_mem ( void ) {
2014-09-28 00:57:12 +00:00
return ! ! PHPDBG_G ( sigsafe_mem ) . mem ;
}