Skip to content

[RFC] Make string length for getTraceAsString() configurable #5769

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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