ID:               38759
 User updated by:  jcd+php at psu dot edu
 Reported By:      jcd+php at psu dot edu
 Status:           Closed
 Bug Type:         SQLite related
 Operating System: Solaris 9 / Ubuntu Linux 6.06
 PHP Version:      5.1.6
 New Comment:

Thanks for committing this.  

It did seem pretty murky if this was more an SQLite or PHP issue due to
the language used for sqlite_step() in the version 2 API docs on
http://sqlite.org/c_interface.html, section 2.2.  Though, I agree
functions should check pointer arguments before dereference.  Thanks
again!


Previous Comments:
------------------------------------------------------------------------

[2006-09-09 10:59:51] [EMAIL PROTECTED]

This is actually SQLite problem, but I agree, a workaround is
required.
Fixed in 5_2 and HEAD.

------------------------------------------------------------------------

[2006-09-09 00:50:45] jcd+php at psu dot edu

Description:
------------
Empty, whitespace and/or comments only query strings passed into the
query method of a PDO object for a 'sqlite2' database appear to cause
segmentation faults.  PDO 'sqlite' (SQLite 3) objects appear immune as
does the older sqlite extention (sqlite_query()).

The function pdo_sqlite2_stmt_execute() in
ext/sqlite/pdo_sqlite2.c does not appear to catch a case when
sqlite_compile() returns SQLITE_OK but sets the sqlite virtual machine
pointer to NULL.  This seems to occur for empty query strings (0
length, whitespace and/or comments).  When passed unchecked into
sqlite_step(), as it appears to be in pdo_sqlite2_stmt_execute(),
sqlite_step() attempts to dereference the pointer, causing a
segmentation fault.  The equivalent function (sqlite_query()) in
ext/sqlite/sqlite.c appears to catch this.

This occurs on both:
- Solaris 9, Sun Forte Developer 7 C compiler
- Ubuntu Linux 6.06, gcc 4.0.3 (Ubuntu 4.0.3-1ubuntu5)

Using both PHP versions:
- php-5.1.6
- php5.2-200609072030

The shorter configure line (ubuntu) was:
./configure \
--with-apxs2=/usr/bin/apxs2 \
--prefix=/usr/local/php-5.1.6 \
--with-pdo-sqlite \
--with-sqlite \
--with-libxml-dir=/usr

I triggered it in both mod_php + Apache (1 and 2) and on the command
line.  The traces are for the cli.

The solaris version had some php.ini customizations, the ubuntu install
had none.

Reproduce code:
---------------
<?php

$dbh = new PDO('sqlite2:pdo_sqlite2');

$dbh->query(" ");

?>

Expected result:
----------------
Not crash.  Either return an error to indicate the fact that the query
was empty or do nothing.  

I found that the patch at 
http://www.personal.psu.edu/jcd/patches/php-5.1.6_pdo_sqlite2_empty_query.patch
fixed the segfaults for me on both platforms I tested.  


Actual result:
--------------
I can reproduce a segfault with every try.  With my patch, I have yet
to trigger a crash.

solaris9$ pstack /export/cores/core.snail.0.php.14111
core '/export/cores/core.snail.0.php.14111' of 14111:  
/export/ladmin/phase2.build4/php/bi
n/php pdo_sqlite2_bugtest.php
 00586430 sqlite_step (0, ff4558, ff4550, ff4554, ffbfe87c, 11828) +
40
 00541e64 pdo_sqlite2_stmt_execute (ff0e08, d475d8, ff0e5c, 30000000,
3000, 0) + 1b4
 003f789c zif_PDO_query (1, feceb8, 0, fece68, 0, 0) + 31c
 0086397c zend_do_fcall_common_helper_SPEC (ffbfebb0, fece90, 5, 0, 0,
0) + 5cc
 00864238 ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER (ffbfebb0, 0, ffffffff, 5,
0, ffbfea85) + 38
 00863220 execute  (feeb60, f00d50, 4e, ffbfecf4, 4, 0) + 2c8
 008064ac zend_execute_scripts (8, 0, 3, 0, ffbff3b0, 0) + 1cc
 00732244 php_execute_script (ffbff3b0, d70819, ffbff36c, 0, 70, 2d) +
3c4
 008e2b48 main     (2, ffbff444, ffbff450, da2400, 0, 0) + 1580
 001e06c8 _start   (0, 0, 0, 0, 0, 0) + 108

ubuntu6.06$ gdb /usr/local/php-5.1.6/bin/php core
GNU gdb 6.4-debian
Copyright 2005 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and
you are
welcome to change it and/or distribute copies of it under certain
conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for
details.
This GDB was configured as "i486-linux-gnu"...Using host libthread_db
library "/lib/tls/i68
6/cmov/libthread_db.so.1".

Core was generated by `/usr/local/php-5.1.6/bin/php -r $h=new
PDO("sqlite2:db/sqlite.db");$
h->query("'.
Program terminated with signal 11, Segmentation fault.

warning: Can't read pathname for load map: Input/output error.
Reading symbols from /lib/tls/i686/cmov/libcrypt.so.1...done.
Loaded symbols for /lib/tls/i686/cmov/libcrypt.so.1
Reading symbols from /lib/tls/i686/cmov/librt.so.1...done.
Loaded symbols for /lib/tls/i686/cmov/librt.so.1
Reading symbols from /lib/tls/i686/cmov/libresolv.so.2...done.
Loaded symbols for /lib/tls/i686/cmov/libresolv.so.2
Reading symbols from /lib/tls/i686/cmov/libm.so.6...done.
Loaded symbols for /lib/tls/i686/cmov/libm.so.6
Reading symbols from /lib/tls/i686/cmov/libnsl.so.1...done.
Loaded symbols for /lib/tls/i686/cmov/libnsl.so.1
Reading symbols from /usr/lib/libz.so.1...done.
Loaded symbols for /usr/lib/libz.so.1
Reading symbols from /usr/lib/libxml2.so.2...done.
Loaded symbols for /usr/lib/libxml2.so.2
Reading symbols from /lib/tls/i686/cmov/libdl.so.2...done.
Loaded symbols for /lib/tls/i686/cmov/libdl.so.2
Reading symbols from /lib/tls/i686/cmov/libpthread.so.0...done.
Loaded symbols for /lib/tls/i686/cmov/libpthread.so.0
Reading symbols from /lib/tls/i686/cmov/libc.so.6...done.
Loaded symbols for /lib/tls/i686/cmov/libc.so.6
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
#0  sqlite_step (pVm=0x0, pN=0x84a9abc, pazValue=0x84a9ab4,
pazColName=0x84a9ab8)
    at
/usr/local/src/jcd/php-5.1.6/ext/sqlite/libsqlite/src/vdbe.c:117
117       if( p->magic!=VDBE_MAGIC_RUN ){
(gdb) bt
#0  sqlite_step (pVm=0x0, pN=0x84a9abc, pazValue=0x84a9ab4,
pazColName=0x84a9ab8)
    at
/usr/local/src/jcd/php-5.1.6/ext/sqlite/libsqlite/src/vdbe.c:117
#1  0x08161528 in pdo_sqlite2_stmt_execute (stmt=0x84a991c,
tsrm_ls=0x83a0018)
    at /usr/local/src/jcd/php-5.1.6/ext/sqlite/pdo_sqlite2.c:102
#2  0x080edbfa in zif_PDO_query (ht=1, return_value=0x84a59ec,
return_value_ptr=0x0,
    this_ptr=0x84a5a2c, return_value_used=0, tsrm_ls=0x83a0018)
    at /usr/local/src/jcd/php-5.1.6/ext/pdo/pdo_dbh.c:985
#3  0x0826ed05 in zend_do_fcall_common_helper_SPEC
(execute_data=0xbfbf276c,
    tsrm_ls=0x83a0018) at zend_vm_execute.h:200
#4  0x0826e23c in execute (op_array=0x84a607c, tsrm_ls=0x83a0018) at
zend_vm_execute.h:92
#5  0x08246edd in zend_eval_string (
    str=0xbfbf3669 "$h=new PDO(\"sqlite2:db/sqlite.db\");$h->query(\"
\");",
    retval_ptr=0x0, string_name=0x0, tsrm_ls=0x83a0018)
    at /usr/local/src/jcd/php-5.1.6/Zend/zend_execute_API.c:1116
#6  0x0824705c in zend_eval_string_ex (str=0x0, retval_ptr=0x0,
string_name=0x0,
    handle_exceptions=1, tsrm_ls=0x83a0018)
    at /usr/local/src/jcd/php-5.1.6/Zend/zend_execute_API.c:1150
#7  0x082e60b6 in main (argc=3, argv=0xbfbf2b54)
    at /usr/local/src/jcd/php-5.1.6/sapi/cli/php_cli.c:1132


------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=38759&edit=1

Reply via email to