tony2001                Fri Nov 10 16:33:28 2006 UTC

  Modified files:              
    /php-src/ext/oci8   oci8.c oci8_statement.c php_oci8_int.h 
  Log:
  fix segfault in ZTS mode when statements containing sub-statements are 
destroyed in wrong order
  
  
http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/oci8.c?r1=1.322&r2=1.323&diff_format=u
Index: php-src/ext/oci8/oci8.c
diff -u php-src/ext/oci8/oci8.c:1.322 php-src/ext/oci8/oci8.c:1.323
--- php-src/ext/oci8/oci8.c:1.322       Wed Oct 18 14:22:04 2006
+++ php-src/ext/oci8/oci8.c     Fri Nov 10 16:33:28 2006
@@ -26,7 +26,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: oci8.c,v 1.322 2006/10/18 14:22:04 tony2001 Exp $ */
+/* $Id: oci8.c,v 1.323 2006/11/10 16:33:28 tony2001 Exp $ */
 /* TODO
  *
  * file://localhost/www/docs/oci10/ociaahan.htm#423823 - implement lob_empty() 
with OCI_ATTR_LOBEMPTY
@@ -647,7 +647,9 @@
 #ifdef ZTS
        zend_hash_apply_with_argument(&EG(regular_list), (apply_func_arg_t) 
php_oci_list_helper, (void *)le_descriptor TSRMLS_CC);
        zend_hash_apply_with_argument(&EG(regular_list), (apply_func_arg_t) 
php_oci_list_helper, (void *)le_collection TSRMLS_CC);
-       zend_hash_apply_with_argument(&EG(regular_list), (apply_func_arg_t) 
php_oci_list_helper, (void *)le_statement TSRMLS_CC);
+       while (OCI_G(num_statements)) { 
+               zend_hash_apply_with_argument(&EG(regular_list), 
(apply_func_arg_t) php_oci_list_helper, (void *)le_statement TSRMLS_CC);
+       }
 #endif
 
        /* check persistent connections and do the necessary actions if needed 
*/
@@ -668,7 +670,7 @@
        php_info_print_table_start();
        php_info_print_table_row(2, "OCI8 Support", "enabled");
        php_info_print_table_row(2, "Version", "1.2.2");
-       php_info_print_table_row(2, "Revision", "$Revision: 1.322 $");
+       php_info_print_table_row(2, "Revision", "$Revision: 1.323 $");
 
        sprintf(buf, "%ld", OCI_G(num_persistent));
        php_info_print_table_row(2, "Active Persistent Connections", buf);
@@ -1810,13 +1812,13 @@
 static int php_oci_list_helper(zend_rsrc_list_entry *le, void *le_type 
TSRMLS_DC)
 {
        int type = (int) le_type;
-               
+
        if (le->type == type) {
-               if (le->ptr != NULL) {
-                       return 1;
+               if (le->ptr != NULL && --le->refcount<=0) {
+                       return ZEND_HASH_APPLY_REMOVE;
                }
        }
-       return 0;
+       return ZEND_HASH_APPLY_KEEP;
 } /* }}} */
 #endif
 
http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/oci8_statement.c?r1=1.32&r2=1.33&diff_format=u
Index: php-src/ext/oci8/oci8_statement.c
diff -u php-src/ext/oci8/oci8_statement.c:1.32 
php-src/ext/oci8/oci8_statement.c:1.33
--- php-src/ext/oci8/oci8_statement.c:1.32      Fri Oct 13 14:26:14 2006
+++ php-src/ext/oci8/oci8_statement.c   Fri Nov 10 16:33:28 2006
@@ -25,7 +25,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: oci8_statement.c,v 1.32 2006/10/13 14:26:14 tony2001 Exp $ */
+/* $Id: oci8_statement.c,v 1.33 2006/11/10 16:33:28 tony2001 Exp $ */
 
 
 #ifdef HAVE_CONFIG_H
@@ -113,6 +113,8 @@
        }
        
        PHP_OCI_REGISTER_RESOURCE(statement, le_statement);
+
+       OCI_G(num_statements)++;
        
        return statement;
 }
@@ -520,6 +522,7 @@
                                        outcol->retlen = -1;
                                        dynamic = OCI_DEFAULT;
                                        buf = &(outcol->statement->stmt);
+                                       zend_list_addref(statement->id);
                                        break;
 
                                case SQLT_RDD:   /* ROWID */
@@ -694,6 +697,8 @@
        
        zend_list_delete(statement->connection->rsrc_id);
        efree(statement);
+       
+       OCI_G(num_statements)--;
 } /* }}} */
 
 /* {{{ php_oci_bind_pre_exec() 
http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/php_oci8_int.h?r1=1.22&r2=1.23&diff_format=u
Index: php-src/ext/oci8/php_oci8_int.h
diff -u php-src/ext/oci8/php_oci8_int.h:1.22 
php-src/ext/oci8/php_oci8_int.h:1.23
--- php-src/ext/oci8/php_oci8_int.h:1.22        Tue Aug 22 11:08:28 2006
+++ php-src/ext/oci8/php_oci8_int.h     Fri Nov 10 16:33:28 2006
@@ -25,7 +25,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: php_oci8_int.h,v 1.22 2006/08/22 11:08:28 tony2001 Exp $ */
+/* $Id: php_oci8_int.h,v 1.23 2006/11/10 16:33:28 tony2001 Exp $ */
 
 #if HAVE_OCI8
 # ifndef PHP_OCI8_INT_H
@@ -411,6 +411,7 @@
        long max_persistent;    /* maximum number of persistent connections per 
process */
        long num_persistent;    /* number of existing persistent connections */
        long num_links;                 /* non-persistent + persistent 
connections */
+       long num_statements;    /* number of statements open */
        long ping_interval;             /* time interval between pings */
        long persistent_timeout;        /* time period after which idle 
persistent connection is considered expired */
        long statement_cache_size;      /* statement cache size. used with 9i+ 
clients only*/

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to