com php-src: Fixed reference handling(param->parameter): ext/pdo_mysql/mysql_statement.c
| From: | Xinchen Hui | Date: | Wed, 07 May 2014 04:01:07 +0000 |
| Subject: | com php-src: Fixed reference handling(param->parameter): ext/pdo_mysql/mysql_statement.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-78166@lists.php.net to get a copy of this message | ||
Commit: 478a8b2ebbd6a5fd2e49c3e1069b284b1a38c018
Author: Xinchen Hui <laruence@php.net> Wed, 7 May 2014 12:01:07 +0800
Parents: 2d0c9690de4ffecda7049a03841212a96295adf1
Branches: phpng
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=478a8b2ebbd6a5fd2e49c3e1069b284b1a38c018
Log:
Fixed reference handling(param->parameter)
Changed paths:
M ext/pdo_mysql/mysql_statement.c
Diff:
diff --git a/ext/pdo_mysql/mysql_statement.c b/ext/pdo_mysql/mysql_statement.c
index e2b0c40..df3a395 100644
--- a/ext/pdo_mysql/mysql_statement.c
+++ b/ext/pdo_mysql/mysql_statement.c
@@ -450,6 +450,7 @@ static const char * const pdo_param_event_names[] =
static int pdo_mysql_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_data *param, enum
pdo_param_event event_type TSRMLS_DC) /* {{{ */
{
+ zval *parameter;
#ifndef PDO_USE_MYSQLND
PDO_MYSQL_PARAM_BIND *b;
#endif
@@ -484,18 +485,22 @@ static int pdo_mysql_stmt_param_hook(pdo_stmt_t *stmt, struct
pdo_bound_param_da
strcpy(stmt->error_code, "HY093");
PDO_DBG_RETURN(0);
}
+
+ if (!Z_ISREF(param->parameter)) {
+ parameter = ¶m->parameter;
+ } else {
+ parameter = Z_REFVAL(param->parameter);
+ }
#if PDO_USE_MYSQLND
- if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_NULL ||
- Z_TYPE_P(param->parameter) == IS_NULL) {
- mysqlnd_stmt_bind_one_param(S->stmt, param->paramno, param->parameter,
MYSQL_TYPE_NULL);
+ if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_NULL || (Z_TYPE_P(parameter) == IS_NULL))
{
+ mysqlnd_stmt_bind_one_param(S->stmt, param->paramno, parameter, MYSQL_TYPE_NULL);
PDO_DBG_RETURN(1);
}
#else
b = (PDO_MYSQL_PARAM_BIND*)param->driver_data;
*b->is_null = 0;
- if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_NULL ||
- Z_TYPE(param->parameter) == IS_NULL) {
+ if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_NULL || Z_TYPE_P(parameter) == IS_NULL) {
*b->is_null = 1;
b->buffer_type = MYSQL_TYPE_STRING;
b->buffer = NULL;
@@ -510,12 +515,16 @@ static int pdo_mysql_stmt_param_hook(pdo_stmt_t *stmt, struct
pdo_bound_param_da
PDO_DBG_RETURN(0);
case PDO_PARAM_LOB:
PDO_DBG_INF("PDO_PARAM_LOB");
- if (Z_TYPE(param->parameter) == IS_RESOURCE) {
+ if (!Z_ISREF(param->parameter)) {
+ parameter = ¶m->parameter;
+ } else {
+ parameter = Z_REFVAL(param->parameter);
+ }
+ if (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) {
- SEPARATE_ZVAL_IF_NOT_REF(¶m->parameter);
- ZVAL_STR(¶m->parameter, php_stream_copy_to_mem(stm, PHP_STREAM_COPY_ALL, 0));
+ ZVAL_STR(parameter, php_stream_copy_to_mem(stm, PHP_STREAM_COPY_ALL, 0));
} else {
pdo_raise_impl_error(stmt->dbh, stmt, "HY105", "Expected a stream
resource" TSRMLS_CC);
return 0;
@@ -530,19 +539,24 @@ static int pdo_mysql_stmt_param_hook(pdo_stmt_t *stmt, struct
pdo_bound_param_da
#if PDO_USE_MYSQLND
/* Is it really correct to check the zval's type? - But well, that's what the old
code below does, too */
PDO_DBG_INF_FMT("param->parameter->type=%d", Z_TYPE(param->parameter));
- switch (Z_TYPE(param->parameter)) {
+ if (!Z_ISREF(param->parameter)) {
+ parameter = ¶m->parameter;
+ } else {
+ parameter = Z_REFVAL(param->parameter);
+ }
+ switch (Z_TYPE_P(parameter)) {
case IS_STRING:
- mysqlnd_stmt_bind_one_param(S->stmt, param->paramno, ¶m->parameter,
MYSQL_TYPE_VAR_STRING);
+ mysqlnd_stmt_bind_one_param(S->stmt, param->paramno, parameter, MYSQL_TYPE_VAR_STRING);
break;
case IS_LONG:
#if SIZEOF_LONG==8
- mysqlnd_stmt_bind_one_param(S->stmt, param->paramno, ¶m->parameter,
MYSQL_TYPE_LONGLONG);
+ mysqlnd_stmt_bind_one_param(S->stmt, param->paramno, parameter, MYSQL_TYPE_LONGLONG);
#elif SIZEOF_LONG==4
- mysqlnd_stmt_bind_one_param(S->stmt, param->paramno, ¶m->parameter,
MYSQL_TYPE_LONG);
+ mysqlnd_stmt_bind_one_param(S->stmt, param->paramno, parameter, MYSQL_TYPE_LONG);
#endif /* SIZEOF_LONG */
break;
case IS_DOUBLE:
- mysqlnd_stmt_bind_one_param(S->stmt, param->paramno, ¶m->parameter,
MYSQL_TYPE_DOUBLE);
+ mysqlnd_stmt_bind_one_param(S->stmt, param->paramno, parameter, MYSQL_TYPE_DOUBLE);
break;
default:
PDO_DBG_RETURN(0);
@@ -551,22 +565,27 @@ static int pdo_mysql_stmt_param_hook(pdo_stmt_t *stmt, struct
pdo_bound_param_da
PDO_DBG_RETURN(1);
#else
PDO_DBG_INF_FMT("param->parameter->type=%d", Z_TYPE(param->parameter));
- switch (Z_TYPE(param->parameter)) {
+ if (!Z_ISREF(param->parameter)) {
+ parameter = ¶m->parameter;
+ } else {
+ parameter = Z_REFVAL(param->parameter);
+ }
+ switch (Z_TYPE_P(parameter)) {
case IS_STRING:
b->buffer_type = MYSQL_TYPE_STRING;
- b->buffer = Z_STRVAL(param->parameter);
- b->buffer_length = Z_STRLEN(param->parameter);
- *b->length = Z_STRLEN(param->parameter);
+ b->buffer = Z_STRVAL_P(parameter);
+ b->buffer_length = Z_STRLEN_P(parameter);
+ *b->length = Z_STRLEN_P(parameter);
PDO_DBG_RETURN(1);
case IS_LONG:
b->buffer_type = MYSQL_TYPE_LONG;
- b->buffer = &Z_LVAL(param->parameter);
+ b->buffer = &Z_LVAL_P(parameter);
PDO_DBG_RETURN(1);
case IS_DOUBLE:
b->buffer_type = MYSQL_TYPE_DOUBLE;
- b->buffer = &Z_DVAL(param->parameter);
+ b->buffer = &Z_DVAL_P(parameter);
PDO_DBG_RETURN(1);
default: