diff --git a/NEWS b/NEWS index 69728b4aec6..70d667af034 100644 --- a/NEWS +++ b/NEWS @@ -14,6 +14,10 @@ PHP NEWS . Fixed bug #72658 (Locale::lookup() / locale_lookup() hangs if no match found). (Anatol) +- Mysqlnd: + . Fixed bug #71863 (Segfault when EXPLAIN with "Unknown column" error when + using MariaDB). (Andrey) + - Reflection: . Fixed bug #72661 (ReflectionType::__toString crashes with iterable). (Laruence) diff --git a/ext/mysqli/tests/bug71863.phpt b/ext/mysqli/tests/bug71863.phpt new file mode 100644 index 00000000000..889792822f7 --- /dev/null +++ b/ext/mysqli/tests/bug71863.phpt @@ -0,0 +1,37 @@ +--TEST-- +Bug #71863 Segfault when EXPLAIN with "Unknown Column" Error +--SKIPIF-- + +--FILE-- + +--CLEAN-- + +--EXPECTF-- +Warning: mysqli_query(): (42S22/1054): Unknown column 'owner_id' in 'where clause' in %sbug71863.php on line %d +Unknown column 'owner_id' in 'where clause' \ No newline at end of file diff --git a/ext/mysqlnd/mysqlnd_connection.c b/ext/mysqlnd/mysqlnd_connection.c index 701bc282e11..a3300dc6d90 100644 --- a/ext/mysqlnd/mysqlnd_connection.c +++ b/ext/mysqlnd/mysqlnd_connection.c @@ -215,11 +215,11 @@ MYSQLND_CLASS_METHODS_START(mysqlnd_connection_state) MYSQLND_CLASS_METHODS_END; -/* {{{ mysqlnd_upsert_status_init */ +/* {{{ mysqlnd_connection_state_init */ PHPAPI void mysqlnd_connection_state_init(struct st_mysqlnd_connection_state * const state) { - DBG_ENTER("mysqlnd_error_info_init"); + DBG_ENTER("mysqlnd_connection_state_init"); state->m = &MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_connection_state); state->state = CONN_ALLOCED; DBG_VOID_RETURN; diff --git a/ext/mysqlnd/mysqlnd_result.c b/ext/mysqlnd/mysqlnd_result.c index c4aa537eb07..513214d3fa4 100644 --- a/ext/mysqlnd/mysqlnd_result.c +++ b/ext/mysqlnd/mysqlnd_result.c @@ -259,6 +259,8 @@ MYSQLND_METHOD(mysqlnd_result_buffered, free_result)(MYSQLND_RES_BUFFERED * cons DBG_ENTER("mysqlnd_result_buffered::free_result"); DBG_INF_FMT("Freeing "MYSQLND_LLU_SPEC" row(s)", set->row_count); + mysqlnd_error_info_free_contents(&set->error_info); + if (set->type == MYSQLND_BUFFERED_TYPE_ZVAL) { MYSQLND_METHOD(mysqlnd_result_buffered_zval, free_result)((MYSQLND_RES_BUFFERED_ZVAL *) set); } if (set->type == MYSQLND_BUFFERED_TYPE_C) { @@ -1954,7 +1956,6 @@ mysqlnd_result_unbuffered_init(const unsigned int field_count, const zend_bool p if (!ret) { DBG_RETURN(NULL); } - if (!(ret->lengths = mnd_pecalloc(field_count, sizeof(size_t), persistent))) { mnd_pefree(ret, persistent); DBG_RETURN(NULL); @@ -1995,6 +1996,10 @@ mysqlnd_result_buffered_zval_init(const unsigned int field_count, const zend_boo if (!ret) { DBG_RETURN(NULL); } + if (FAIL == mysqlnd_error_info_init(&ret->error_info, persistent)) { + mnd_pefree(ret, persistent); + DBG_RETURN(NULL); + } if (!(ret->lengths = mnd_pecalloc(field_count, sizeof(size_t), persistent))) { mnd_pefree(ret, persistent); DBG_RETURN(NULL); @@ -2038,6 +2043,10 @@ mysqlnd_result_buffered_c_init(const unsigned int field_count, const zend_bool p if (!ret) { DBG_RETURN(NULL); } + if (FAIL == mysqlnd_error_info_init(&ret->error_info, persistent)) { + mnd_pefree(ret, persistent); + DBG_RETURN(NULL); + } if (!(ret->lengths = mnd_pecalloc(field_count, sizeof(size_t), persistent))) { mnd_pefree(ret, persistent); DBG_RETURN(NULL);