#27990 [Opn->Fbk]: sqlite_open() crashing Apache on non sqlite databases
| From: | sniper@php.net | Date: | Wed, 14 Apr 2004 14:08:50 +0000 |
| Subject: | #27990 [Opn->Fbk]: sqlite_open() crashing Apache on non sqlite databases | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-58118@lists.php.net to get a copy of this message | ||
ID: 27990
Updated by: sniper@php.net
Reported By: csaba at alum dot mit dot edu
-Status: Open
+Status: Feedback
Bug Type: SQLite related
Operating System: Win 2K
PHP Version: 5.0.0RC1
New Comment:
Please try using this CVS snapshot:
http://snaps.php.net/php5-latest.tar.gz
For Windows:
http://snaps.php.net/win32/php5-win32-latest.zip
I think this was fixed just recently.
Previous Comments:
------------------------------------------------------------------------
[2004-04-14 07:45:06] csaba at alum dot mit dot edu
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 (!@$path) $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 this bug report at http://bugs.php.net/?id=27990&edit=1