]> granicus.if.org Git - php/commitdiff
Fixed bug #71273 A wrong ext directory setup in php.ini leads to crash
authorAnatol Belski <ab@php.net>
Tue, 5 Jan 2016 17:53:04 +0000 (18:53 +0100)
committerAnatol Belski <ab@php.net>
Tue, 5 Jan 2016 17:54:46 +0000 (18:54 +0100)
main/main.c
tests/basic/bug71273.phpt [new file with mode: 0644]

index dfba949351ced0e1a18e139e155b3cf4c80a8395..bc978d9ae311b1f67f8792af264f40fef1c73aab 100644 (file)
@@ -723,9 +723,20 @@ PHPAPI ZEND_COLD void php_verror(const char *docref, const char *params, int typ
 
        if (PG(html_errors)) {
                replace_buffer = php_escape_html_entities((unsigned char*)buffer, buffer_len, 0, ENT_COMPAT, NULL);
+               /* Retry with substituting invalid chars on fail. */
+               if (!replace_buffer) {
+                       replace_buffer = php_escape_html_entities((unsigned char*)buffer, buffer_len, 0, ENT_COMPAT | ENT_HTML_SUBSTITUTE_ERRORS, NULL);
+               }
+
                efree(buffer);
-               buffer = ZSTR_VAL(replace_buffer);
-               buffer_len = (int)ZSTR_LEN(replace_buffer);
+
+               if (replace_buffer) {
+                       buffer = ZSTR_VAL(replace_buffer);
+                       buffer_len = (int)ZSTR_LEN(replace_buffer);
+               } else {
+                       buffer = "";
+                       buffer_len = 0;
+               }
        }
 
        /* which function caused the problem if any at all */
@@ -878,7 +889,9 @@ PHPAPI ZEND_COLD void php_verror(const char *docref, const char *params, int typ
        if (replace_buffer) {
                zend_string_free(replace_buffer);
        } else {
-               efree(buffer);
+               if (buffer_len > 0) {
+                       efree(buffer);
+               }
        }
 
        php_error(type, "%s", message);
diff --git a/tests/basic/bug71273.phpt b/tests/basic/bug71273.phpt
new file mode 100644 (file)
index 0000000..d0cd725
--- /dev/null
@@ -0,0 +1,21 @@
+--TEST--
+Bug #71273 A wrong ext directory setup in php.ini leads to crash
+--SKIPIF--
+<?php
+       if ("cli" != php_sapi_name()) {
+               die("skip CLI only");
+       }
+?>
+--FILE--
+<?php
+       /* NOTE this file is required to be encoded in iso-8859-1 */
+
+       $cmd = getenv('TEST_PHP_EXECUTABLE') . " -n -d html_errors=on -d extension_dir=a/é/w -d extension=php_kartoffelbrei.dll -v 2>&1";
+       $out = shell_exec($cmd);
+
+       var_dump(preg_match(",.+a[\\/].+[\\/]w.php_kartoffelbrei.dll.+,s", $out));
+?>
+==DONE==
+--EXPECTF--
+int(1)
+==DONE==