andrey                                   Thu, 27 May 2010 12:05:02 +0000

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

Log:
Fix possible crashes, in case of OOM, due to half-baken
objects.

Changed paths:
    U   php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_result.c
    U   php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_result_meta.c
    U   php/php-src/trunk/ext/mysqlnd/mysqlnd_result.c
    U   php/php-src/trunk/ext/mysqlnd/mysqlnd_result_meta.c

Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_result.c
===================================================================
--- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_result.c   2010-05-27 
12:00:48 UTC (rev 299843)
+++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_result.c   2010-05-27 
12:05:02 UTC (rev 299844)
@@ -326,6 +326,10 @@
        }

        result->meta = result->m.result_meta_init(result->field_count, 
result->persistent TSRMLS_CC);
+       if (!result->meta) {
+               SET_OOM_ERROR(conn->error_info);
+               DBG_RETURN(FAIL);
+       }

        /* 1. Read all fields metadata */


Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_result_meta.c
===================================================================
--- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_result_meta.c      
2010-05-27 12:00:48 UTC (rev 299843)
+++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_result_meta.c      
2010-05-27 12:05:02 UTC (rev 299844)
@@ -475,17 +475,30 @@
        MYSQLND_RES_METADATA *ret = mnd_pecalloc(1, alloc_size, persistent);
        DBG_ENTER("mysqlnd_result_meta_init");
        DBG_INF_FMT("persistent=%d", persistent);
+
+       do {
+               if (!ret) {
+                       break;
+               }
+               ret->m = & mysqlnd_mysqlnd_res_meta_methods;

-       ret->persistent = persistent;
-       ret->field_count = field_count;
-       /* +1 is to have empty marker at the end */
-       ret->fields = mnd_pecalloc(field_count + 1, sizeof(MYSQLND_FIELD), 
ret->persistent);
-       ret->zend_hash_keys = mnd_pecalloc(field_count, sizeof(struct 
mysqlnd_field_hash_key), ret->persistent);
-
-       ret->m = & mysqlnd_mysqlnd_res_meta_methods;
-       DBG_INF_FMT("meta=%p", ret);
-       DBG_RETURN(ret);
+               ret->persistent = persistent;
+               ret->field_count = field_count;
+               /* +1 is to have empty marker at the end */
+               ret->fields = mnd_pecalloc(field_count + 1, 
sizeof(MYSQLND_FIELD), ret->persistent);
+               ret->zend_hash_keys = mnd_pecalloc(field_count, sizeof(struct 
mysqlnd_field_hash_key), ret->persistent);
+               if (!ret->fields || !ret->zend_hash_keys) {
+                       break;
+               }
+               DBG_INF_FMT("meta=%p", ret);
+               DBG_RETURN(ret);
+       } while (0);
+       if (ret) {
+               ret->m->free_metadata(ret TSRMLS_CC);
+       }
+       DBG_RETURN(NULL);
 }
+/* }}} */


 /* {{{ mysqlnd_res_meta_get_methods */

Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd_result.c
===================================================================
--- php/php-src/trunk/ext/mysqlnd/mysqlnd_result.c      2010-05-27 12:00:48 UTC 
(rev 299843)
+++ php/php-src/trunk/ext/mysqlnd/mysqlnd_result.c      2010-05-27 12:05:02 UTC 
(rev 299844)
@@ -326,6 +326,10 @@
        }

        result->meta = result->m.result_meta_init(result->field_count, 
result->persistent TSRMLS_CC);
+       if (!result->meta) {
+               SET_OOM_ERROR(conn->error_info);
+               DBG_RETURN(FAIL);
+       }

        /* 1. Read all fields metadata */


Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd_result_meta.c
===================================================================
--- php/php-src/trunk/ext/mysqlnd/mysqlnd_result_meta.c 2010-05-27 12:00:48 UTC 
(rev 299843)
+++ php/php-src/trunk/ext/mysqlnd/mysqlnd_result_meta.c 2010-05-27 12:05:02 UTC 
(rev 299844)
@@ -475,17 +475,30 @@
        MYSQLND_RES_METADATA *ret = mnd_pecalloc(1, alloc_size, persistent);
        DBG_ENTER("mysqlnd_result_meta_init");
        DBG_INF_FMT("persistent=%d", persistent);
+
+       do {
+               if (!ret) {
+                       break;
+               }
+               ret->m = & mysqlnd_mysqlnd_res_meta_methods;

-       ret->persistent = persistent;
-       ret->field_count = field_count;
-       /* +1 is to have empty marker at the end */
-       ret->fields = mnd_pecalloc(field_count + 1, sizeof(MYSQLND_FIELD), 
ret->persistent);
-       ret->zend_hash_keys = mnd_pecalloc(field_count, sizeof(struct 
mysqlnd_field_hash_key), ret->persistent);
-
-       ret->m = & mysqlnd_mysqlnd_res_meta_methods;
-       DBG_INF_FMT("meta=%p", ret);
-       DBG_RETURN(ret);
+               ret->persistent = persistent;
+               ret->field_count = field_count;
+               /* +1 is to have empty marker at the end */
+               ret->fields = mnd_pecalloc(field_count + 1, 
sizeof(MYSQLND_FIELD), ret->persistent);
+               ret->zend_hash_keys = mnd_pecalloc(field_count, sizeof(struct 
mysqlnd_field_hash_key), ret->persistent);
+               if (!ret->fields || !ret->zend_hash_keys) {
+                       break;
+               }
+               DBG_INF_FMT("meta=%p", ret);
+               DBG_RETURN(ret);
+       } while (0);
+       if (ret) {
+               ret->m->free_metadata(ret TSRMLS_CC);
+       }
+       DBG_RETURN(NULL);
 }
+/* }}} */


 /* {{{ mysqlnd_res_meta_get_methods */

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

Reply via email to