Skip to content

Commit ae9ac28

Browse files
committed
Fix possible crashes, in case of OOM, due to half-baken
objects.
1 parent 95d4f2a commit ae9ac28

File tree

2 files changed

+27
-10
lines changed

2 files changed

+27
-10
lines changed

ext/mysqlnd/mysqlnd_result.c

+4
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,10 @@ MYSQLND_METHOD(mysqlnd_res, read_result_metadata)(MYSQLND_RES * result, MYSQLND
326326
}
327327

328328
result->meta = result->m.result_meta_init(result->field_count, result->persistent TSRMLS_CC);
329+
if (!result->meta) {
330+
SET_OOM_ERROR(conn->error_info);
331+
DBG_RETURN(FAIL);
332+
}
329333

330334
/* 1. Read all fields metadata */
331335

ext/mysqlnd/mysqlnd_result_meta.c

+23-10
Original file line numberDiff line numberDiff line change
@@ -475,17 +475,30 @@ mysqlnd_result_meta_init(unsigned int field_count, zend_bool persistent TSRMLS_D
475475
MYSQLND_RES_METADATA *ret = mnd_pecalloc(1, alloc_size, persistent);
476476
DBG_ENTER("mysqlnd_result_meta_init");
477477
DBG_INF_FMT("persistent=%d", persistent);
478-
479-
ret->persistent = persistent;
480-
ret->field_count = field_count;
481-
/* +1 is to have empty marker at the end */
482-
ret->fields = mnd_pecalloc(field_count + 1, sizeof(MYSQLND_FIELD), ret->persistent);
483-
ret->zend_hash_keys = mnd_pecalloc(field_count, sizeof(struct mysqlnd_field_hash_key), ret->persistent);
484-
485-
ret->m = & mysqlnd_mysqlnd_res_meta_methods;
486-
DBG_INF_FMT("meta=%p", ret);
487-
DBG_RETURN(ret);
478+
479+
do {
480+
if (!ret) {
481+
break;
482+
}
483+
ret->m = & mysqlnd_mysqlnd_res_meta_methods;
484+
485+
ret->persistent = persistent;
486+
ret->field_count = field_count;
487+
/* +1 is to have empty marker at the end */
488+
ret->fields = mnd_pecalloc(field_count + 1, sizeof(MYSQLND_FIELD), ret->persistent);
489+
ret->zend_hash_keys = mnd_pecalloc(field_count, sizeof(struct mysqlnd_field_hash_key), ret->persistent);
490+
if (!ret->fields || !ret->zend_hash_keys) {
491+
break;
492+
}
493+
DBG_INF_FMT("meta=%p", ret);
494+
DBG_RETURN(ret);
495+
} while (0);
496+
if (ret) {
497+
ret->m->free_metadata(ret TSRMLS_CC);
498+
}
499+
DBG_RETURN(NULL);
488500
}
501+
/* }}} */
489502

490503

491504
/* {{{ mysqlnd_res_meta_get_methods */

0 commit comments

Comments
 (0)