]> granicus.if.org Git - php/commitdiff
Fixed reference handling(param->parameter)
authorXinchen Hui <laruence@php.net>
Wed, 7 May 2014 04:01:07 +0000 (12:01 +0800)
committerXinchen Hui <laruence@php.net>
Wed, 7 May 2014 04:01:07 +0000 (12:01 +0800)
ext/pdo_mysql/mysql_statement.c

index e2b0c40a125bbe07872ba1031eaf2fa4c3d28657..df3a3955c89642c6ccbcc2ca2c267a17a810ac8c 100644 (file)
@@ -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 = &param->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 = &param->parameter;
+                                               } else {
+                                                       parameter = Z_REFVAL(param->parameter);
+                                               }
+                                               if (Z_TYPE_P(parameter) == IS_RESOURCE) {
                                                        php_stream *stm;
-                                                       php_stream_from_zval_no_verify(stm, &param->parameter);
+                                                       php_stream_from_zval_no_verify(stm, parameter);
                                                        if (stm) {
-                                                               SEPARATE_ZVAL_IF_NOT_REF(&param->parameter);
-                                                               ZVAL_STR(&param->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 = &param->parameter;
+                               } else {
+                                       parameter = Z_REFVAL(param->parameter);
+                               }
+                               switch (Z_TYPE_P(parameter)) {
                                        case IS_STRING:
-                                               mysqlnd_stmt_bind_one_param(S->stmt, param->paramno, &param->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, &param->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, &param->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, &param->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 = &param->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: