From: Andrey Hristov Date: Thu, 26 Aug 2010 14:51:58 +0000 (+0000) Subject: Add proper magic_quotes_runtime support for mysqlnd, but X-Git-Tag: php-5.3.4RC1~308 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d9f50d95e37d915f0a45f747404fb055d5aeff65;p=php Add proper magic_quotes_runtime support for mysqlnd, but in mysqli, so we don't need to tamper myslqnd. magic_quotes_runtime are deprecated and not existant in 5.4, thus only fixing in the branch. --- diff --git a/ext/mysqli/mysqli.c b/ext/mysqli/mysqli.c index f92ba0cb49..474541fecb 100644 --- a/ext/mysqli/mysqli.c +++ b/ext/mysqli/mysqli.c @@ -1172,6 +1172,7 @@ void php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAMETERS, int override_flags /* check if we need magic quotes */ if (PG(magic_quotes_runtime)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "magic_quotes_runtime are deprecated since PHP 5.3"); Z_TYPE_P(res) = IS_STRING; Z_STRVAL_P(res) = php_addslashes(row[i], field_len[i], &Z_STRLEN_P(res), 0 TSRMLS_CC); } else { @@ -1198,7 +1199,50 @@ void php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAMETERS, int override_flags } } #else - mysqlnd_fetch_into(result, ((fetchtype & MYSQLI_NUM)? MYSQLND_FETCH_NUM:0) | ((fetchtype & MYSQLI_ASSOC)? MYSQLND_FETCH_ASSOC:0), return_value, MYSQLND_MYSQLI); + if (PG(magic_quotes_runtime)) { + HashPosition pos_values; + zval **entry_values; + zval new_return_value; + char * string_key; + uint string_key_len; + ulong num_key; + php_error_docref(NULL TSRMLS_CC, E_WARNING, "magic_quotes_runtime are deprecated since PHP 5.3"); + + array_init(return_value); + + mysqlnd_fetch_into(result, ((fetchtype & MYSQLI_NUM)? MYSQLND_FETCH_NUM:0) | ((fetchtype & MYSQLI_ASSOC)? MYSQLND_FETCH_ASSOC:0), &new_return_value, MYSQLND_MYSQLI); + + zend_hash_internal_pointer_reset_ex(Z_ARRVAL(new_return_value), &pos_values); + while (zend_hash_get_current_data_ex(Z_ARRVAL(new_return_value), (void **)&entry_values, &pos_values) == SUCCESS) { + if (Z_TYPE_PP(entry_values) == IS_STRING) { + int new_str_len; + char * new_str = php_addslashes(Z_STRVAL_PP(entry_values), Z_STRLEN_PP(entry_values), &new_str_len, 0 TSRMLS_CC); + switch (zend_hash_get_current_key_ex(Z_ARRVAL(new_return_value), &string_key, &string_key_len, &num_key, 0, &pos_values)) { + case HASH_KEY_IS_LONG: + add_index_stringl(return_value, num_key, new_str, new_str_len, 0); + break; + case HASH_KEY_IS_STRING: + add_assoc_stringl_ex(return_value, string_key, string_key_len, new_str, new_str_len, 0); + break; + } + } else { + zval_add_ref(entry_values); + switch (zend_hash_get_current_key_ex(Z_ARRVAL(new_return_value), &string_key, &string_key_len, &num_key, 0, &pos_values)) { + case HASH_KEY_IS_LONG: + add_index_zval(return_value, num_key, *entry_values); + break; + case HASH_KEY_IS_STRING: + add_assoc_zval_ex(return_value, string_key, string_key_len, *entry_values); + break; + } + } + zend_hash_move_forward_ex(Z_ARRVAL(new_return_value), &pos_values); + } + zval_dtor(&new_return_value); + } else { + mysqlnd_fetch_into(result, ((fetchtype & MYSQLI_NUM)? MYSQLND_FETCH_NUM:0) | ((fetchtype & MYSQLI_ASSOC)? MYSQLND_FETCH_ASSOC:0), return_value, MYSQLND_MYSQLI); + } + #endif if (into_object && Z_TYPE_P(return_value) != IS_NULL) { diff --git a/ext/mysqlnd/mysqlnd_result.c b/ext/mysqlnd/mysqlnd_result.c index 2079240f64..aca049f831 100644 --- a/ext/mysqlnd/mysqlnd_result.c +++ b/ext/mysqlnd/mysqlnd_result.c @@ -1506,6 +1506,9 @@ MYSQLND_METHOD(mysqlnd_res, field_tell)(const MYSQLND_RES * const result TSRMLS_ /* }}} */ +/* for php_addslashes */ +#include "ext/standard/php_string.h" + /* {{{ mysqlnd_res::fetch_into */ static void MYSQLND_METHOD(mysqlnd_res, fetch_into)(MYSQLND_RES * result, unsigned int flags, @@ -1540,9 +1543,7 @@ MYSQLND_METHOD(mysqlnd_res, fetch_into)(MYSQLND_RES * result, unsigned int flags break; default:exit(0); } - } else if (extension == MYSQLND_MYSQLI && PG(magic_quotes_runtime)) { - php_error_docref(NULL TSRMLS_CC, E_ERROR, "magic_quotes_runtime are not supported by mysqlnd. They were deprecated in PHP 5.3 "); - } + } /* return_value is IS_NULL for no more data and an array for data. Thus it's ok to return here.