From:             csaba at alum dot mit dot edu
Operating system: Win 2K
PHP version:      5.0.0RC1
PHP Bug Type:     SQLite related
Bug description:  sqlite_open crashing Apache on non sqlite databases

Description:
------------
I want to get a list of all SQLite databases under my root directory so I
figured I'd get a list of all the files, open each one using sqlite_open,
and assume those that didn't result in warnings/errors were keepers.



sqlite_open is extremely unhappy about this and apache 2.0.48 dies.

Reproduce code:
---------------
$root = "c:\\Your\\Path\\Here";



$aFiles = dirList($root, 2, 1);

for ($i=sizeof($aFiles);$i--;) {

    if (!($db=sqlite_open($aFiles[$i],0666,$sqliteerror))) unset
($aFiles[$i]);

    else {

        if (!sqlite_array_query($db,"SELECT * FROM sqlite_master;",
SQLITE_ASSOC))

            unset ($aFiles[$i]);

        sqlite_close($db);

    }

}

var_dump ($aFiles);



function dirList($path=NULL, $types=2, $levels=1) {

//  returns an array of the specified files/directories

//  Note that directories are prefixed with a '*'

//      This can be eliminated from the line above the return

//  $path defaults to the current working directory

//  $types:  2 => files; 1 => directories; 3 => both;

//  $levels: 1 => look in the $path only; 2 => $path and all children;

//           3 => $path, children, grandchildren; 0 => $path and all
descendants;

//           less than 0 => complement of -$levels: everything starting
-$levels down

//                e.g. -1 => everthing except $path; -2 => all descendants
except $path + children



    $pathSep = strstr(PHP_OS, "WIN") ? "\\" : "/";

    if ([EMAIL PROTECTED]) $path = getcwd();

    $aRes = array();        // result

    $aAcc=array();          // accumulate

    $aDir = array(realpath($path));

    for ($i=$levels>0?$levels++:-1;$i--&&$aDir;$aDir=$aAcc,$aAcc=array())

        while ($dir = array_shift($aDir))

            foreach (scandir ($dir) as $fileOrDir)

                if ($fileOrDir!="." && $fileOrDir!="..") {

                    if ($isDir = is_dir ($rp="$dir$pathSep$fileOrDir"))
$aAcc[] = $rp;

                    if ($i<$levels-1 && ($types & (2-$isDir))) $aRes[] =
($isDir?"*":"") . $rp; }

    return $aRes;

}



Expected result:
----------------
I expect to get a list of sqlite database files.  I expect to be able to
use @sqlite_open and have it fail gracefully (silently) without taking PHP
and Apache with it.



Actual result:
--------------
The above variant on my system with three files in the directory
(dbFile.db, index.php, index.php~) produced two warnings:



Warning: sqlite_open() [function.sqlite-open]: database disk image is
malformed in .../test.php on sqlite_open line

and showed the dbFile.db as OK



Every other variant crashes apache, such as doing a print of $aFiles[$i]
within the else, or inserting ' || $sqliteerror' as the second half of the
first if, or putting an '@' in front of sqlite_open.



Thanks,

Csaba Gabor

-- 
Edit bug report at http://bugs.php.net/?id=27990&edit=1
-- 
Try a CVS snapshot (php4):  http://bugs.php.net/fix.php?id=27990&r=trysnapshot4
Try a CVS snapshot (php5):  http://bugs.php.net/fix.php?id=27990&r=trysnapshot5
Fixed in CVS:               http://bugs.php.net/fix.php?id=27990&r=fixedcvs
Fixed in release:           http://bugs.php.net/fix.php?id=27990&r=alreadyfixed
Need backtrace:             http://bugs.php.net/fix.php?id=27990&r=needtrace
Need Reproduce Script:      http://bugs.php.net/fix.php?id=27990&r=needscript
Try newer version:          http://bugs.php.net/fix.php?id=27990&r=oldversion
Not developer issue:        http://bugs.php.net/fix.php?id=27990&r=support
Expected behavior:          http://bugs.php.net/fix.php?id=27990&r=notwrong
Not enough info:            http://bugs.php.net/fix.php?id=27990&r=notenoughinfo
Submitted twice:            http://bugs.php.net/fix.php?id=27990&r=submittedtwice
register_globals:           http://bugs.php.net/fix.php?id=27990&r=globals
PHP 3 support discontinued: http://bugs.php.net/fix.php?id=27990&r=php3
Daylight Savings:           http://bugs.php.net/fix.php?id=27990&r=dst
IIS Stability:              http://bugs.php.net/fix.php?id=27990&r=isapi
Install GNU Sed:            http://bugs.php.net/fix.php?id=27990&r=gnused
Floating point limitations: http://bugs.php.net/fix.php?id=27990&r=float

Reply via email to