diff options
author | Andrey Hristov <andrey@php.net> | 2010-05-03 17:07:18 +0000 |
---|---|---|
committer | Andrey Hristov <andrey@php.net> | 2010-05-03 17:07:18 +0000 |
commit | 6dff9e55be3446333f9c25a3acc29ca8017971ad (patch) | |
tree | 5e97fc1def97f75e15e56addb393c62e1a4e05dc /ext/mysqlnd/mysqlnd_block_alloc.c | |
parent | 44bcdeeb772d17e8d81224a6d78c5fbf1718419e (diff) | |
download | php-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.c | 18 |
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); } /* }}} */ |