[PHP-CVS] svn: /php/php-src/ branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c trunk/ext/mysqlnd/mysqlnd_ps.c
andrey Tue, 01 Feb 2011 16:55:20 + Revision: http://svn.php.net/viewvc?view=revisionrevision=307921 Log: fix warnings. These checks are not needed because param_no is unsigned, it wasn't in the beginning. Changed paths: U php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c U php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c === --- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c 2011-02-01 16:35:26 UTC (rev 307920) +++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c 2011-02-01 16:55:20 UTC (rev 307921) @@ -1477,7 +1477,7 @@ DBG_RETURN(FAIL); } - if (param_no 0 || param_no = stmt-param_count) { + if (param_no = stmt-param_count) { SET_STMT_ERROR(stmt, CR_INVALID_PARAMETER_NO, UNKNOWN_SQLSTATE, Invalid parameter number); DBG_ERR(invalid param_no); DBG_RETURN(FAIL); @@ -1617,7 +1617,7 @@ DBG_RETURN(FAIL); } - if (param_no 0 || param_no = stmt-field_count) { + if (param_no = stmt-field_count) { SET_STMT_ERROR(stmt, CR_INVALID_PARAMETER_NO, UNKNOWN_SQLSTATE, Invalid parameter number); DBG_ERR(invalid param_no); DBG_RETURN(FAIL); Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c === --- php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c 2011-02-01 16:35:26 UTC (rev 307920) +++ php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c 2011-02-01 16:55:20 UTC (rev 307921) @@ -1477,7 +1477,7 @@ DBG_RETURN(FAIL); } - if (param_no 0 || param_no = stmt-param_count) { + if (param_no = stmt-param_count) { SET_STMT_ERROR(stmt, CR_INVALID_PARAMETER_NO, UNKNOWN_SQLSTATE, Invalid parameter number); DBG_ERR(invalid param_no); DBG_RETURN(FAIL); @@ -1617,7 +1617,7 @@ DBG_RETURN(FAIL); } - if (param_no 0 || param_no = stmt-field_count) { + if (param_no = stmt-field_count) { SET_STMT_ERROR(stmt, CR_INVALID_PARAMETER_NO, UNKNOWN_SQLSTATE, Invalid parameter number); DBG_ERR(invalid param_no); DBG_RETURN(FAIL); -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-CVS] svn: /php/php-src/ branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c trunk/ext/mysqlnd/mysqlnd_ps.c
On 01/17/2011 03:01 PM, Pierre Joye wrote: pajoye Mon, 17 Jan 2011 14:01:01 + Revision: http://svn.php.net/viewvc?view=revisionrevision=307537 Log: - fix NULL derefencing Changed paths: U php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c U php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c === --- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c 2011-01-17 13:44:54 UTC (rev 307536) +++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c 2011-01-17 14:01:01 UTC (rev 307537) @@ -735,7 +735,7 @@ DBG_ENTER(mysqlnd_fetch_stmt_row_buffered); *fetched_anything = FALSE; - DBG_INF_FMT(stmt=%lu, stmt-stmt_id); + DBG_INF_FMT(stmt=%lu, stmt != NULL ? stmt-stmt_id : 0L); /* If we haven't read everything */ if (set-data_cursor @@ -2223,9 +2223,9 @@ static enum_func_status MYSQLND_METHOD(mysqlnd_stmt, dtor)(MYSQLND_STMT * const s, zend_bool implicit TSRMLS_DC) { - MYSQLND_STMT_DATA * stmt = s? s-data:NULL; + MYSQLND_STMT_DATA * stmt = (s == NULL) ? s-data:NULL; enum_func_status ret = FAIL; - zend_bool persistent = s-persistent; + zend_bool persistent = (s == NULL) ? s-persistent : 0; This breaks mysqlnd. Why? Because you turn around the meaning. s? means s!=NULL and you change it to s==NULL but leave the rest of the ternary intact. Did you run the tests, because 117 more failing test, out of 432. This is hard to oversee if you run the test suite! Best, Andrey -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
[PHP-CVS] svn: /php/php-src/ branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c trunk/ext/mysqlnd/mysqlnd_ps.c
pajoye Tue, 18 Jan 2011 10:29:26 + Revision: http://svn.php.net/viewvc?view=revisionrevision=307558 Log: - fix the fix (wrong test) Changed paths: U php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c U php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c === --- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c 2011-01-18 07:28:30 UTC (rev 307557) +++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c 2011-01-18 10:29:26 UTC (rev 307558) @@ -2223,9 +2223,9 @@ static enum_func_status MYSQLND_METHOD(mysqlnd_stmt, dtor)(MYSQLND_STMT * const s, zend_bool implicit TSRMLS_DC) { - MYSQLND_STMT_DATA * stmt = (s == NULL) ? s-data:NULL; + MYSQLND_STMT_DATA * stmt = (s != NULL) ? s-data:NULL; enum_func_status ret = FAIL; - zend_bool persistent = (s == NULL) ? s-persistent : 0; + zend_bool persistent = (s != NULL) ? s-persistent : 0; DBG_ENTER(mysqlnd_stmt::dtor); if (stmt) { Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c === --- php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c 2011-01-18 07:28:30 UTC (rev 307557) +++ php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c 2011-01-18 10:29:26 UTC (rev 307558) @@ -2223,9 +2223,9 @@ static enum_func_status MYSQLND_METHOD(mysqlnd_stmt, dtor)(MYSQLND_STMT * const s, zend_bool implicit TSRMLS_DC) { - MYSQLND_STMT_DATA * stmt = (s == NULL) ? s-data:NULL; + MYSQLND_STMT_DATA * stmt = (s != NULL) ? s-data:NULL; enum_func_status ret = FAIL; - zend_bool persistent = (s == NULL) ? s-persistent : 0; + zend_bool persistent = (s != NULL) ? s-persistent : 0; DBG_ENTER(mysqlnd_stmt::dtor); if (stmt) { -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-CVS] svn: /php/php-src/ branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c trunk/ext/mysqlnd/mysqlnd_ps.c
fixed On Tue, Jan 18, 2011 at 11:20 AM, Andrey Hristov p...@hristov.com wrote: On 01/17/2011 03:01 PM, Pierre Joye wrote: pajoye Mon, 17 Jan 2011 14:01:01 + Revision: http://svn.php.net/viewvc?view=revisionrevision=307537 Log: - fix NULL derefencing Changed paths: U php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c U php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c === --- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c 2011-01-17 13:44:54 UTC (rev 307536) +++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c 2011-01-17 14:01:01 UTC (rev 307537) @@ -735,7 +735,7 @@ DBG_ENTER(mysqlnd_fetch_stmt_row_buffered); *fetched_anything = FALSE; - DBG_INF_FMT(stmt=%lu, stmt-stmt_id); + DBG_INF_FMT(stmt=%lu, stmt != NULL ? stmt-stmt_id : 0L); /* If we haven't read everything */ if (set-data_cursor @@ -2223,9 +2223,9 @@ static enum_func_status MYSQLND_METHOD(mysqlnd_stmt, dtor)(MYSQLND_STMT * const s, zend_bool implicit TSRMLS_DC) { - MYSQLND_STMT_DATA * stmt = s? s-data:NULL; + MYSQLND_STMT_DATA * stmt = (s == NULL) ? s-data:NULL; enum_func_status ret = FAIL; - zend_bool persistent = s-persistent; + zend_bool persistent = (s == NULL) ? s-persistent : 0; This breaks mysqlnd. Why? Because you turn around the meaning. s? means s!=NULL and you change it to s==NULL but leave the rest of the ternary intact. Did you run the tests, because 117 more failing test, out of 432. This is hard to oversee if you run the test suite! Best, Andrey -- Pierre @pierrejoye | http://blog.thepimp.net | http://www.libgd.org -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
[PHP-CVS] svn: /php/php-src/ branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c trunk/ext/mysqlnd/mysqlnd_ps.c
pajoye Mon, 17 Jan 2011 14:01:01 + Revision: http://svn.php.net/viewvc?view=revisionrevision=307537 Log: - fix NULL derefencing Changed paths: U php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c U php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c === --- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c 2011-01-17 13:44:54 UTC (rev 307536) +++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c 2011-01-17 14:01:01 UTC (rev 307537) @@ -735,7 +735,7 @@ DBG_ENTER(mysqlnd_fetch_stmt_row_buffered); *fetched_anything = FALSE; - DBG_INF_FMT(stmt=%lu, stmt-stmt_id); + DBG_INF_FMT(stmt=%lu, stmt != NULL ? stmt-stmt_id : 0L); /* If we haven't read everything */ if (set-data_cursor @@ -2223,9 +2223,9 @@ static enum_func_status MYSQLND_METHOD(mysqlnd_stmt, dtor)(MYSQLND_STMT * const s, zend_bool implicit TSRMLS_DC) { - MYSQLND_STMT_DATA * stmt = s? s-data:NULL; + MYSQLND_STMT_DATA * stmt = (s == NULL) ? s-data:NULL; enum_func_status ret = FAIL; - zend_bool persistent = s-persistent; + zend_bool persistent = (s == NULL) ? s-persistent : 0; DBG_ENTER(mysqlnd_stmt::dtor); if (stmt) { Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c === --- php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c 2011-01-17 13:44:54 UTC (rev 307536) +++ php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c 2011-01-17 14:01:01 UTC (rev 307537) @@ -735,7 +735,7 @@ DBG_ENTER(mysqlnd_fetch_stmt_row_buffered); *fetched_anything = FALSE; - DBG_INF_FMT(stmt=%lu, stmt-stmt_id); + DBG_INF_FMT(stmt=%lu, stmt != NULL ? stmt-stmt_id : 0L); /* If we haven't read everything */ if (set-data_cursor @@ -2223,9 +2223,9 @@ static enum_func_status MYSQLND_METHOD(mysqlnd_stmt, dtor)(MYSQLND_STMT * const s, zend_bool implicit TSRMLS_DC) { - MYSQLND_STMT_DATA * stmt = s? s-data:NULL; + MYSQLND_STMT_DATA * stmt = (s == NULL) ? s-data:NULL; enum_func_status ret = FAIL; - zend_bool persistent = s-persistent; + zend_bool persistent = (s == NULL) ? s-persistent : 0; DBG_ENTER(mysqlnd_stmt::dtor); if (stmt) { -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
[PHP-CVS] svn: /php/php-src/ branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c trunk/ext/mysqlnd/mysqlnd_ps.c
andrey Mon, 06 Dec 2010 13:59:14 + Revision: http://svn.php.net/viewvc?view=revisionrevision=306009 Log: Skip additional result sets sent by MySQL 5.5 servers which break the Protocol API (see http://bugs.mysql.com/bug.php?id=58700) Changed paths: U php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c U php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c === --- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c 2010-12-06 13:50:51 UTC (rev 306008) +++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c 2010-12-06 13:59:14 UTC (rev 306009) @@ -225,10 +225,15 @@ DBG_RETURN(FAIL); } + DBG_INF_FMT(server_status=%u cursor=%u, stmt-upsert_status.server_status, stmt-upsert_status.server_status SERVER_STATUS_CURSOR_EXISTS); + DBG_INF_FMT(server_status=%u cursor=%u, conn-upsert_status.server_status, conn-upsert_status.server_status SERVER_STATUS_CURSOR_EXISTS); + /* Free space for next result */ s-m-free_stmt_content(s TSRMLS_CC); - - DBG_RETURN(s-m-parse_execute_response(s TSRMLS_CC)); + { + enum_func_status ret = s-m-parse_execute_response(s TSRMLS_CC); + DBG_RETURN(ret); + } } /* }}} */ @@ -556,6 +561,14 @@ } } } +#ifndef MYSQLND_DONT_SKIP_OUT_PARAMS_RESULTSET + if (stmt-upsert_status.server_status SERVER_PS_OUT_PARAMS) { + s-m-free_stmt_content(s TSRMLS_CC); + DBG_INF(PS OUT Variable RSet, skipping); + /* OUT params result set. Skip for now to retain compatibility */ + ret = mysqlnd_stmt_execute_parse_response(s TSRMLS_CC); + } +#endif DBG_INF(ret == PASS? PASS:FAIL); DBG_RETURN(ret); @@ -701,6 +714,8 @@ ret = s-m-parse_execute_response(s TSRMLS_CC); + DBG_INF_FMT(server_status=%u cursor=%u, stmt-upsert_status.server_status, stmt-upsert_status.server_status SERVER_STATUS_CURSOR_EXISTS); + if (ret == PASS conn-last_query_type == QUERY_UPSERT stmt-upsert_status.affected_rows) { MYSQLND_INC_CONN_STATISTIC_W_VALUE(conn-stats, STAT_ROWS_AFFECTED_PS, stmt-upsert_status.affected_rows); } Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c === --- php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c 2010-12-06 13:50:51 UTC (rev 306008) +++ php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c 2010-12-06 13:59:14 UTC (rev 306009) @@ -225,10 +225,15 @@ DBG_RETURN(FAIL); } + DBG_INF_FMT(server_status=%u cursor=%u, stmt-upsert_status.server_status, stmt-upsert_status.server_status SERVER_STATUS_CURSOR_EXISTS); + DBG_INF_FMT(server_status=%u cursor=%u, conn-upsert_status.server_status, conn-upsert_status.server_status SERVER_STATUS_CURSOR_EXISTS); + /* Free space for next result */ s-m-free_stmt_content(s TSRMLS_CC); - - DBG_RETURN(s-m-parse_execute_response(s TSRMLS_CC)); + { + enum_func_status ret = s-m-parse_execute_response(s TSRMLS_CC); + DBG_RETURN(ret); + } } /* }}} */ @@ -556,6 +561,14 @@ } } } +#ifndef MYSQLND_DONT_SKIP_OUT_PARAMS_RESULTSET + if (stmt-upsert_status.server_status SERVER_PS_OUT_PARAMS) { + s-m-free_stmt_content(s TSRMLS_CC); + DBG_INF(PS OUT Variable RSet, skipping); + /* OUT params result set. Skip for now to retain compatibility */ + ret = mysqlnd_stmt_execute_parse_response(s TSRMLS_CC); + } +#endif DBG_INF(ret == PASS? PASS:FAIL); DBG_RETURN(ret); @@ -701,6 +714,8 @@ ret = s-m-parse_execute_response(s TSRMLS_CC); + DBG_INF_FMT(server_status=%u cursor=%u, stmt-upsert_status.server_status, stmt-upsert_status.server_status SERVER_STATUS_CURSOR_EXISTS); + if (ret == PASS conn-last_query_type == QUERY_UPSERT stmt-upsert_status.affected_rows) { MYSQLND_INC_CONN_STATISTIC_W_VALUE(conn-stats, STAT_ROWS_AFFECTED_PS, stmt-upsert_status.affected_rows); } -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
[PHP-CVS] svn: /php/php-src/ branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c trunk/ext/mysqlnd/mysqlnd_ps.c
andrey Wed, 29 Sep 2010 13:18:07 + Revision: http://svn.php.net/viewvc?view=revisionrevision=303855 Log: Fix a problem that leads to leaks in plugins that use stmt local data - no free is called for statements that are over-prepared Changed paths: U php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c U php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c === --- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c 2010-09-29 11:40:57 UTC (rev 303854) +++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c 2010-09-29 13:18:07 UTC (rev 303855) @@ -433,13 +433,19 @@ } if (stmt_to_prepare != stmt) { - /* Free old buffers, binding and resources on server */ - s-m-net_close(s, TRUE TSRMLS_CC); - - memcpy(stmt, stmt_to_prepare, sizeof(MYSQLND_STMT_DATA)); - - /* Now we will have a clean new statement object */ - mnd_pefree(stmt_to_prepare, stmt_to_prepare-persistent); + /* swap */ + size_t real_size = sizeof(MYSQLND_STMT) + mysqlnd_plugin_count() * sizeof(void *); + char * tmp_swap = mnd_malloc(real_size); + memcpy(tmp_swap, s, real_size); + memcpy(s, s_to_prepare, real_size); + memcpy(s_to_prepare, tmp_swap, real_size); + mnd_free(tmp_swap); + { + MYSQLND_STMT_DATA * tmp_swap_data = stmt_to_prepare; + stmt_to_prepare = stmt; + stmt = tmp_swap_data; + } + s_to_prepare-m-dtor(s_to_prepare, TRUE TSRMLS_CC); } stmt-state = MYSQLND_STMT_PREPARED; DBG_INF(PASS); Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c === --- php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c 2010-09-29 11:40:57 UTC (rev 303854) +++ php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c 2010-09-29 13:18:07 UTC (rev 303855) @@ -433,13 +433,19 @@ } if (stmt_to_prepare != stmt) { - /* Free old buffers, binding and resources on server */ - s-m-net_close(s, TRUE TSRMLS_CC); - - memcpy(stmt, stmt_to_prepare, sizeof(MYSQLND_STMT_DATA)); - - /* Now we will have a clean new statement object */ - mnd_pefree(stmt_to_prepare, stmt_to_prepare-persistent); + /* swap */ + size_t real_size = sizeof(MYSQLND_STMT) + mysqlnd_plugin_count() * sizeof(void *); + char * tmp_swap = mnd_malloc(real_size); + memcpy(tmp_swap, s, real_size); + memcpy(s, s_to_prepare, real_size); + memcpy(s_to_prepare, tmp_swap, real_size); + mnd_free(tmp_swap); + { + MYSQLND_STMT_DATA * tmp_swap_data = stmt_to_prepare; + stmt_to_prepare = stmt; + stmt = tmp_swap_data; + } + s_to_prepare-m-dtor(s_to_prepare, TRUE TSRMLS_CC); } stmt-state = MYSQLND_STMT_PREPARED; DBG_INF(PASS); -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
[PHP-CVS] svn: /php/php-src/ branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c trunk/ext/mysqlnd/mysqlnd_ps.c
andrey Thu, 10 Jun 2010 09:37:58 + Revision: http://svn.php.net/viewvc?view=revisionrevision=300346 Log: void functions return nothing Changed paths: U php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c U php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c === --- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c 2010-06-10 09:13:22 UTC (rev 300345) +++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c 2010-06-10 09:37:58 UTC (rev 300346) @@ -2016,7 +2016,7 @@ MYSQLND_STMT_DATA * stmt = s? s-data:NULL; DBG_ENTER(mysqlnd_stmt_separate_one_result_bind); if (!stmt) { - DBG_RETURN(FAIL); + DBG_VOID_RETURN; } DBG_INF_FMT(stmt=%lu result_bind=%p field_count=%u param_no=%d, stmt-stmt_id, stmt-result_bind, stmt-field_count, param_no); Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c === --- php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c 2010-06-10 09:13:22 UTC (rev 300345) +++ php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c 2010-06-10 09:37:58 UTC (rev 300346) @@ -2016,7 +2016,7 @@ MYSQLND_STMT_DATA * stmt = s? s-data:NULL; DBG_ENTER(mysqlnd_stmt_separate_one_result_bind); if (!stmt) { - DBG_RETURN(FAIL); + DBG_VOID_RETURN; } DBG_INF_FMT(stmt=%lu result_bind=%p field_count=%u param_no=%d, stmt-stmt_id, stmt-result_bind, stmt-field_count, param_no); -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
[PHP-CVS] svn: /php/php-src/ branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c trunk/ext/mysqlnd/mysqlnd_ps.c
andrey Mon, 31 May 2010 18:10:25 + Revision: http://svn.php.net/viewvc?view=revisionrevision=29 Log: Check if data is correct and initialize in a safe manner Changed paths: U php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c U php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c === --- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c 2010-05-31 17:57:03 UTC (rev 28) +++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c 2010-05-31 18:10:25 UTC (rev 29) @@ -62,7 +62,7 @@ static MYSQLND_RES * MYSQLND_METHOD(mysqlnd_stmt, store_result)(MYSQLND_STMT * const s TSRMLS_DC) { - MYSQLND_STMT_DATA * stmt = s-data; + MYSQLND_STMT_DATA * stmt = s? s-data:NULL; enum_func_status ret; MYSQLND *conn = stmt-conn; MYSQLND_RES *result; @@ -127,7 +127,7 @@ static MYSQLND_RES * MYSQLND_METHOD(mysqlnd_stmt, get_result)(MYSQLND_STMT * const s TSRMLS_DC) { - MYSQLND_STMT_DATA * stmt = s-data; + MYSQLND_STMT_DATA * stmt = s? s-data:NULL; MYSQLND *conn = stmt-conn; MYSQLND_RES *result; @@ -192,7 +192,7 @@ static zend_bool MYSQLND_METHOD(mysqlnd_stmt, more_results)(const MYSQLND_STMT * s TSRMLS_DC) { - MYSQLND_STMT_DATA * stmt = s-data; + MYSQLND_STMT_DATA * stmt = s? s-data:NULL; DBG_ENTER(mysqlnd_stmt::more_results); /* (conn-state == CONN_NEXT_RESULT_PENDING) too */ DBG_RETURN((stmt-conn (stmt-conn-upsert_status.server_status @@ -207,7 +207,7 @@ static enum_func_status MYSQLND_METHOD(mysqlnd_stmt, next_result)(MYSQLND_STMT * s TSRMLS_DC) { - MYSQLND_STMT_DATA * stmt = s-data; + MYSQLND_STMT_DATA * stmt = s? s-data:NULL; MYSQLND *conn = stmt-conn; DBG_ENTER(mysqlnd_stmt::next_result); @@ -233,7 +233,7 @@ static enum_func_status mysqlnd_stmt_skip_metadata(MYSQLND_STMT * s TSRMLS_DC) { - MYSQLND_STMT_DATA * stmt = s-data; + MYSQLND_STMT_DATA * stmt = s? s-data:NULL; /* Follows parameter metadata, we have just to skip it, as libmysql does */ unsigned int i = 0; enum_func_status ret = FAIL; @@ -267,7 +267,7 @@ static enum_func_status mysqlnd_stmt_read_prepare_response(MYSQLND_STMT * s TSRMLS_DC) { - MYSQLND_STMT_DATA * stmt = s-data; + MYSQLND_STMT_DATA * stmt = s? s-data:NULL; MYSQLND_PACKET_PREPARE_RESPONSE * prepare_resp; enum_func_status ret = FAIL; @@ -306,7 +306,7 @@ static enum_func_status mysqlnd_stmt_prepare_read_eof(MYSQLND_STMT * s TSRMLS_DC) { - MYSQLND_STMT_DATA * stmt = s-data; + MYSQLND_STMT_DATA * stmt = s? s-data:NULL; MYSQLND_PACKET_EOF * fields_eof; enum_func_status ret; @@ -342,7 +342,7 @@ static enum_func_status MYSQLND_METHOD(mysqlnd_stmt, prepare)(MYSQLND_STMT * const s, const char * const query, unsigned int query_len TSRMLS_DC) { - MYSQLND_STMT_DATA * stmt = s-data; + MYSQLND_STMT_DATA * stmt = s? s-data:NULL; MYSQLND_STMT * s_to_prepare = s; MYSQLND_STMT_DATA * stmt_to_prepare = stmt; @@ -442,7 +442,7 @@ static enum_func_status mysqlnd_stmt_execute_parse_response(MYSQLND_STMT * const s TSRMLS_DC) { - MYSQLND_STMT_DATA * stmt = s-data; + MYSQLND_STMT_DATA * stmt = s? s-data:NULL; enum_func_status ret; MYSQLND * conn = stmt-conn; @@ -532,7 +532,7 @@ static enum_func_status MYSQLND_METHOD(mysqlnd_stmt, execute)(MYSQLND_STMT * const s TSRMLS_DC) { - MYSQLND_STMT_DATA * stmt = s-data; + MYSQLND_STMT_DATA * stmt = s? s-data:NULL; enum_func_status ret; MYSQLND * conn = stmt-conn; zend_uchar *request = NULL; @@ -675,7 +675,7 @@ mysqlnd_fetch_stmt_row_buffered(MYSQLND_RES *result, void *param, unsigned int flags, zend_bool *fetched_anything TSRMLS_DC) { MYSQLND_STMT * s = (MYSQLND_STMT *) param; - MYSQLND_STMT_DATA * stmt = s-data; + MYSQLND_STMT_DATA * stmt = s? s-data:NULL; MYSQLND_RES_BUFFERED *set = result-stored_data; unsigned int field_count = result-meta-field_count; @@ -900,7 +900,7 @@ static MYSQLND_RES * MYSQLND_METHOD(mysqlnd_stmt, use_result)(MYSQLND_STMT * s TSRMLS_DC) { - MYSQLND_STMT_DATA * stmt = s-data; + MYSQLND_STMT_DATA * stmt = s? s-data:NULL; MYSQLND_RES *result; MYSQLND *conn = stmt-conn; @@ -1087,7 +1087,7 @@ static enum_func_status MYSQLND_METHOD(mysqlnd_stmt, fetch)(MYSQLND_STMT * const s, zend_bool * const fetched_anything TSRMLS_DC) { - MYSQLND_STMT_DATA * stmt = s-data; + MYSQLND_STMT_DATA * stmt = s? s-data:NULL; enum_func_status ret; DBG_ENTER(mysqlnd_stmt::fetch); DBG_INF_FMT(stmt=%lu, stmt-stmt_id); @@ -1138,7 +1138,7 @@ static enum_func_status MYSQLND_METHOD(mysqlnd_stmt, reset)(MYSQLND_STMT * const s TSRMLS_DC) { - MYSQLND_STMT_DATA * stmt = s-data; + MYSQLND_STMT_DATA * stmt = s? s-data:NULL; enum_func_status ret = PASS; zend_uchar cmd_buf[STMT_ID_LENGTH /* statement id */]; @@ -1207,7 +1207,7 @@ MYSQLND_METHOD(mysqlnd_stmt, send_long_data)(MYSQLND_STMT * const s, unsigned int param_no, const char * const data, unsigned long length TSRMLS_DC) { -
[PHP-CVS] svn: /php/php-src/ branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c trunk/ext/mysqlnd/mysqlnd_ps.c
andrey Mon, 31 May 2010 18:18:37 + Revision: http://svn.php.net/viewvc?view=revisionrevision=30 Log: Don't reference row_packet before checking if dereferencing is possible Changed paths: U php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c U php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c === --- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c 2010-05-31 18:10:25 UTC (rev 29) +++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c 2010-05-31 18:18:37 UTC (rev 30) @@ -308,7 +308,7 @@ { MYSQLND_STMT_DATA * stmt = s? s-data:NULL; MYSQLND_PACKET_EOF * fields_eof; - enum_func_status ret; + enum_func_status ret = FAIL; DBG_ENTER(mysqlnd_stmt_prepare_read_eof); DBG_INF_FMT(stmt=%lu, stmt-stmt_id); @@ -371,6 +371,9 @@ fails, we will scrap it. */ s_to_prepare = stmt-conn-m-stmt_init(stmt-conn TSRMLS_CC); + if (!s_to_prepare) { + goto fail; + } stmt_to_prepare = s_to_prepare-data; } @@ -427,7 +430,7 @@ DBG_RETURN(PASS); fail: - if (stmt_to_prepare != stmt) { + if (stmt_to_prepare != stmt s_to_prepare) { s_to_prepare-m-dtor(s_to_prepare, TRUE TSRMLS_CC); } stmt-state = MYSQLND_STMT_INITTED; @@ -776,7 +779,7 @@ enum_func_status ret; MYSQLND_STMT * s = (MYSQLND_STMT *) param; MYSQLND_STMT_DATA * stmt = s? s-data:NULL; - MYSQLND_PACKET_ROW *row_packet = result-row_packet; + MYSQLND_PACKET_ROW * row_packet; DBG_ENTER(mysqlnd_stmt_fetch_row_unbuffered); @@ -793,6 +796,10 @@ DBG_ERR(command out of sync); DBG_RETURN(FAIL); } + if (!(row_packet = result-row_packet)) { + DBG_RETURN(FAIL); + } + /* Let the row packet fill our buffer and skip additional malloc + memcpy */ row_packet-skip_extraction = stmt stmt-result_bind? FALSE:TRUE; @@ -943,9 +950,9 @@ { enum_func_status ret; MYSQLND_STMT * s = (MYSQLND_STMT *) param; - MYSQLND_STMT_DATA * stmt = s? s-data : NULL; + MYSQLND_STMT_DATA * stmt = s? s-data:NULL; zend_uchar buf[STMT_ID_LENGTH /* statement id */ + 4 /* number of rows to fetch */]; - MYSQLND_PACKET_ROW *row_packet = result-row_packet; + MYSQLND_PACKET_ROW * row_packet; DBG_ENTER(mysqlnd_fetch_stmt_row_cursor); @@ -963,6 +970,9 @@ DBG_ERR(command out of sync); DBG_RETURN(FAIL); } + if (!(row_packet = result-row_packet)) { + DBG_RETURN(FAIL); + } SET_EMPTY_ERROR(stmt-error_info); SET_EMPTY_ERROR(stmt-conn-error_info); @@ -1466,7 +1476,6 @@ DBG_ENTER(mysqlnd_stmt::bind_result); DBG_INF_FMT(stmt=%lu field_count=%u, stmt-stmt_id, stmt-field_count); - if (stmt-state MYSQLND_STMT_PREPARED) { SET_STMT_ERROR(stmt, CR_NO_PREPARE_STMT, UNKNOWN_SQLSTATE, mysqlnd_stmt_not_prepared); if (result_bind) { @@ -1673,7 +1682,6 @@ if (!stmt-param_count) { return NULL; } - return NULL; } /* }}} */ Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c === --- php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c 2010-05-31 18:10:25 UTC (rev 29) +++ php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c 2010-05-31 18:18:37 UTC (rev 30) @@ -308,7 +308,7 @@ { MYSQLND_STMT_DATA * stmt = s? s-data:NULL; MYSQLND_PACKET_EOF * fields_eof; - enum_func_status ret; + enum_func_status ret = FAIL; DBG_ENTER(mysqlnd_stmt_prepare_read_eof); DBG_INF_FMT(stmt=%lu, stmt-stmt_id); @@ -371,6 +371,9 @@ fails, we will scrap it. */ s_to_prepare = stmt-conn-m-stmt_init(stmt-conn TSRMLS_CC); + if (!s_to_prepare) { + goto fail; + } stmt_to_prepare = s_to_prepare-data; } @@ -427,7 +430,7 @@ DBG_RETURN(PASS); fail: - if (stmt_to_prepare != stmt) { + if (stmt_to_prepare != stmt s_to_prepare) { s_to_prepare-m-dtor(s_to_prepare, TRUE TSRMLS_CC); } stmt-state = MYSQLND_STMT_INITTED; @@ -776,7 +779,7 @@ enum_func_status ret; MYSQLND_STMT * s = (MYSQLND_STMT *) param; MYSQLND_STMT_DATA * stmt = s? s-data:NULL; - MYSQLND_PACKET_ROW *row_packet = result-row_packet; + MYSQLND_PACKET_ROW * row_packet; DBG_ENTER(mysqlnd_stmt_fetch_row_unbuffered); @@ -793,6 +796,10 @@ DBG_ERR(command out of sync); DBG_RETURN(FAIL); }
[PHP-CVS] svn: /php/php-src/ branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c trunk/ext/mysqlnd/mysqlnd_ps.c
andrey Mon, 31 May 2010 18:26:19 + Revision: http://svn.php.net/viewvc?view=revisionrevision=31 Log: More check for valid MYSQLND_STMT before using it Changed paths: U php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c U php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c === --- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c 2010-05-31 18:18:37 UTC (rev 30) +++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c 2010-05-31 18:26:19 UTC (rev 31) @@ -195,7 +195,7 @@ MYSQLND_STMT_DATA * stmt = s? s-data:NULL; DBG_ENTER(mysqlnd_stmt::more_results); /* (conn-state == CONN_NEXT_RESULT_PENDING) too */ - DBG_RETURN((stmt-conn (stmt-conn-upsert_status.server_status + DBG_RETURN((stmt stmt-conn (stmt-conn-upsert_status.server_status SERVER_MORE_RESULTS_EXISTS))? TRUE: FALSE); @@ -1569,7 +1569,7 @@ MYSQLND_METHOD(mysqlnd_stmt, insert_id)(const MYSQLND_STMT * const s TSRMLS_DC) { MYSQLND_STMT_DATA * stmt = s? s-data:NULL; - return stmt-upsert_status.last_insert_id; + return stmt? stmt-upsert_status.last_insert_id : 0; } /* }}} */ @@ -1579,7 +1579,7 @@ MYSQLND_METHOD(mysqlnd_stmt, affected_rows)(const MYSQLND_STMT * const s TSRMLS_DC) { MYSQLND_STMT_DATA * stmt = s? s-data:NULL; - return stmt-upsert_status.affected_rows; + return stmt? stmt-upsert_status.affected_rows : 0; } /* }}} */ @@ -1589,7 +1589,7 @@ MYSQLND_METHOD(mysqlnd_stmt, num_rows)(const MYSQLND_STMT * const s TSRMLS_DC) { MYSQLND_STMT_DATA * stmt = s? s-data:NULL; - return stmt-result? mysqlnd_num_rows(stmt-result):0; + return stmt stmt-result? mysqlnd_num_rows(stmt-result):0; } /* }}} */ @@ -1599,7 +1599,7 @@ MYSQLND_METHOD(mysqlnd_stmt, warning_count)(const MYSQLND_STMT * const s TSRMLS_DC) { MYSQLND_STMT_DATA * stmt = s? s-data:NULL; - return stmt-upsert_status.warning_count; + return stmt? stmt-upsert_status.warning_count : 0; } /* }}} */ @@ -1609,7 +1609,7 @@ MYSQLND_METHOD(mysqlnd_stmt, server_status)(const MYSQLND_STMT * const s TSRMLS_DC) { MYSQLND_STMT_DATA * stmt = s? s-data:NULL; - return stmt-upsert_status.server_status; + return stmt? stmt-upsert_status.server_status : 0; } /* }}} */ @@ -1619,7 +1619,7 @@ MYSQLND_METHOD(mysqlnd_stmt, field_count)(const MYSQLND_STMT * const s TSRMLS_DC) { MYSQLND_STMT_DATA * stmt = s? s-data:NULL; - return stmt-field_count; + return stmt? stmt-field_count : 0; } /* }}} */ @@ -1629,7 +1629,7 @@ MYSQLND_METHOD(mysqlnd_stmt, param_count)(const MYSQLND_STMT * const s TSRMLS_DC) { MYSQLND_STMT_DATA * stmt = s? s-data:NULL; - return stmt-param_count; + return stmt? stmt-param_count : 0; } /* }}} */ @@ -1639,7 +1639,7 @@ MYSQLND_METHOD(mysqlnd_stmt, errno)(const MYSQLND_STMT * const s TSRMLS_DC) { MYSQLND_STMT_DATA * stmt = s? s-data:NULL; - return stmt-error_info.error_no; + return stmt? stmt-error_info.error_no : 0; } /* }}} */ @@ -1649,7 +1649,7 @@ MYSQLND_METHOD(mysqlnd_stmt, error)(const MYSQLND_STMT * const s TSRMLS_DC) { MYSQLND_STMT_DATA * stmt = s? s-data:NULL; - return stmt-error_info.error; + return stmt? stmt-error_info.error : 0; } /* }}} */ @@ -1659,7 +1659,7 @@ MYSQLND_METHOD(mysqlnd_stmt, sqlstate)(const MYSQLND_STMT * const s TSRMLS_DC) { MYSQLND_STMT_DATA * stmt = s? s-data:NULL; - return stmt-error_info.sqlstate[0] ? stmt-error_info.sqlstate:MYSQLND_SQLSTATE_NULL; + return stmt stmt-error_info.sqlstate[0] ? stmt-error_info.sqlstate:MYSQLND_SQLSTATE_NULL; } /* }}} */ @@ -1669,7 +1669,7 @@ MYSQLND_METHOD(mysqlnd_stmt, data_seek)(const MYSQLND_STMT * const s, uint64_t row TSRMLS_DC) { MYSQLND_STMT_DATA * stmt = s? s-data:NULL; - return stmt-result? stmt-result-m.seek_data(stmt-result, row TSRMLS_CC) : FAIL; + return stmt stmt-result? stmt-result-m.seek_data(stmt-result, row TSRMLS_CC) : FAIL; } /* }}} */ @@ -1679,7 +1679,7 @@ MYSQLND_METHOD(mysqlnd_stmt, param_metadata)(MYSQLND_STMT * const s TSRMLS_DC) { MYSQLND_STMT_DATA * stmt = s? s-data:NULL; - if (!stmt-param_count) { + if (!stmt || !stmt-param_count) { return NULL; } return NULL; @@ -2136,6 +2136,9 @@ { MYSQLND_STMT_DATA * stmt = s? s-data:NULL; DBG_ENTER(mysqlnd_stmt::alloc_param_bind); + if (!stmt) { + DBG_RETURN(NULL); + } DBG_RETURN(mnd_pecalloc(stmt-param_count, sizeof(MYSQLND_PARAM_BIND), stmt-persistent)); } /* }}} */ @@ -2147,6 +2150,9 @@ { MYSQLND_STMT_DATA * stmt = s? s-data:NULL; DBG_ENTER(mysqlnd_stmt::alloc_result_bind); + if (!stmt) { + DBG_RETURN(NULL); + } DBG_RETURN(mnd_pecalloc(stmt-field_count, sizeof(MYSQLND_RESULT_BIND), stmt-persistent)); } /* }}} */ @@ -2157,7 +2163,9 @@ MYSQLND_METHOD(mysqlnd_stmt, free_parameter_bind)(MYSQLND_STMT * const s, MYSQLND_PARAM_BIND * param_bind TSRMLS_DC) { MYSQLND_STMT_DATA * stmt = s? s-data:NULL; - mnd_pefree(param_bind, stmt-persistent);
[PHP-CVS] svn: /php/php-src/ branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c trunk/ext/mysqlnd/mysqlnd_ps.c
andrey Tue, 25 May 2010 22:42:25 + Revision: http://svn.php.net/viewvc?view=revisionrevision=299762 Log: Gracefully handle OOM in mysqlnd_stmt_init. Release the handle and return NULL. Changed paths: U php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c U php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c === --- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c 2010-05-25 22:40:47 UTC (rev 299761) +++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c 2010-05-25 22:42:25 UTC (rev 299762) @@ -2194,25 +2194,45 @@ { size_t alloc_size = sizeof(MYSQLND_STMT) + mysqlnd_plugin_count() * sizeof(void *); MYSQLND_STMT * ret = mnd_pecalloc(1, alloc_size, conn-persistent); - MYSQLND_STMT_DATA * stmt = ret-data = mnd_pecalloc(1, sizeof(MYSQLND_STMT_DATA), conn-persistent); + MYSQLND_STMT_DATA * stmt = NULL; DBG_ENTER(_mysqlnd_stmt_init); - DBG_INF_FMT(stmt=%p, stmt); + do { + if (!ret) { + break; + } + ret-m = mysqlnd_stmt_methods; - ret-m = mysqlnd_stmt_methods; - stmt-persistent = conn-persistent; - stmt-state = MYSQLND_STMT_INITTED; - stmt-execute_cmd_buffer.length = 4096; - stmt-execute_cmd_buffer.buffer = mnd_pemalloc(stmt-execute_cmd_buffer.length, stmt-persistent); + stmt = ret-data = mnd_pecalloc(1, sizeof(MYSQLND_STMT_DATA), conn-persistent); + DBG_INF_FMT(stmt=%p, stmt); + if (!stmt) { + break; + } + stmt-persistent = conn-persistent; + stmt-state = MYSQLND_STMT_INITTED; + stmt-execute_cmd_buffer.length = 4096; + stmt-execute_cmd_buffer.buffer = mnd_pemalloc(stmt-execute_cmd_buffer.length, stmt-persistent); + if (!stmt-execute_cmd_buffer.buffer) { + break; + } - stmt-prefetch_rows = MYSQLND_DEFAULT_PREFETCH_ROWS; - /* - Mark that we reference the connection, thus it won't be - be destructed till there is open statements. The last statement - or normal query result will close it then. - */ - stmt-conn = conn-m-get_reference(conn TSRMLS_CC); - DBG_RETURN(ret); + stmt-prefetch_rows = MYSQLND_DEFAULT_PREFETCH_ROWS; + /* + Mark that we reference the connection, thus it won't be + be destructed till there is open statements. The last statement + or normal query result will close it then. + */ + stmt-conn = conn-m-get_reference(conn TSRMLS_CC); + + DBG_RETURN(ret); + } while (0); + + SET_OOM_ERROR(conn-error_info); + if (ret) { + ret-m-dtor(ret, TRUE TSRMLS_CC); + ret = NULL; + } + DBG_RETURN(NULL); } /* }}} */ Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c === --- php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c 2010-05-25 22:40:47 UTC (rev 299761) +++ php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c 2010-05-25 22:42:25 UTC (rev 299762) @@ -2194,25 +2194,45 @@ { size_t alloc_size = sizeof(MYSQLND_STMT) + mysqlnd_plugin_count() * sizeof(void *); MYSQLND_STMT * ret = mnd_pecalloc(1, alloc_size, conn-persistent); - MYSQLND_STMT_DATA * stmt = ret-data = mnd_pecalloc(1, sizeof(MYSQLND_STMT_DATA), conn-persistent); + MYSQLND_STMT_DATA * stmt = NULL; DBG_ENTER(_mysqlnd_stmt_init); - DBG_INF_FMT(stmt=%p, stmt); + do { + if (!ret) { + break; + } + ret-m = mysqlnd_stmt_methods; - ret-m = mysqlnd_stmt_methods; - stmt-persistent = conn-persistent; - stmt-state = MYSQLND_STMT_INITTED; - stmt-execute_cmd_buffer.length = 4096; - stmt-execute_cmd_buffer.buffer = mnd_pemalloc(stmt-execute_cmd_buffer.length, stmt-persistent); + stmt = ret-data = mnd_pecalloc(1, sizeof(MYSQLND_STMT_DATA), conn-persistent); + DBG_INF_FMT(stmt=%p, stmt); + if (!stmt) { + break; + } + stmt-persistent = conn-persistent; + stmt-state = MYSQLND_STMT_INITTED; + stmt-execute_cmd_buffer.length = 4096; + stmt-execute_cmd_buffer.buffer = mnd_pemalloc(stmt-execute_cmd_buffer.length, stmt-persistent); + if (!stmt-execute_cmd_buffer.buffer) { + break; + } - stmt-prefetch_rows = MYSQLND_DEFAULT_PREFETCH_ROWS; - /* - Mark that we reference the connection, thus it won't be - be destructed till