ID: 30772 User updated by: pecoes at web dot de Reported By: pecoes at web dot de Status: Analyzed Bug Type: Zend Engine 2 problem Operating System: irrelevant PHP Version: 5.0.2, 5.1 Assigned To: andi New Comment:
Hi Tony, You haven't read my entire post. I've given *two* code samples. The *second* is the reproduce code. Please note, that my reproduce code is actually simpler, than what you have "reduced" it to. My laymen's guess is that php_check_syntax doesn't add a script that has proven to be faulty to the list require_once and include_once maintain. The reasoning behind that is superficially seen sound. Why would you want to try again to include code that has already proven to be bad? Well, that's why I featured the "real life" sample prior to the actual reproduce code. There's a scenario, where it's impossible to avoid a new inclusion attempt, since class_exists *will* call __autoload if the class doesn't exist. Peter Previous Comments: ------------------------------------------------------------------------ [2004-11-16 09:16:25] [EMAIL PROTECTED] Reproducible both with 5.0 & 5.1 branches. Program received signal SIGSEGV, Segmentation fault. 0x00000006 in ?? () (gdb) bt #0 0x00000006 in ?? () #1 0x00000000 in ?? () #2 0xbfffbf30 in ?? () #3 0xbfffbf68 in ?? () #4 0xbfffbeec in ?? () #5 0x00000001 in ?? () #6 0x08226ebb in yy_chk () #7 0xbfffbf68 in ?? () #8 0x08188964 in zif_class_exists (ht=-1073758484, return_value=0x1, this_ptr=0x8226ebb, return_value_used=-1073758360) at /home/dev/php-src/Zend/zend_builtin_functions.c:907 Previous frame inner to this frame (corrupt stack?) Reproduce code could be safely reduced to this: <? function __autoload ($class) { require_once "$class.php"; } php_check_syntax("Test.php"); class_exists("Test"); ?> ------------------------------------------------------------------------ [2004-11-13 10:24:20] pecoes at web dot de Description: ------------ The reproduce code is pretty straight-forward, which makes the issue look easy to avoid. My real problem, however, is more subtle: I'm writing an extensible library. All my internal classes are __autoload'ed, but I want to treat all user-defined classes as tainted and load them manually: Test.php: <?php class Tets {} // Note the typo! ?> bug.php: <?php function __autoload ($class) { require_once "$class.php"; } function loadManually ($class) { if (!php_check_syntax("$class.php")) { throw new Exception("$class.php cannot be included"); } // class_exists invokes __autoload and things go wrong if (!class_exists($class)) { throw new Exception("$class does not exist in $class.php"); } } loadManually("Test"); ?> Reproduce code: --------------- $file = "Test.php"; if (!php_check_syntax($file)) { die("$file cannot be included"); } // the following line should do nothing! require_once $file; Expected result: ---------------- no crash Actual result: -------------- "Fatal Error: Cannot redeclare class..." and then php(cli) crashes hard! ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=30772&edit=1