summaryrefslogtreecommitdiff
path: root/ext/mysqlnd/mysqlnd_block_alloc.c
diff options
context:
space:
mode:
authorAndrey Hristov <andrey@php.net>2010-05-03 17:07:18 +0000
committerAndrey Hristov <andrey@php.net>2010-05-03 17:07:18 +0000
commit6dff9e55be3446333f9c25a3acc29ca8017971ad (patch)
tree5e97fc1def97f75e15e56addb393c62e1a4e05dc /ext/mysqlnd/mysqlnd_block_alloc.c
parent44bcdeeb772d17e8d81224a6d78c5fbf1718419e (diff)
downloadphp-git-6dff9e55be3446333f9c25a3acc29ca8017971ad.tar.gz
Handle gracefully OOM in mysqlnd_mempool_create and up the stack
Diffstat (limited to 'ext/mysqlnd/mysqlnd_block_alloc.c')
-rw-r--r--ext/mysqlnd/mysqlnd_block_alloc.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/ext/mysqlnd/mysqlnd_block_alloc.c b/ext/mysqlnd/mysqlnd_block_alloc.c
index 5d618d145e..8bcfffa951 100644
--- a/ext/mysqlnd/mysqlnd_block_alloc.c
+++ b/ext/mysqlnd/mysqlnd_block_alloc.c
@@ -156,13 +156,17 @@ mysqlnd_mempool_create(size_t arena_size TSRMLS_DC)
/* We calloc, because we free(). We don't mnd_calloc() for a reason. */
MYSQLND_MEMORY_POOL * ret = mnd_calloc(1, sizeof(MYSQLND_MEMORY_POOL));
DBG_ENTER("mysqlnd_mempool_create");
-
- ret->free_size = ret->arena_size = arena_size ? arena_size : 0;
- ret->refcount = 0;
- /* OOM ? */
- ret->arena = mnd_malloc(ret->arena_size);
- ret->get_chunk = mysqlnd_mempool_get_chunk;
-
+ if (ret) {
+ ret->get_chunk = mysqlnd_mempool_get_chunk;
+ ret->free_size = ret->arena_size = arena_size ? arena_size : 0;
+ ret->refcount = 0;
+ /* OOM ? */
+ ret->arena = mnd_malloc(ret->arena_size);
+ if (!ret->arena) {
+ mysqlnd_mempool_destroy(ret TSRMLS_CC);
+ ret = NULL;
+ }
+ }
DBG_RETURN(ret);
}
/* }}} */