]> granicus.if.org Git - php/commitdiff
MFB better popen fix
authorWez Furlong <wez@php.net>
Sun, 13 Jul 2003 09:20:40 +0000 (09:20 +0000)
committerWez Furlong <wez@php.net>
Sun, 13 Jul 2003 09:20:40 +0000 (09:20 +0000)
ext/sqlite/sqlite.c

index 5b4b205544453a387add0cc3d3fc6d9b603b622a..405e9d569db59baf95fb8fd09c127f67bfcca70c 100644 (file)
@@ -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 */