diff options
author | Xinchen Hui <laruence@php.net> | 2014-05-07 12:01:07 +0800 |
---|---|---|
committer | Xinchen Hui <laruence@php.net> | 2014-05-07 12:01:07 +0800 |
commit | 478a8b2ebbd6a5fd2e49c3e1069b284b1a38c018 (patch) | |
tree | 490e2d01dd06e4547930fbfbdd3b6b061d64c4e5 | |
parent | 2d0c9690de4ffecda7049a03841212a96295adf1 (diff) | |
download | php-git-478a8b2ebbd6a5fd2e49c3e1069b284b1a38c018.tar.gz |
Fixed reference handling(param->parameter)
-rw-r--r-- | ext/pdo_mysql/mysql_statement.c | 59 |
1 files changed, 39 insertions, 20 deletions
diff --git a/ext/pdo_mysql/mysql_statement.c b/ext/pdo_mysql/mysql_statement.c index e2b0c40a12..df3a3955c8 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: |