]> granicus.if.org Git - php/commitdiff
fix #51394 - try harder to find script lineno when exception happens
authorStanislav Malyshev <stas@php.net>
Thu, 1 Apr 2010 19:36:56 +0000 (19:36 +0000)
committerStanislav Malyshev <stas@php.net>
Thu, 1 Apr 2010 19:36:56 +0000 (19:36 +0000)
NEWS
Zend/tests/bug51394.phpt [new file with mode: 0644]
Zend/zend_execute_API.c

diff --git a/NEWS b/NEWS
index 014d3d3ad6aa6070d6c960cc1aecc51f8a88592d..513489aded1df7bb8d302000e9df599f0b4931d3 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -11,6 +11,8 @@ PHP                                                                        NEWS
 - Fixed a NULL pointer dereference when processing invalid XML-RPC
   requests (Fixes CVE-2010-0397, bug #51288). (Raphael Geissert)
 
+- Fixed bug #51394 (Error line reported incorrectly if error handler throws an 
+  exception). (Stas)
 - Fixed bug #51393 (DateTime::createFromFormat() fails if format string contains
   timezone). (Adam)
 - Fixed bug #51347 (mysqli_close / connection memory leak). (Andrey, Johannes)
diff --git a/Zend/tests/bug51394.phpt b/Zend/tests/bug51394.phpt
new file mode 100644 (file)
index 0000000..537574c
--- /dev/null
@@ -0,0 +1,16 @@
+--TEST--
+Bug #51394 (Error line reported incorrectly if error handler throws an exception)
+--INI--
+error_reporting=-1
+--FILE--
+<?php
+function eh()
+{
+       throw new Exception("error!");
+       return false;
+}
+
+set_error_handler("eh");
+$a = $empty($b);
+--EXPECTF--
+Fatal error: Function name must be a string in %sbug51394.php on line 9
\ No newline at end of file
index 55d0ab72cad6642dd69254d6b108a29be873e72a..1865b6cbf92b96f105903e5850cb0579d52feadd 100644 (file)
@@ -411,6 +411,10 @@ ZEND_API char *zend_get_executed_filename(TSRMLS_D) /* {{{ */
 
 ZEND_API uint zend_get_executed_lineno(TSRMLS_D) /* {{{ */
 {
+       if(EG(exception) && EG(opline_ptr) && active_opline->opcode == ZEND_HANDLE_EXCEPTION && 
+               active_opline->lineno == 0 && EG(opline_before_exception)) {
+               return EG(opline_before_exception)->lineno;
+       }
        if (EG(opline_ptr)) {
                return active_opline->lineno;
        } else {