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

Reply via email to