From: Nikita Popov Date: Sat, 23 Dec 2017 12:34:17 +0000 (+0100) Subject: Fixed bug #54043 X-Git-Tag: php-7.3.0alpha1~741 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=688b9136abcbfe28ca5c0fe6aae6143c4da58f73;p=php Fixed bug #54043 --- diff --git a/NEWS b/NEWS index 4a6447b89f..3757f65384 100644 --- a/NEWS +++ b/NEWS @@ -25,11 +25,13 @@ PHP NEWS (pmmaga) . Fixed bug #75677 (Clang ignores fastcall calling convention on variadic function). (Li-Wen Hsu) + . Fixed bug #54043 (Remove inconsitency of internal exceptions and user + defined exceptions). (Nikita) - BCMath: . Fixed bug #66364 (BCMath bcmul ignores scale parameter). (cmb) - . Implemented request #67855 (No way to get current scale in use). (Chris - Wright, cmb) + . Implemented request #67855 (No way to get current scale in use). (Chris + Wright, cmb) . Fixed bug #75164 (split_bc_num() is pointless). (cmb) . Fixed bug #75169 (BCMath errors/warnings bypass PHP's error handling). (cmb) diff --git a/UPGRADING b/UPGRADING index 1baa83f19a..85d74a02c5 100644 --- a/UPGRADING +++ b/UPGRADING @@ -24,6 +24,10 @@ Core: some old options removed. This is now written in PHP and has no external dependencies. . Support for BeOS has been dropped. + . Exceptions thrown due to automatic conversion of warnings into exceptions + in EH_THROW mode (e.g. some DateTime exceptions) no longer populate + error_get_last() state. As such, they now work the same way as manually + thrown exceptions. BCMath: . All warnings thrown by BCMath functions are now using PHP's error handling. diff --git a/Zend/tests/bug54043.phpt b/Zend/tests/bug54043.phpt new file mode 100644 index 0000000000..a8bbcf68cb --- /dev/null +++ b/Zend/tests/bug54043.phpt @@ -0,0 +1,20 @@ +--TEST-- +Bug #54043: Remove inconsitency of internal exceptions and user defined exceptions +--FILE-- +getMessage()); +} + +var_dump(error_get_last()); + +?> +--EXPECT-- +string(105) "DateTime::__construct(): Failed to parse time string (9999-11-33) at position 9 (3): Unexpected character" +NULL diff --git a/main/main.c b/main/main.c index 7dd65253ed..24e096b242 100644 --- a/main/main.c +++ b/main/main.c @@ -1053,27 +1053,6 @@ static ZEND_COLD void php_error_cb(int type, const char *error_filename, const u display = 1; } - /* store the error if it has changed */ - if (display) { - if (PG(last_error_message)) { - char *s = PG(last_error_message); - PG(last_error_message) = NULL; - free(s); - } - if (PG(last_error_file)) { - char *s = PG(last_error_file); - PG(last_error_file) = NULL; - free(s); - } - if (!error_filename) { - error_filename = "Unknown"; - } - PG(last_error_type) = type; - PG(last_error_message) = strdup(buffer); - PG(last_error_file) = strdup(error_filename); - PG(last_error_lineno) = error_lineno; - } - /* according to error handling mode, throw exception or show it */ if (EG(error_handling) == EH_THROW) { switch (type) { @@ -1105,6 +1084,27 @@ static ZEND_COLD void php_error_cb(int type, const char *error_filename, const u } } + /* store the error if it has changed */ + if (display) { + if (PG(last_error_message)) { + char *s = PG(last_error_message); + PG(last_error_message) = NULL; + free(s); + } + if (PG(last_error_file)) { + char *s = PG(last_error_file); + PG(last_error_file) = NULL; + free(s); + } + if (!error_filename) { + error_filename = "Unknown"; + } + PG(last_error_type) = type; + PG(last_error_message) = strdup(buffer); + PG(last_error_file) = strdup(error_filename); + PG(last_error_lineno) = error_lineno; + } + /* display/log the error if necessary */ if (display && (EG(error_reporting) & type || (type & E_CORE)) && (PG(log_errors) || PG(display_errors) || (!module_initialized))) {