andrey                                   Mon, 03 May 2010 14:16:04 +0000

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

Log:
Handle OOM when resizing blocks during data fetch

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

Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_block_alloc.c
===================================================================
--- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_block_alloc.c      
2010-05-03 13:51:30 UTC (rev 298902)
+++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_block_alloc.c      
2010-05-03 14:16:04 UTC (rev 298903)
@@ -53,7 +53,7 @@


 /* {{{ mysqlnd_mempool_resize_chunk */
-static void
+static enum_func_status
 mysqlnd_mempool_resize_chunk(MYSQLND_MEMORY_POOL_CHUNK * chunk, unsigned int 
size TSRMLS_DC)
 {
        DBG_ENTER("mysqlnd_mempool_resize_chunk");
@@ -68,6 +68,9 @@
                        if ((chunk->size + pool->free_size) < size) {
                                zend_uchar *new_ptr;
                                new_ptr = mnd_malloc(size);
+                               if (!new_ptr) {
+                                       DBG_RETURN(FAIL);
+                               }
                                memcpy(new_ptr, chunk->ptr, chunk->size);
                                chunk->ptr = new_ptr;
                                pool->free_size += chunk->size;
@@ -85,6 +88,9 @@
                        } else {
                                zend_uchar *new_ptr;
                                new_ptr = mnd_malloc(size);
+                               if (!new_ptr) {
+                                       DBG_RETURN(FAIL);
+                               }
                                memcpy(new_ptr, chunk->ptr, chunk->size);
                                chunk->ptr = new_ptr;
                                chunk->size = size;
@@ -95,7 +101,7 @@
        } else {
                chunk->ptr = mnd_realloc(chunk->ptr, size);
        }
-       DBG_VOID_RETURN;
+       DBG_RETURN(PASS);
 }
 /* }}} */


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-03 
13:51:30 UTC (rev 298902)
+++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_structs.h  2010-05-03 
14:16:04 UTC (rev 298903)
@@ -48,7 +48,7 @@
        MYSQLND_MEMORY_POOL     *pool;
        zend_uchar                      *ptr;
        unsigned int            size;
-       void                            
(*resize_chunk)(MYSQLND_MEMORY_POOL_CHUNK * chunk, unsigned int size TSRMLS_DC);
+       enum_func_status        (*resize_chunk)(MYSQLND_MEMORY_POOL_CHUNK * 
chunk, unsigned int size TSRMLS_DC);
        void                            (*free_chunk)(MYSQLND_MEMORY_POOL_CHUNK 
* chunk, zend_bool cache_it TSRMLS_DC);
        zend_bool                       from_pool;
 };

Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_wireprotocol.c
===================================================================
--- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_wireprotocol.c     
2010-05-03 13:51:30 UTC (rev 298902)
+++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_wireprotocol.c     
2010-05-03 14:16:04 UTC (rev 298903)
@@ -1149,7 +1149,11 @@
                          We need a trailing \0 for the last string, in case of 
text-mode,
                          to be able to implement read-only variables.
                        */
-                       (*buffer)->resize_chunk((*buffer), *data_size + 1 
TSRMLS_CC);
+                       if (FAIL == (*buffer)->resize_chunk((*buffer), 
*data_size + 1 TSRMLS_CC)) {
+                               SET_OOM_ERROR(conn->error_info);
+                               ret = FAIL;
+                               break;
+                       }
                        /* The position could have changed, recalculate */
                        p = (*buffer)->ptr + (*data_size - header.size);
                }

Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd_block_alloc.c
===================================================================
--- php/php-src/trunk/ext/mysqlnd/mysqlnd_block_alloc.c 2010-05-03 13:51:30 UTC 
(rev 298902)
+++ php/php-src/trunk/ext/mysqlnd/mysqlnd_block_alloc.c 2010-05-03 14:16:04 UTC 
(rev 298903)
@@ -53,7 +53,7 @@


 /* {{{ mysqlnd_mempool_resize_chunk */
-static void
+static enum_func_status
 mysqlnd_mempool_resize_chunk(MYSQLND_MEMORY_POOL_CHUNK * chunk, unsigned int 
size TSRMLS_DC)
 {
        DBG_ENTER("mysqlnd_mempool_resize_chunk");
@@ -68,6 +68,9 @@
                        if ((chunk->size + pool->free_size) < size) {
                                zend_uchar *new_ptr;
                                new_ptr = mnd_malloc(size);
+                               if (!new_ptr) {
+                                       DBG_RETURN(FAIL);
+                               }
                                memcpy(new_ptr, chunk->ptr, chunk->size);
                                chunk->ptr = new_ptr;
                                pool->free_size += chunk->size;
@@ -85,6 +88,9 @@
                        } else {
                                zend_uchar *new_ptr;
                                new_ptr = mnd_malloc(size);
+                               if (!new_ptr) {
+                                       DBG_RETURN(FAIL);
+                               }
                                memcpy(new_ptr, chunk->ptr, chunk->size);
                                chunk->ptr = new_ptr;
                                chunk->size = size;
@@ -95,7 +101,7 @@
        } else {
                chunk->ptr = mnd_realloc(chunk->ptr, size);
        }
-       DBG_VOID_RETURN;
+       DBG_RETURN(PASS);
 }
 /* }}} */


Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd_structs.h
===================================================================
--- php/php-src/trunk/ext/mysqlnd/mysqlnd_structs.h     2010-05-03 13:51:30 UTC 
(rev 298902)
+++ php/php-src/trunk/ext/mysqlnd/mysqlnd_structs.h     2010-05-03 14:16:04 UTC 
(rev 298903)
@@ -48,7 +48,7 @@
        MYSQLND_MEMORY_POOL     *pool;
        zend_uchar                      *ptr;
        unsigned int            size;
-       void                            
(*resize_chunk)(MYSQLND_MEMORY_POOL_CHUNK * chunk, unsigned int size TSRMLS_DC);
+       enum_func_status        (*resize_chunk)(MYSQLND_MEMORY_POOL_CHUNK * 
chunk, unsigned int size TSRMLS_DC);
        void                            (*free_chunk)(MYSQLND_MEMORY_POOL_CHUNK 
* chunk, zend_bool cache_it TSRMLS_DC);
        zend_bool                       from_pool;
 };

Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd_wireprotocol.c
===================================================================
--- php/php-src/trunk/ext/mysqlnd/mysqlnd_wireprotocol.c        2010-05-03 
13:51:30 UTC (rev 298902)
+++ php/php-src/trunk/ext/mysqlnd/mysqlnd_wireprotocol.c        2010-05-03 
14:16:04 UTC (rev 298903)
@@ -1149,7 +1149,11 @@
                          We need a trailing \0 for the last string, in case of 
text-mode,
                          to be able to implement read-only variables.
                        */
-                       (*buffer)->resize_chunk((*buffer), *data_size + 1 
TSRMLS_CC);
+                       if (FAIL == (*buffer)->resize_chunk((*buffer), 
*data_size + 1 TSRMLS_CC)) {
+                               SET_OOM_ERROR(conn->error_info);
+                               ret = FAIL;
+                               break;
+                       }
                        /* The position could have changed, recalculate */
                        p = (*buffer)->ptr + (*data_size - header.size);
                }

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

Reply via email to