Fix for bug #49965 . Let mysqli_options() try to cast option values to the appropriate type.

This commit is contained in:
Ulf Wendel 2009-11-03 14:56:04 +00:00
parent 2fad7df98c
commit 7b22d7222b
2 changed files with 81 additions and 5 deletions

View File

@ -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 /* {{{ proto bool mysqli_options(object link, int flags, mixed values) U
Set options */ Set options */
PHP_FUNCTION(mysqli_options) PHP_FUNCTION(mysqli_options)
@ -1652,6 +1711,7 @@ PHP_FUNCTION(mysqli_options)
long mysql_option; long mysql_option;
unsigned int l_value; unsigned int l_value;
long ret; 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) { if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Olz", &mysql_link, mysqli_link_class_entry, &mysql_option, &mysql_value) == FAILURE) {
return; return;
@ -1664,17 +1724,31 @@ PHP_FUNCTION(mysqli_options)
} }
} }
switch (Z_TYPE_PP(&mysql_value)) { expected_type = mysqli_options_get_option_zval_type(mysql_option);
case IS_UNICODE: if (expected_type != Z_TYPE_P(mysql_value)) {
zval_unicode_to_string(mysql_value TSRMLS_CC); 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: case IS_STRING:
ret = mysql_options(mysql->mysql, mysql_option, Z_STRVAL_PP(&mysql_value)); ret = mysql_options(mysql->mysql, mysql_option, Z_STRVAL_PP(&mysql_value));
break; break;
default: case IS_LONG:
convert_to_long_ex(&mysql_value);
l_value = Z_LVAL_PP(&mysql_value); l_value = Z_LVAL_PP(&mysql_value);
ret = mysql_options(mysql->mysql, mysql_option, (char *)&l_value); ret = mysql_options(mysql->mysql, mysql_option, (char *)&l_value);
break; break;
default:
ret = 1;
break;
} }
RETURN_BOOL(!ret); RETURN_BOOL(!ret);

View File

@ -111,6 +111,8 @@ bool(true)
bool(true) bool(true)
%s(23) "MYSQLI_OPT_LOCAL_INFILE" %s(23) "MYSQLI_OPT_LOCAL_INFILE"
bool(true) bool(true)
Notice: Array to string conversion in %s on line %d
%s(19) "MYSQLI_INIT_COMMAND" %s(19) "MYSQLI_INIT_COMMAND"
bool(true) bool(true)
%s(25) "MYSQLI_READ_DEFAULT_GROUP" %s(25) "MYSQLI_READ_DEFAULT_GROUP"