]> granicus.if.org Git - php/commitdiff
Fix bug #74725 (html_errors=1 breaks unhandled exceptions)
authorAndrea Faulds <ajf@ajf.me>
Sat, 12 Aug 2017 00:35:27 +0000 (01:35 +0100)
committerAndrea Faulds <ajf@ajf.me>
Sat, 12 Aug 2017 00:37:20 +0000 (01:37 +0100)
NEWS
main/main.c
tests/output/bug74725.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index a1f33f209d871b34316922b2572b019d66fa62cc..5fc4f75616ef93d03980008181b62cbd9cca20b3 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -5,6 +5,7 @@ PHP                                                                        NEWS
 - Core:
   . Fixed bug #74947 (Segfault in scanner on INF number). (Laruence)
   . Fixed bug #74954 (null deref and segfault in zend_generator_resume()). (Bob)
+  . Fixed bug #74725 (html_errors=1 breaks unhandled exceptions). (Andrea)
 
 - cURL:
   . Fixed bug #74125 (Fixed finding CURL on systems with multiarch support).
index 4b145fcc709731f53d21f6e4687760e01c9a7752..81e1222796859358af88dbb39cd3b124c3d11b67 100644 (file)
@@ -722,10 +722,10 @@ PHPAPI ZEND_COLD void php_verror(const char *docref, const char *params, int typ
        buffer_len = (int)vspprintf(&buffer, 0, format, args);
 
        if (PG(html_errors)) {
-               replace_buffer = php_escape_html_entities((unsigned char*)buffer, buffer_len, 0, ENT_COMPAT, NULL);
+               replace_buffer = php_escape_html_entities((unsigned char*)buffer, buffer_len, 0, ENT_COMPAT, SG(default_charset));
                /* Retry with substituting invalid chars on fail. */
                if (!replace_buffer || ZSTR_LEN(replace_buffer) < 1) {
-                       replace_buffer = php_escape_html_entities((unsigned char*)buffer, buffer_len, 0, ENT_COMPAT | ENT_HTML_SUBSTITUTE_ERRORS, NULL);
+                       replace_buffer = php_escape_html_entities((unsigned char*)buffer, buffer_len, 0, ENT_COMPAT | ENT_HTML_SUBSTITUTE_ERRORS, SG(default_charset));
                }
 
                efree(buffer);
@@ -792,7 +792,7 @@ PHPAPI ZEND_COLD void php_verror(const char *docref, const char *params, int typ
        }
 
        if (PG(html_errors)) {
-               replace_origin = php_escape_html_entities((unsigned char*)origin, origin_len, 0, ENT_COMPAT, NULL);
+               replace_origin = php_escape_html_entities((unsigned char*)origin, origin_len, 0, ENT_COMPAT, SG(default_charset));
                efree(origin);
                origin = ZSTR_VAL(replace_origin);
        }
@@ -1106,7 +1106,7 @@ static ZEND_COLD void php_error_cb(int type, const char *error_filename, const u
 
                                if (PG(html_errors)) {
                                        if (type == E_ERROR || type == E_PARSE) {
-                                               zend_string *buf = php_escape_html_entities((unsigned char*)buffer, buffer_len, 0, ENT_COMPAT, NULL);
+                                               zend_string *buf = php_escape_html_entities((unsigned char*)buffer, buffer_len, 0, ENT_COMPAT, SG(default_charset));
                                                php_printf("%s<br />\n<b>%s</b>:  %s in <b>%s</b> on line <b>%d</b><br />\n%s", STR_PRINT(prepend_string), error_type_str, ZSTR_VAL(buf), error_filename, error_lineno, STR_PRINT(append_string));
                                                zend_string_free(buf);
                                        } else {
diff --git a/tests/output/bug74725.phpt b/tests/output/bug74725.phpt
new file mode 100644 (file)
index 0000000..fc4e98b
--- /dev/null
@@ -0,0 +1,16 @@
+--TEST--
+Bug #74725: html_errors=1 breaks unhandled exceptions
+--FILE--
+<?php
+ini_set('display_errors', 1);
+ini_set('html_errors', 1);
+ini_set('default_charset', "Windows-1251");
+throw new Exception("\xF2\xE5\xF1\xF2");
+// Note to test reader: this file is in Windows-1251 (vim: `:e ++enc=cp1251`)
+?>
+--EXPECTF--
+<br />
+<b>Fatal error</b>:  Uncaught Exception: òåñò in %s:5
+Stack trace:
+#0 {main}
+  thrown in <b>%s</b> on line <b>5</b><br />