Skip to content

Commit

Permalink
[RFC] Make string length for getTraceAsString() configurable
Browse files Browse the repository at this point in the history
Add a `zend.exception_string_param_max_len` ini setting.
(same suffix as `log_errors_max_len`)

Allow values between 0 and 1000000 bytes.
For example, with zend.exception_string_param_max_len=0,
"" would represent the empty string, and "..." would represent something
longer than the empty string.
Previously, this was hardcoded as exactly 15 bytes.

Discussion: https://externals.io/message/110717

Closes GH-5769
  • Loading branch information
TysonAndre committed Jul 25, 2020
1 parent 8664ff7 commit 07db641
Show file tree
Hide file tree
Showing 9 changed files with 108 additions and 4 deletions.
19 changes: 19 additions & 0 deletions Zend/tests/exception_024.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
--TEST--
zend.exception_string_param_max_len ini setting
--INI--
zend.exception_string_param_max_len = 23
--FILE--
<?php

function main($arg) {
throw new Exception();
}
main('123456789012345678901234567890');

?>
--EXPECTF--
Fatal error: Uncaught Exception in %s:%d
Stack trace:
#0 %s(%d): main('12345678901234567890123...')
#1 {main}
thrown in %s on line %d
41 changes: 41 additions & 0 deletions Zend/tests/exception_025.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
--TEST--
zend.exception_string_param_max_len ini setting
--FILE--
<?php

function main($arg) {
echo (new Exception()), "\n";
}
var_dump(ini_set('zend.exception_string_param_max_len', '-1'));
var_dump(ini_set('zend.exception_string_param_max_len', '1000001'));
var_dump(ini_set('zend.exception_string_param_max_len', '1000000'));
var_dump(ini_set('zend.exception_string_param_max_len', '20'));
main('short');
main('123456789012345678901234567890');
var_dump(ini_set('zend.exception_string_param_max_len', '0'));
main('short');
main('');

?>
--EXPECTF--
bool(false)
bool(false)
string(2) "15"
string(7) "1000000"
Exception in %s:%d
Stack trace:
#0 %s(10): main('short')
#1 {main}
Exception in %s:%d
Stack trace:
#0 %s(11): main('12345678901234567890...')
#1 {main}
string(2) "20"
Exception in %s:%d
Stack trace:
#0 %s(13): main('...')
#1 {main}
Exception in %s:%d
Stack trace:
#0 %s(14): main('')
#1 {main}
15 changes: 15 additions & 0 deletions Zend/zend.c
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,20 @@ static ZEND_INI_MH(OnUpdateAssertions) /* {{{ */
}
/* }}} */

static ZEND_INI_MH(OnSetExceptionStringParamMaxLen) /* {{{ */
{
zend_long i;

ZEND_ATOL(i, ZSTR_VAL(new_value));
if (i >= 0 && i <= 1000000) {
EG(exception_string_param_max_len) = i;
return SUCCESS;
} else {
return FAILURE;
}
}
/* }}} */

#if ZEND_DEBUG
# define SIGNAL_CHECK_DEFAULT "1"
#else
Expand All @@ -177,6 +191,7 @@ ZEND_INI_BEGIN()
STD_ZEND_INI_BOOLEAN("zend.signal_check", SIGNAL_CHECK_DEFAULT, ZEND_INI_SYSTEM, OnUpdateBool, check, zend_signal_globals_t, zend_signal_globals)
#endif
STD_ZEND_INI_BOOLEAN("zend.exception_ignore_args", "0", ZEND_INI_ALL, OnUpdateBool, exception_ignore_args, zend_executor_globals, executor_globals)
STD_ZEND_INI_ENTRY("zend.exception_string_param_max_len", "15", ZEND_INI_ALL, OnSetExceptionStringParamMaxLen, exception_string_param_max_len, zend_executor_globals, executor_globals)
ZEND_INI_END()

ZEND_API size_t zend_vspprintf(char **pbuf, size_t max_len, const char *format, va_list ap) /* {{{ */
Expand Down
4 changes: 2 additions & 2 deletions Zend/zend_exceptions.c
Original file line number Diff line number Diff line change
Expand Up @@ -482,8 +482,8 @@ static void _build_trace_args(zval *arg, smart_str *str) /* {{{ */
break;
case IS_STRING:
smart_str_appendc(str, '\'');
smart_str_append_escaped(str, Z_STRVAL_P(arg), MIN(Z_STRLEN_P(arg), 15));
if (Z_STRLEN_P(arg) > 15) {
smart_str_append_escaped(str, Z_STRVAL_P(arg), MIN(Z_STRLEN_P(arg), EG(exception_string_param_max_len)));
if (Z_STRLEN_P(arg) > EG(exception_string_param_max_len)) {
smart_str_appends(str, "...', ");
} else {
smart_str_appends(str, "', ");
Expand Down
1 change: 1 addition & 0 deletions Zend/zend_globals.h
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,7 @@ struct _zend_executor_globals {
HashTable weakrefs;

zend_bool exception_ignore_args;
zend_long exception_string_param_max_len;

zend_get_gc_buffer get_gc_buffer;

Expand Down
1 change: 0 additions & 1 deletion main/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,6 @@ static PHP_INI_MH(OnSetSerializePrecision)
}
/* }}} */


/* {{{ PHP_INI_MH */
static PHP_INI_MH(OnChangeMemoryLimit)
{
Expand Down
13 changes: 13 additions & 0 deletions php.ini-development
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,11 @@
; Development Value: Off
; Production Value: On

; zend.exception_string_param_max_len
; Default Value: 15
; Development Value: 15
; Production Value: 0

;;;;;;;;;;;;;;;;;;;;
; php.ini Options ;
;;;;;;;;;;;;;;;;;;;;
Expand Down Expand Up @@ -371,6 +376,14 @@ zend.enable_gc = On
; Production Value: On
zend.exception_ignore_args = Off

; Allows setting the maximum string length in an argument of a stringified stack trace
; to a value between 0 and 1000000.
; This has no effect when zend.exception_ignore_args is enabled.
; Default Value: 15
; Development Value: 15
; Production Value: 0
zend.exception_string_param_max_len = 15

;;;;;;;;;;;;;;;;;
; Miscellaneous ;
;;;;;;;;;;;;;;;;;
Expand Down
17 changes: 16 additions & 1 deletion php.ini-production
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,11 @@
; Development Value: Off
; Production Value: On

; zend.exception_string_param_max_len
; Default Value: 15
; Development Value: 15
; Production Value: 0

;;;;;;;;;;;;;;;;;;;;
; php.ini Options ;
;;;;;;;;;;;;;;;;;;;;
Expand Down Expand Up @@ -366,13 +371,23 @@ zend.enable_gc = On
;zend.script_encoding =

; Allows to include or exclude arguments from stack traces generated for exceptions
; In production, it is recommended to turn this setting on to prohibit the output
; In production, it is recommended to turn this setting on to prohibit the output
; of sensitive information in stack traces
; Default Value: Off
; Development Value: Off
; Production Value: On
zend.exception_ignore_args = On

; Allows setting the maximum string length in an argument of a stringified stack trace
; to a value between 0 and 1000000.
; This has no effect when zend.exception_ignore_args is enabled.
; Default Value: 15
; Development Value: 15
; Production Value: 0
; In production, it is recommended to set this to 0 to reduce the output
; of sensitive information in stack traces.
zend.exception_string_param_max_len = 0

;;;;;;;;;;;;;;;;;
; Miscellaneous ;
;;;;;;;;;;;;;;;;;
Expand Down
1 change: 1 addition & 0 deletions run-tests.php
Original file line number Diff line number Diff line change
Expand Up @@ -343,6 +343,7 @@ function main()
'opcache.jit_hot_side_exit=1',
'zend.assertions=1',
'zend.exception_ignore_args=0',
'zend.exception_string_param_max_len=15',
'short_open_tag=0',
);

Expand Down

2 comments on commit 07db641

@carusogabriel
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@TysonAndre I believe this needs an entry on UPGRADING.

@TysonAndre
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added in 85d4b56, based off of the UPGRADING entry for 7.4 and zend.exception_ignore_args

Please sign in to comment.