@@ -337,9 +337,14 @@ ZEND_METHOD(error_exception, getSeverity)
337
337
#define TRACE_APPEND_STR (val ) \
338
338
TRACE_APPEND_STRL(val, sizeof(val)-1)
339
339
340
- #define TRACE_APPEND_KEY (key ) \
341
- if (zend_hash_find(ht, key, sizeof(key), (void**)&tmp) == SUCCESS) { \
342
- TRACE_APPEND_STRL(Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp)); \
340
+ #define TRACE_APPEND_KEY (key ) \
341
+ if (zend_hash_find(ht, key, sizeof(key), (void**)&tmp) == SUCCESS) { \
342
+ if (Z_TYPE_PP(tmp) != IS_STRING) { \
343
+ zend_error(E_WARNING, "Value for %s is no string", key); \
344
+ TRACE_APPEND_STR("[unknown]"); \
345
+ } else { \
346
+ TRACE_APPEND_STRL(Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp)); \
347
+ } \
343
348
}
344
349
345
350
/* }}} */
@@ -448,6 +453,11 @@ static int _build_trace_string(zval **frame TSRMLS_DC, int num_args, va_list arg
448
453
HashTable * ht = Z_ARRVAL_PP (frame );
449
454
zval * * file , * * tmp ;
450
455
456
+ if (Z_TYPE_PP (frame ) != IS_ARRAY ) {
457
+ zend_error (E_WARNING , "Expected array for frame %lu" , hash_key -> h );
458
+ return ZEND_HASH_APPLY_KEEP ;
459
+ }
460
+
451
461
str = va_arg (args , char * * );
452
462
len = va_arg (args , int * );
453
463
num = va_arg (args , int * );
@@ -457,15 +467,25 @@ static int _build_trace_string(zval **frame TSRMLS_DC, int num_args, va_list arg
457
467
TRACE_APPEND_STRL (s_tmp , strlen (s_tmp ));
458
468
efree (s_tmp );
459
469
if (zend_hash_find (ht , "file" , sizeof ("file" ), (void * * )& file ) == SUCCESS ) {
460
- if (zend_hash_find (ht , "line" , sizeof ("line" ), (void * * )& tmp ) == SUCCESS ) {
461
- line = Z_LVAL_PP (tmp );
462
- } else {
463
- line = 0 ;
470
+ if (Z_TYPE_PP (file ) != IS_STRING ) {
471
+ zend_error (E_WARNING , "Function name is no string" );
472
+ TRACE_APPEND_STR ("[unknown function]" );
473
+ } else {
474
+ if (zend_hash_find (ht , "line" , sizeof ("line" ), (void * * )& tmp ) == SUCCESS ) {
475
+ if (Z_TYPE_PP (tmp ) == IS_LONG ) {
476
+ line = Z_LVAL_PP (tmp );
477
+ } else {
478
+ zend_error (E_WARNING , "Line is no long" );
479
+ line = 0 ;
480
+ }
481
+ } else {
482
+ line = 0 ;
483
+ }
484
+ s_tmp = emalloc (Z_STRLEN_PP (file ) + MAX_LENGTH_OF_LONG + 4 + 1 );
485
+ sprintf (s_tmp , "%s(%ld): " , Z_STRVAL_PP (file ), line );
486
+ TRACE_APPEND_STRL (s_tmp , strlen (s_tmp ));
487
+ efree (s_tmp );
464
488
}
465
- s_tmp = emalloc (Z_STRLEN_PP (file ) + MAX_LENGTH_OF_LONG + 4 + 1 );
466
- sprintf (s_tmp , "%s(%ld): " , Z_STRVAL_PP (file ), line );
467
- TRACE_APPEND_STRL (s_tmp , strlen (s_tmp ));
468
- efree (s_tmp );
469
489
} else {
470
490
TRACE_APPEND_STR ("[internal function]: " );
471
491
}
@@ -474,10 +494,14 @@ static int _build_trace_string(zval **frame TSRMLS_DC, int num_args, va_list arg
474
494
TRACE_APPEND_KEY ("function" );
475
495
TRACE_APPEND_CHR ('(' );
476
496
if (zend_hash_find (ht , "args" , sizeof ("args" ), (void * * )& tmp ) == SUCCESS ) {
477
- int last_len = * len ;
478
- zend_hash_apply_with_arguments (Z_ARRVAL_PP (tmp ) TSRMLS_CC , (apply_func_args_t )_build_trace_args , 2 , str , len );
479
- if (last_len != * len ) {
480
- * len -= 2 ; /* remove last ', ' */
497
+ if (Z_TYPE_PP (tmp ) == IS_ARRAY ) {
498
+ int last_len = * len ;
499
+ zend_hash_apply_with_arguments (Z_ARRVAL_PP (tmp ) TSRMLS_CC , (apply_func_args_t )_build_trace_args , 2 , str , len );
500
+ if (last_len != * len ) {
501
+ * len -= 2 ; /* remove last ', ' */
502
+ }
503
+ } else {
504
+ zend_error (E_WARNING , "args element is no array" );
481
505
}
482
506
}
483
507
TRACE_APPEND_STR (")\n" );
0 commit comments