andrey                                   Thu, 27 May 2010 08:51:46 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=299841

Log:
Fix deallocation which can crash if the object is half-baken.
Happens during OOM.

Changed paths:
    U   php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c
    U   php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_structs.h
    U   php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c
    U   php/php-src/trunk/ext/mysqlnd/mysqlnd_structs.h

Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c
===================================================================
--- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c       2010-05-27 
06:35:58 UTC (rev 299840)
+++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c       2010-05-27 
08:51:46 UTC (rev 299841)
@@ -2091,16 +2091,19 @@
 {
        MYSQLND_STMT_DATA * stmt = s->data;
        enum_func_status ret;
-       zend_bool persistent = stmt->persistent;
+       zend_bool persistent = s->persistent;

        DBG_ENTER("mysqlnd_stmt::dtor");
-       DBG_INF_FMT("stmt=%p", stmt);
+       if (stmt) {

-       MYSQLND_INC_GLOBAL_STATISTIC(implicit == TRUE?  
STAT_STMT_CLOSE_IMPLICIT:
-                                                                               
                        STAT_STMT_CLOSE_EXPLICIT);
+               DBG_INF_FMT("stmt=%p", stmt);

-       ret = s->m->net_close(s, implicit TSRMLS_CC);
-       mnd_pefree(stmt, persistent);
+               MYSQLND_INC_GLOBAL_STATISTIC(implicit == TRUE?  
STAT_STMT_CLOSE_IMPLICIT:
+                                                                               
                                STAT_STMT_CLOSE_EXPLICIT);
+
+               ret = s->m->net_close(s, implicit TSRMLS_CC);
+               mnd_pefree(stmt, persistent);
+       }
        mnd_pefree(s, persistent);

        DBG_INF(ret == PASS? "PASS":"FAIL");
@@ -2214,6 +2217,7 @@
                        break;
                }
                ret->m = mysqlnd_stmt_methods;
+               ret->persistent = conn->persistent;

                stmt = ret->data = mnd_pecalloc(1, sizeof(MYSQLND_STMT_DATA), 
conn->persistent);
                DBG_INF_FMT("stmt=%p", stmt);

Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_structs.h
===================================================================
--- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_structs.h  2010-05-27 
06:35:58 UTC (rev 299840)
+++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_structs.h  2010-05-27 
08:51:46 UTC (rev 299841)
@@ -908,6 +908,7 @@
 {
        MYSQLND_STMT_DATA * data;
        struct st_mysqlnd_stmt_methods  *m;
+       zend_bool persistent;
 };

 #endif /* MYSQLND_STRUCTS_H */

Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c
===================================================================
--- php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c  2010-05-27 06:35:58 UTC (rev 
299840)
+++ php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c  2010-05-27 08:51:46 UTC (rev 
299841)
@@ -2091,16 +2091,19 @@
 {
        MYSQLND_STMT_DATA * stmt = s->data;
        enum_func_status ret;
-       zend_bool persistent = stmt->persistent;
+       zend_bool persistent = s->persistent;

        DBG_ENTER("mysqlnd_stmt::dtor");
-       DBG_INF_FMT("stmt=%p", stmt);
+       if (stmt) {

-       MYSQLND_INC_GLOBAL_STATISTIC(implicit == TRUE?  
STAT_STMT_CLOSE_IMPLICIT:
-                                                                               
                        STAT_STMT_CLOSE_EXPLICIT);
+               DBG_INF_FMT("stmt=%p", stmt);

-       ret = s->m->net_close(s, implicit TSRMLS_CC);
-       mnd_pefree(stmt, persistent);
+               MYSQLND_INC_GLOBAL_STATISTIC(implicit == TRUE?  
STAT_STMT_CLOSE_IMPLICIT:
+                                                                               
                                STAT_STMT_CLOSE_EXPLICIT);
+
+               ret = s->m->net_close(s, implicit TSRMLS_CC);
+               mnd_pefree(stmt, persistent);
+       }
        mnd_pefree(s, persistent);

        DBG_INF(ret == PASS? "PASS":"FAIL");
@@ -2214,6 +2217,7 @@
                        break;
                }
                ret->m = mysqlnd_stmt_methods;
+               ret->persistent = conn->persistent;

                stmt = ret->data = mnd_pecalloc(1, sizeof(MYSQLND_STMT_DATA), 
conn->persistent);
                DBG_INF_FMT("stmt=%p", stmt);

Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd_structs.h
===================================================================
--- php/php-src/trunk/ext/mysqlnd/mysqlnd_structs.h     2010-05-27 06:35:58 UTC 
(rev 299840)
+++ php/php-src/trunk/ext/mysqlnd/mysqlnd_structs.h     2010-05-27 08:51:46 UTC 
(rev 299841)
@@ -908,6 +908,7 @@
 {
        MYSQLND_STMT_DATA * data;
        struct st_mysqlnd_stmt_methods  *m;
+       zend_bool persistent;
 };

 #endif /* MYSQLND_STRUCTS_H */

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

Reply via email to