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