summaryrefslogtreecommitdiff
path: root/ext/sqlite/sqlite.c
diff options
context:
space:
mode:
authorWez Furlong <wez@php.net>2003-07-13 09:20:40 +0000
committerWez Furlong <wez@php.net>2003-07-13 09:20:40 +0000
commitce2a4d9121cbb4ec677d08be0ebc812669ab560f (patch)
tree297a769e1356038929f912436da4daf41408c290 /ext/sqlite/sqlite.c
parente17043c2480078bdc5e94d2e0b811d766ff9fde1 (diff)
downloadphp-git-ce2a4d9121cbb4ec677d08be0ebc812669ab560f.tar.gz
MFB better popen fix
Diffstat (limited to 'ext/sqlite/sqlite.c')
-rw-r--r--ext/sqlite/sqlite.c22
1 files changed, 12 insertions, 10 deletions
diff --git a/ext/sqlite/sqlite.c b/ext/sqlite/sqlite.c
index 5b4b205544..405e9d569d 100644
--- a/ext/sqlite/sqlite.c
+++ b/ext/sqlite/sqlite.c
@@ -315,17 +315,11 @@ static void php_sqlite_callback_dtor(void *pDest)
}
}
-static ZEND_RSRC_DTOR_FUNC(php_sqlite_pdb_invalidator)
-{
- struct php_sqlite_db *db = (struct php_sqlite_db*)rsrc->ptr;
-
- db->rsrc_id = FAILURE;
-}
-
static ZEND_RSRC_DTOR_FUNC(php_sqlite_db_dtor)
{
if (rsrc->ptr) {
struct php_sqlite_db *db = (struct php_sqlite_db*)rsrc->ptr;
+
sqlite_close(db->db);
zend_hash_destroy(&db->callbacks);
@@ -896,7 +890,7 @@ PHP_MINIT_FUNCTION(sqlite)
#endif
le_sqlite_db = zend_register_list_destructors_ex(php_sqlite_db_dtor, NULL, "sqlite database", module_number);
- le_sqlite_pdb = zend_register_list_destructors_ex(php_sqlite_pdb_invalidator, php_sqlite_db_dtor, "sqlite database (persistent)", module_number);
+ le_sqlite_pdb = zend_register_list_destructors_ex(NULL, php_sqlite_db_dtor, "sqlite database (persistent)", module_number);
le_sqlite_result = zend_register_list_destructors_ex(php_sqlite_result_dtor, NULL, "sqlite result", module_number);
REGISTER_LONG_CONSTANT("SQLITE_BOTH", PHPSQLITE_BOTH, CONST_CS|CONST_PERSISTENT);
@@ -1080,8 +1074,16 @@ PHP_FUNCTION(sqlite_popen)
/* give it a valid resource id for this request */
db->rsrc_id = ZEND_REGISTER_RESOURCE(return_value, db, le_sqlite_pdb);
} else {
- /* already accessed this request; map it */
- ZVAL_RESOURCE(return_value, db->rsrc_id);
+ int type;
+ /* sanity check to ensure that the resource is still a valid regular resource
+ * number */
+ if (_zend_list_find(db->rsrc_id, &type) == db) {
+ /* already accessed this request; map it */
+ zend_list_addref(db->rsrc_id);
+ ZVAL_RESOURCE(return_value, db->rsrc_id);
+ } else {
+ db->rsrc_id = ZEND_REGISTER_RESOURCE(return_value, db, le_sqlite_pdb);
+ }
}
/* all set */