@@ -350,9 +350,14 @@ ZEND_METHOD(error_exception, getSeverity)
350
350
#define TRACE_APPEND_STR (val ) \
351
351
TRACE_APPEND_STRL(val, sizeof(val)-1)
352
352
353
- #define TRACE_APPEND_KEY (key ) \
354
- if (zend_hash_find(ht, key, sizeof(key), (void**)&tmp) == SUCCESS) { \
355
- TRACE_APPEND_STRL(Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp)); \
353
+ #define TRACE_APPEND_KEY (key ) \
354
+ if (zend_hash_find(ht, key, sizeof(key), (void**)&tmp) == SUCCESS) { \
355
+ if (Z_TYPE_PP(tmp) != IS_STRING) { \
356
+ zend_error(E_WARNING, "Value for %s is no string", key); \
357
+ TRACE_APPEND_STR("[unknown]"); \
358
+ } else { \
359
+ TRACE_APPEND_STRL(Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp)); \
360
+ } \
356
361
}
357
362
358
363
/* }}} */
@@ -461,6 +466,11 @@ static int _build_trace_string(zval **frame TSRMLS_DC, int num_args, va_list arg
461
466
HashTable * ht = Z_ARRVAL_PP (frame );
462
467
zval * * file , * * tmp ;
463
468
469
+ if (Z_TYPE_PP (frame ) != IS_ARRAY ) {
470
+ zend_error (E_WARNING , "Expected array for frame %lu" , hash_key -> h );
471
+ return ZEND_HASH_APPLY_KEEP ;
472
+ }
473
+
464
474
str = va_arg (args , char * * );
465
475
len = va_arg (args , int * );
466
476
num = va_arg (args , int * );
@@ -470,15 +480,25 @@ static int _build_trace_string(zval **frame TSRMLS_DC, int num_args, va_list arg
470
480
TRACE_APPEND_STRL (s_tmp , strlen (s_tmp ));
471
481
efree (s_tmp );
472
482
if (zend_hash_find (ht , "file" , sizeof ("file" ), (void * * )& file ) == SUCCESS ) {
473
- if (zend_hash_find (ht , "line" , sizeof ("line" ), (void * * )& tmp ) == SUCCESS ) {
474
- line = Z_LVAL_PP (tmp );
475
- } else {
476
- line = 0 ;
483
+ if (Z_TYPE_PP (file ) != IS_STRING ) {
484
+ zend_error (E_WARNING , "Function name is no string" );
485
+ TRACE_APPEND_STR ("[unknown function]" );
486
+ } else {
487
+ if (zend_hash_find (ht , "line" , sizeof ("line" ), (void * * )& tmp ) == SUCCESS ) {
488
+ if (Z_TYPE_PP (tmp ) == IS_LONG ) {
489
+ line = Z_LVAL_PP (tmp );
490
+ } else {
491
+ zend_error (E_WARNING , "Line is no long" );
492
+ line = 0 ;
493
+ }
494
+ } else {
495
+ line = 0 ;
496
+ }
497
+ s_tmp = emalloc (Z_STRLEN_PP (file ) + MAX_LENGTH_OF_LONG + 4 + 1 );
498
+ sprintf (s_tmp , "%s(%ld): " , Z_STRVAL_PP (file ), line );
499
+ TRACE_APPEND_STRL (s_tmp , strlen (s_tmp ));
500
+ efree (s_tmp );
477
501
}
478
- s_tmp = emalloc (Z_STRLEN_PP (file ) + MAX_LENGTH_OF_LONG + 4 + 1 );
479
- sprintf (s_tmp , "%s(%ld): " , Z_STRVAL_PP (file ), line );
480
- TRACE_APPEND_STRL (s_tmp , strlen (s_tmp ));
481
- efree (s_tmp );
482
502
} else {
483
503
TRACE_APPEND_STR ("[internal function]: " );
484
504
}
@@ -487,10 +507,14 @@ static int _build_trace_string(zval **frame TSRMLS_DC, int num_args, va_list arg
487
507
TRACE_APPEND_KEY ("function" );
488
508
TRACE_APPEND_CHR ('(' );
489
509
if (zend_hash_find (ht , "args" , sizeof ("args" ), (void * * )& tmp ) == SUCCESS ) {
490
- int last_len = * len ;
491
- zend_hash_apply_with_arguments (Z_ARRVAL_PP (tmp ) TSRMLS_CC , (apply_func_args_t )_build_trace_args , 2 , str , len );
492
- if (last_len != * len ) {
493
- * len -= 2 ; /* remove last ', ' */
510
+ if (Z_TYPE_PP (tmp ) == IS_ARRAY ) {
511
+ int last_len = * len ;
512
+ zend_hash_apply_with_arguments (Z_ARRVAL_PP (tmp ) TSRMLS_CC , (apply_func_args_t )_build_trace_args , 2 , str , len );
513
+ if (last_len != * len ) {
514
+ * len -= 2 ; /* remove last ', ' */
515
+ }
516
+ } else {
517
+ zend_error (E_WARNING , "args element is no array" );
494
518
}
495
519
}
496
520
TRACE_APPEND_STR (")\n" );
0 commit comments