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