diff options
| author | Andrey Hristov <andrey@php.net> | 2010-05-27 12:05:02 +0000 |
|---|---|---|
| committer | Andrey Hristov <andrey@php.net> | 2010-05-27 12:05:02 +0000 |
| commit | ce2fbe19314327225f8e58aceb6e87c501d59eb1 (patch) | |
| tree | a767ae2ae313091783794ba7165591a7552464b8 /ext/mysqlnd/mysqlnd_result_meta.c | |
| parent | 5efee3d5870ffdd00ca3ba268ff99d8b9c0bd29c (diff) | |
| download | php-git-ce2fbe19314327225f8e58aceb6e87c501d59eb1.tar.gz | |
Fix possible crashes, in case of OOM, due to half-baken
objects.
Diffstat (limited to 'ext/mysqlnd/mysqlnd_result_meta.c')
| -rw-r--r-- | ext/mysqlnd/mysqlnd_result_meta.c | 33 |
1 files changed, 23 insertions, 10 deletions
diff --git a/ext/mysqlnd/mysqlnd_result_meta.c b/ext/mysqlnd/mysqlnd_result_meta.c index 9f4220bb25..377c1e03f2 100644 --- a/ext/mysqlnd/mysqlnd_result_meta.c +++ b/ext/mysqlnd/mysqlnd_result_meta.c @@ -475,17 +475,30 @@ mysqlnd_result_meta_init(unsigned int field_count, zend_bool persistent TSRMLS_D MYSQLND_RES_METADATA *ret = mnd_pecalloc(1, alloc_size, persistent); DBG_ENTER("mysqlnd_result_meta_init"); DBG_INF_FMT("persistent=%d", persistent); - - 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); + + 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); + 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 */ |
