From: Ulf Wendel Date: Tue, 3 Nov 2009 14:56:04 +0000 (+0000) Subject: Fix for bug #49965 . Let mysqli_options() try to cast option values to the appropriat... X-Git-Tag: php-5.4.0alpha1~191^2~2437 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7b22d7222b784d985551ed5e09ff47af0e7e2907;p=php Fix for bug #49965 . Let mysqli_options() try to cast option values to the appropriate type. --- diff --git a/ext/mysqli/mysqli_api.c b/ext/mysqli/mysqli_api.c index 9f4ec568ff..3655b5bf35 100644 --- a/ext/mysqli/mysqli_api.c +++ b/ext/mysqli/mysqli_api.c @@ -1642,6 +1642,65 @@ PHP_FUNCTION(mysqli_num_rows) } /* }}} */ +/* {{{ mysqli_options_get_option_zval_type */ +static int mysqli_options_get_option_zval_type(int option) +{ + switch (option) { +#ifdef MYSQLI_USE_MYSQLND +#if PHP_MAJOR_VERSION >= 6 + case MYSQLND_OPT_NUMERIC_AND_DATETIME_AS_UNICODE: +#endif + case MYSQLND_OPT_NET_CMD_BUFFER_SIZE: + case MYSQLND_OPT_NET_READ_BUFFER_SIZE: +#ifdef MYSQLND_STRING_TO_INT_CONVERSION + case MYSQLND_OPT_INT_AND_FLOAT_NATIVE: +#endif +#endif /* MYSQLI_USE_MYSQLND */ + case MYSQL_OPT_CONNECT_TIMEOUT: + case MYSQL_REPORT_DATA_TRUNCATION: + case MYSQL_OPT_LOCAL_INFILE: + case MYSQL_OPT_NAMED_PIPE: +#ifdef MYSQL_OPT_PROTOCOL + case MYSQL_OPT_PROTOCOL: +#endif /* MySQL 4.1.0 */ +#ifdef MYSQL_OPT_READ_TIMEOUT + case MYSQL_OPT_READ_TIMEOUT: + case MYSQL_OPT_WRITE_TIMEOUT: + case MYSQL_OPT_GUESS_CONNECTION: + case MYSQL_OPT_USE_EMBEDDED_CONNECTION: + case MYSQL_OPT_USE_REMOTE_CONNECTION: + case MYSQL_SECURE_AUTH: +#endif /* MySQL 4.1.1 */ +#ifdef MYSQL_OPT_RECONNECT + case MYSQL_OPT_RECONNECT: +#endif /* MySQL 5.0.13 */ +#ifdef MYSQL_OPT_SSL_VERIFY_SERVER_CERT + case MYSQL_OPT_SSL_VERIFY_SERVER_CERT: +#endif /* MySQL 5.0.23 */ +#ifdef MYSQL_OPT_COMPRESS + case MYSQL_OPT_COMPRESS: +#endif /* mysqlnd @ PHP 5.3.2 */ + return IS_LONG; + +#ifdef MYSQL_SHARED_MEMORY_BASE_NAME + case MYSQL_SHARED_MEMORY_BASE_NAME: +#endif /* MySQL 4.1.0 */ +#ifdef MYSQL_SET_CLIENT_IP + case MYSQL_SET_CLIENT_IP: +#endif /* MySQL 4.1.1 */ + case MYSQL_READ_DEFAULT_FILE: + case MYSQL_READ_DEFAULT_GROUP: + case MYSQL_INIT_COMMAND: + case MYSQL_SET_CHARSET_NAME: + case MYSQL_SET_CHARSET_DIR: + return IS_STRING; + + default: + return IS_NULL; + } +} +/* }}} */ + /* {{{ proto bool mysqli_options(object link, int flags, mixed values) U Set options */ PHP_FUNCTION(mysqli_options) @@ -1652,6 +1711,7 @@ PHP_FUNCTION(mysqli_options) long mysql_option; unsigned int l_value; long ret; + int expected_type; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Olz", &mysql_link, mysqli_link_class_entry, &mysql_option, &mysql_value) == FAILURE) { return; @@ -1664,17 +1724,31 @@ PHP_FUNCTION(mysqli_options) } } - switch (Z_TYPE_PP(&mysql_value)) { - case IS_UNICODE: - zval_unicode_to_string(mysql_value TSRMLS_CC); + expected_type = mysqli_options_get_option_zval_type(mysql_option); + if (expected_type != Z_TYPE_P(mysql_value)) { + switch (expected_type) { + case IS_STRING: + convert_to_string_ex(&mysql_value); + break; + case IS_LONG: + convert_to_long_ex(&mysql_value); + break; + default: + break; + } + } + + switch (expected_type) { case IS_STRING: ret = mysql_options(mysql->mysql, mysql_option, Z_STRVAL_PP(&mysql_value)); break; - default: - convert_to_long_ex(&mysql_value); + case IS_LONG: l_value = Z_LVAL_PP(&mysql_value); ret = mysql_options(mysql->mysql, mysql_option, (char *)&l_value); break; + default: + ret = 1; + break; } RETURN_BOOL(!ret); diff --git a/ext/mysqli/tests/mysqli_options.phpt b/ext/mysqli/tests/mysqli_options.phpt index 1ca3a34a15..1da140b397 100644 --- a/ext/mysqli/tests/mysqli_options.phpt +++ b/ext/mysqli/tests/mysqli_options.phpt @@ -111,6 +111,8 @@ bool(true) bool(true) %s(23) "MYSQLI_OPT_LOCAL_INFILE" bool(true) + +Notice: Array to string conversion in %s on line %d %s(19) "MYSQLI_INIT_COMMAND" bool(true) %s(25) "MYSQLI_READ_DEFAULT_GROUP"