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.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.c')
| -rw-r--r-- | ext/mysqlnd/mysqlnd.c | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/ext/mysqlnd/mysqlnd.c b/ext/mysqlnd/mysqlnd.c index 414d6f2b5a..f67c468c83 100644 --- a/ext/mysqlnd/mysqlnd.c +++ b/ext/mysqlnd/mysqlnd.c @@ -2060,7 +2060,7 @@ oom: static MYSQLND_RES * MYSQLND_METHOD(mysqlnd_conn, use_result)(MYSQLND * const conn TSRMLS_DC) { - MYSQLND_RES *result; + MYSQLND_RES * result; DBG_ENTER("mysqlnd_conn::use_result"); DBG_INF_FMT("conn=%llu", conn->thread_id); @@ -2079,11 +2079,14 @@ MYSQLND_METHOD(mysqlnd_conn, use_result)(MYSQLND * const conn TSRMLS_DC) MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_UNBUFFERED_SETS); - result = conn->current_result; - conn->current_result = NULL; - result->conn = conn->m->get_reference(conn TSRMLS_CC); + conn->current_result->conn = conn->m->get_reference(conn TSRMLS_CC); + result = conn->current_result->m.use_result(conn->current_result, FALSE TSRMLS_CC); - result = result->m.use_result(result, FALSE TSRMLS_CC); + if (!result) { + conn->current_result->m.free_result(conn->current_result, TRUE TSRMLS_CC); + } + conn->current_result = NULL; + DBG_RETURN(result); } /* }}} */ @@ -2112,10 +2115,11 @@ MYSQLND_METHOD(mysqlnd_conn, store_result)(MYSQLND * const conn TSRMLS_DC) MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_BUFFERED_SETS); - result = conn->current_result; + result = conn->current_result->m.store_result(conn->current_result, conn, FALSE TSRMLS_CC); + if (!result) { + conn->current_result->m.free_result(conn->current_result, TRUE TSRMLS_CC); + } conn->current_result = NULL; - - result = result->m.store_result(result, conn, FALSE TSRMLS_CC); DBG_RETURN(result); } /* }}} */ |
