iliaa           Wed Oct  1 20:31:02 2008 UTC

  Modified files:              
    /php-src/ext/pgsql  pgsql.c 
  Log:
  
  MFB: Fixed bug #46206 (pg_query_params/pg_execute convert passed values to
  strings).
  
http://cvs.php.net/viewvc.cgi/php-src/ext/pgsql/pgsql.c?r1=1.385&r2=1.386&diff_format=u
Index: php-src/ext/pgsql/pgsql.c
diff -u php-src/ext/pgsql/pgsql.c:1.385 php-src/ext/pgsql/pgsql.c:1.386
--- php-src/ext/pgsql/pgsql.c:1.385     Mon Sep  8 01:30:55 2008
+++ php-src/ext/pgsql/pgsql.c   Wed Oct  1 20:31:02 2008
@@ -20,7 +20,7 @@
    +----------------------------------------------------------------------+
  */
  
-/* $Id: pgsql.c,v 1.385 2008/09/08 01:30:55 felipe Exp $ */
+/* $Id: pgsql.c,v 1.386 2008/10/01 20:31:02 iliaa Exp $ */
 
 #include <stdlib.h>
 
@@ -1711,6 +1711,10 @@
 static void _php_pgsql_free_params(char **params, int num_params)
 {
        if (num_params > 0) {
+               int i;
+               for (i = 0; i < num_params; i++) {
+                       efree(params[i]);
+               }
                efree(params);
        }
 }
@@ -1729,7 +1733,6 @@
        int leftover = 0;
        int num_params = 0;
        char **params = NULL;
-       unsigned char otype;
        PGconn *pgsql;
        PGresult *pgsql_result;
        ExecStatusType status;
@@ -1778,19 +1781,20 @@
                                RETURN_FALSE;
                        }
 
-                       otype = (*tmp)->type;
-                       convert_to_string_ex(tmp);
-                       if (Z_TYPE_PP(tmp) != IS_STRING) {
-                               php_error_docref(NULL TSRMLS_CC, 
E_WARNING,"Error converting parameter");
-                               _php_pgsql_free_params(params, num_params);
-                               RETURN_FALSE;
-                       }
-
-                       if (otype == IS_NULL) {
+                       if (Z_TYPE_PP(tmp) == IS_NULL) {
                                params[i] = NULL;
-                       }
-                       else {
-                               params[i] = Z_STRVAL_PP(tmp);
+                       } else {
+                               zval tmp_val = **tmp;
+                               zval_copy_ctor(&tmp_val);
+                               convert_to_string(&tmp_val);
+                               if (Z_TYPE(tmp_val) != IS_STRING) {
+                                       php_error_docref(NULL TSRMLS_CC, 
E_WARNING,"Error converting parameter");
+                                       zval_dtor(&tmp_val);
+                                       _php_pgsql_free_params(params, 
num_params);
+                                       RETURN_FALSE;
+                               }
+                               params[i] = estrndup(Z_STRVAL(tmp_val), 
Z_STRLEN(tmp_val));
+                               zval_dtor(&tmp_val);
                        }
 
                        zend_hash_move_forward(Z_ARRVAL_P(pv_param_arr));
@@ -1936,7 +1940,6 @@
        int leftover = 0;
        int num_params = 0;
        char **params = NULL;
-       unsigned char otype;
        PGconn *pgsql;
        PGresult *pgsql_result;
        ExecStatusType status;
@@ -1985,19 +1988,20 @@
                                RETURN_FALSE;
                        }
 
-                       otype = (*tmp)->type;
-                       SEPARATE_ZVAL(tmp);
-                       convert_to_string_ex(tmp);
-                       if (Z_TYPE_PP(tmp) != IS_STRING) {
-                               php_error_docref(NULL TSRMLS_CC, 
E_WARNING,"Error converting parameter");
-                               _php_pgsql_free_params(params, num_params);
-                               RETURN_FALSE;
-                       }
-
-                       if (otype == IS_NULL) {
+                       if (Z_TYPE_PP(tmp) == IS_NULL) {
                                params[i] = NULL;
                        } else {
-                               params[i] = Z_STRVAL_PP(tmp);
+                               zval tmp_val = **tmp;
+                               zval_copy_ctor(&tmp_val);
+                               convert_to_string(&tmp_val);
+                               if (Z_TYPE(tmp_val) != IS_STRING) {
+                                       php_error_docref(NULL TSRMLS_CC, 
E_WARNING,"Error converting parameter");
+                                       zval_dtor(&tmp_val);
+                                       _php_pgsql_free_params(params, 
num_params);
+                                       RETURN_FALSE;
+                               }
+                               params[i] = estrndup(Z_STRVAL(tmp_val), 
Z_STRLEN(tmp_val));
+                               zval_dtor(&tmp_val);
                        }
 
                        zend_hash_move_forward(Z_ARRVAL_P(pv_param_arr));
@@ -4548,7 +4552,6 @@
        zval *pgsql_link, *pv_param_arr, **tmp;
        int num_params = 0;
        char **params = NULL;
-       unsigned char otype;
        char *query;
        int query_len, id = -1;
        PGconn *pgsql;
@@ -4590,20 +4593,20 @@
                                RETURN_FALSE;
                        }
 
-                       otype = (*tmp)->type;
-                       SEPARATE_ZVAL(tmp);
-                       convert_to_string_ex(tmp);
-                       if (Z_TYPE_PP(tmp) != IS_STRING) {
-                               php_error_docref(NULL TSRMLS_CC, 
E_WARNING,"Error converting parameter");
-                               _php_pgsql_free_params(params, num_params);
-                               RETURN_FALSE;
-                       }
-
-                       if (otype == IS_NULL) {
+                       if (Z_TYPE_PP(tmp) == IS_NULL) {
                                params[i] = NULL;
-                       }
-                       else {
-                               params[i] = Z_STRVAL_PP(tmp);
+                       } else {
+                               zval tmp_val = **tmp;
+                               zval_copy_ctor(&tmp_val);
+                               convert_to_string(&tmp_val);
+                               if (Z_TYPE(tmp_val) != IS_STRING) {
+                                       php_error_docref(NULL TSRMLS_CC, 
E_WARNING,"Error converting parameter");
+                                       zval_dtor(&tmp_val);
+                                       _php_pgsql_free_params(params, 
num_params);
+                                       RETURN_FALSE;
+                               }
+                               params[i] = estrndup(Z_STRVAL(tmp_val), 
Z_STRLEN(tmp_val));
+                               zval_dtor(&tmp_val);
                        }
 
                        zend_hash_move_forward(Z_ARRVAL_P(pv_param_arr));
@@ -4686,7 +4689,6 @@
        zval *pv_param_arr, **tmp;
        int num_params = 0;
        char **params = NULL;
-       unsigned char otype;
        char *stmtname;
        int stmtname_len, id = -1;
        PGconn *pgsql;
@@ -4728,19 +4730,20 @@
                                RETURN_FALSE;
                        }
 
-                       otype = (*tmp)->type;
-                       convert_to_string(*tmp);
-                       if (Z_TYPE_PP(tmp) != IS_STRING) {
-                               php_error_docref(NULL TSRMLS_CC, 
E_WARNING,"Error converting parameter");
-                               _php_pgsql_free_params(params, num_params);
-                               RETURN_FALSE;
-                       }
-
-                       if (otype == IS_NULL) {
+                       if (Z_TYPE_PP(tmp) == IS_NULL) {
                                params[i] = NULL;
-                       }
-                       else {
-                               params[i] = Z_STRVAL_PP(tmp);
+                       } else {
+                               zval tmp_val = **tmp;
+                               zval_copy_ctor(&tmp_val);
+                               convert_to_string(&tmp_val);
+                               if (Z_TYPE(tmp_val) != IS_STRING) {
+                                       php_error_docref(NULL TSRMLS_CC, 
E_WARNING,"Error converting parameter");
+                                       zval_dtor(&tmp_val);
+                                       _php_pgsql_free_params(params, 
num_params);
+                                       RETURN_FALSE;
+                               }
+                               params[i] = estrndup(Z_STRVAL(tmp_val), 
Z_STRLEN(tmp_val));
+                               zval_dtor(&tmp_val);
                        }
 
                        zend_hash_move_forward(Z_ARRVAL_P(pv_param_arr));



-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to