From: Xinchen Hui Date: Thu, 8 May 2014 08:11:50 +0000 (+0800) Subject: Fixed REFERENCE handling X-Git-Tag: POST_PHPNG_MERGE~384^2~24^2~4 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=be79628b8747ea1311964d9834d99c06abe76278;p=php Fixed REFERENCE handling --- diff --git a/ext/pdo/pdo_sql_parser.c b/ext/pdo/pdo_sql_parser.c index 50b2b5d6ec..cf108991e5 100644 --- a/ext/pdo/pdo_sql_parser.c +++ b/ext/pdo/pdo_sql_parser.c @@ -527,7 +527,7 @@ PDO_API int pdo_parse_params(pdo_stmt_t *stmt, char *inquery, int inquery_len, if (query_type != PDO_PLACEHOLDER_POSITIONAL && bindno > zend_hash_num_elements(params)) { int ok = 1; for (plc = placeholders; plc; plc = plc->next) { - if ((params = zend_hash_str_find_ptr(params, plc->pos, plc->len)) == NULL) { + if ((param = zend_hash_str_find_ptr(params, plc->pos, plc->len)) == NULL) { ok = 0; break; } @@ -561,10 +561,16 @@ safe: goto clean_up; } if (stmt->dbh->methods->quoter) { - if (param->param_type == PDO_PARAM_LOB && Z_TYPE(param->parameter) == IS_RESOURCE) { + zval *parameter; + if (Z_ISREF(param->parameter)) { + parameter = Z_REFVAL(param->parameter); + } else { + parameter = ¶m->parameter; + } + if (param->param_type == PDO_PARAM_LOB && Z_TYPE_P(parameter) == IS_RESOURCE) { php_stream *stm; - php_stream_from_zval_no_verify(stm, ¶m->parameter); + php_stream_from_zval_no_verify(stm, parameter); if (stm) { zend_string *buf; @@ -590,7 +596,7 @@ safe: plc->freeq = 1; } else { zval tmp_param; - ZVAL_DUP(&tmp_param, ¶m->parameter); + ZVAL_DUP(&tmp_param, parameter); switch (Z_TYPE(tmp_param)) { case IS_NULL: plc->quoted = "NULL"; @@ -625,8 +631,14 @@ safe: zval_dtor(&tmp_param); } } else { - plc->quoted = Z_STRVAL(param->parameter); - plc->qlen = Z_STRLEN(param->parameter); + zval *parameter; + if (Z_ISREF(param->parameter)) { + parameter = Z_REFVAL(param->parameter); + } else { + parameter = ¶m->parameter; + } + plc->quoted = Z_STRVAL_P(parameter); + plc->qlen = Z_STRLEN_P(parameter); } newbuffer_len += plc->qlen; } diff --git a/ext/pdo/pdo_sql_parser.re b/ext/pdo/pdo_sql_parser.re index 4a206c79f4..48d80e2684 100644 --- a/ext/pdo/pdo_sql_parser.re +++ b/ext/pdo/pdo_sql_parser.re @@ -169,7 +169,7 @@ PDO_API int pdo_parse_params(pdo_stmt_t *stmt, char *inquery, int inquery_len, if (query_type != PDO_PLACEHOLDER_POSITIONAL && bindno > zend_hash_num_elements(params)) { int ok = 1; for (plc = placeholders; plc; plc = plc->next) { - if ((params = zend_hash_str_find_ptr(params, plc->pos, plc->len)) == NULL) { + if ((param = zend_hash_str_find_ptr(params, plc->pos, plc->len)) == NULL) { ok = 0; break; } @@ -203,10 +203,16 @@ safe: goto clean_up; } if (stmt->dbh->methods->quoter) { - if (param->param_type == PDO_PARAM_LOB && Z_TYPE(param->parameter) == IS_RESOURCE) { + zval *parameter; + if (Z_ISREF(param->parameter)) { + parameter = Z_REFVAL(param->parameter); + } else { + parameter = ¶m->parameter; + } + if (param->param_type == PDO_PARAM_LOB && Z_TYPE_P(parameter) == IS_RESOURCE) { php_stream *stm; - php_stream_from_zval_no_verify(stm, ¶m->parameter); + php_stream_from_zval_no_verify(stm, parameter); if (stm) { zend_string *buf; @@ -232,7 +238,7 @@ safe: plc->freeq = 1; } else { zval tmp_param; - ZVAL_DUP(&tmp_param, ¶m->parameter); + ZVAL_DUP(&tmp_param, parameter); switch (Z_TYPE(tmp_param)) { case IS_NULL: plc->quoted = "NULL"; @@ -267,8 +273,14 @@ safe: zval_dtor(&tmp_param); } } else { - plc->quoted = Z_STRVAL(param->parameter); - plc->qlen = Z_STRLEN(param->parameter); + zval *parameter; + if (Z_ISREF(param->parameter)) { + parameter = Z_REFVAL(param->parameter); + } else { + parameter = ¶m->parameter; + } + plc->quoted = Z_STRVAL_P(parameter); + plc->qlen = Z_STRLEN_P(parameter); } newbuffer_len += plc->qlen; } diff --git a/ext/pdo_mysql/tests/common.phpt b/ext/pdo_mysql/tests/common.phpt index f55d1f883b..18c5c1b20d 100644 --- a/ext/pdo_mysql/tests/common.phpt +++ b/ext/pdo_mysql/tests/common.phpt @@ -20,7 +20,7 @@ if (false !== getenv('PDO_MYSQL_TEST_DSN')) { $config['ENV']['PDOTEST_ATTR'] = getenv('PDO_MYSQL_TEST_ATTR'); } } else { - $config['ENV']['PDOTEST_DSN'] = 'mysql:host=localhost;dbname=test'; + $config['ENV']['PDOTEST_DSN'] = 'mysql:host=127.0.0.1;port=3308;dbname=test'; $config['ENV']['PDOTEST_USER'] = 'root'; $config['ENV']['PDOTEST_PASS'] = ''; } diff --git a/ext/pdo_mysql/tests/config.inc b/ext/pdo_mysql/tests/config.inc index 2530442c0e..21f33a2d59 100644 --- a/ext/pdo_mysql/tests/config.inc +++ b/ext/pdo_mysql/tests/config.inc @@ -10,7 +10,7 @@ if (false !== getenv('PDO_MYSQL_TEST_DSN')) { $config['ENV']['PDOTEST_ATTR'] = getenv('PDO_MYSQL_TEST_ATTR'); } } else { - $config['ENV']['PDOTEST_DSN'] = 'mysql:host=localhost;dbname=test'; + $config['ENV']['PDOTEST_DSN'] = 'mysql:host=127.0.0.1;port=3308;dbname=test'; $config['ENV']['PDOTEST_USER'] = 'root'; $config['ENV']['PDOTEST_PASS'] = ''; } @@ -49,4 +49,4 @@ if (!function_exists('sys_get_temp_dir')) { return FALSE; } } -?> \ No newline at end of file +?>