felipe                                   Sun, 07 Nov 2010 18:13:53 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=305170

Log:
- Fixed bug #52512 (Broken error handling in odbc_execute)
  patch by: mkoegler at auto dot tuwien dot ac dot at

Bug: http://bugs.php.net/52512 (Feedback) Broken error handling in odbc_execute
      
Changed paths:
    U   php/php-src/branches/PHP_5_3/NEWS
    U   php/php-src/branches/PHP_5_3/ext/odbc/php_odbc.c
    U   php/php-src/trunk/ext/odbc/php_odbc.c

Modified: php/php-src/branches/PHP_5_3/NEWS
===================================================================
--- php/php-src/branches/PHP_5_3/NEWS   2010-11-07 16:40:46 UTC (rev 305169)
+++ php/php-src/branches/PHP_5_3/NEWS   2010-11-07 18:13:53 UTC (rev 305170)
@@ -134,6 +134,8 @@
 - Fixed bug #52546 (pdo_dblib segmentation fault when iterating MONEY values).
   (Felipe)
 - Fixed bug #52534 (var_export array with negative key). (Felipe)
+- Fixed bug #52512 (Broken error handling in odbc_execute).
+  (mkoegler at auto dot tuwien dot ac dot at)
 - Fixed bug #52508 (newline problem with parse_ini_file+INI_SCANNER_RAW).
   (Felipe)
 - Fixed bug #52498 (libevent was not only linked to php-fpm). (fat)

Modified: php/php-src/branches/PHP_5_3/ext/odbc/php_odbc.c
===================================================================
--- php/php-src/branches/PHP_5_3/ext/odbc/php_odbc.c    2010-11-07 16:40:46 UTC 
(rev 305169)
+++ php/php-src/branches/PHP_5_3/ext/odbc/php_odbc.c    2010-11-07 18:13:53 UTC 
(rev 305170)
@@ -1262,11 +1262,19 @@

                zend_hash_internal_pointer_reset(Z_ARRVAL_P(pv_param_arr));
                params = (params_t *)safe_emalloc(sizeof(params_t), 
result->numparams, 0);
+               for(i = 0; i < result->numparams; i++) {
+                       params[i].fp = -1;
+               }

                for(i = 1; i <= result->numparams; i++) {
                        if 
(zend_hash_get_current_data(Z_ARRVAL_P(pv_param_arr), (void **) &tmp) == 
FAILURE) {
                                php_error_docref(NULL TSRMLS_CC, 
E_WARNING,"Error getting parameter");
                                SQLFreeStmt(result->stmt,SQL_RESET_PARAMS);
+                               for (i = 0; i < result->numparams; i++) {
+                                       if (params[i].fp != -1) {
+                                               close(params[i].fp);
+                                       }
+                               }
                                efree(params);
                                RETURN_FALSE;
                        }
@@ -1276,13 +1284,29 @@
                        if (Z_TYPE_PP(tmp) != IS_STRING) {
                                php_error_docref(NULL TSRMLS_CC, 
E_WARNING,"Error converting parameter");
                                SQLFreeStmt(result->stmt, SQL_RESET_PARAMS);
+                               for (i = 0; i < result->numparams; i++) {
+                                       if (params[i].fp != -1) {
+                                               close(params[i].fp);
+                                       }
+                               }
                                efree(params);
                                RETURN_FALSE;
                        }

-                       SQLDescribeParam(result->stmt, (SQLUSMALLINT)i, 
&sqltype, &precision, &scale, &nullable);
+                       rc = SQLDescribeParam(result->stmt, (SQLUSMALLINT)i, 
&sqltype, &precision, &scale, &nullable);
                        params[i-1].vallen = Z_STRLEN_PP(tmp);
                        params[i-1].fp = -1;
+                       if (rc == SQL_ERROR) {
+                               odbc_sql_error(result->conn_ptr, result->stmt, 
"SQLDescribeParameter");
+                               SQLFreeStmt(result->stmt, SQL_RESET_PARAMS);
+                               for (i = 0; i < result->numparams; i++) {
+                                       if (params[i].fp != -1) {
+                                               close(params[i].fp);
+                                       }
+                               }
+                               efree(params);
+                               RETURN_FALSE;
+                       }

                        if (IS_SQL_BINARY(sqltype)) {
                                ctype = SQL_C_BINARY;
@@ -1306,6 +1330,12 @@
                                /* Check the basedir */
                                if (php_check_open_basedir(filename TSRMLS_CC)) 
{
                                        efree(filename);
+                                       SQLFreeStmt(result->stmt, 
SQL_RESET_PARAMS);
+                                       for (i = 0; i < result->numparams; i++) 
{
+                                               if (params[i].fp != -1) {
+                                                       close(params[i].fp);
+                                               }
+                                       }
                                        efree(params);
                                        RETURN_FALSE;
                                }
@@ -1313,7 +1343,7 @@
                                if ((params[i-1].fp = open(filename,O_RDONLY)) 
== -1) {
                                        php_error_docref(NULL TSRMLS_CC, 
E_WARNING,"Can't open file %s", filename);
                                        SQLFreeStmt(result->stmt, 
SQL_RESET_PARAMS);
-                                       for(i = 0; i < result->numparams; i++) {
+                                       for (i = 0; i < result->numparams; i++) 
{
                                                if (params[i].fp != -1) {
                                                        close(params[i].fp);
                                                }
@@ -1344,6 +1374,17 @@
                                                                          
Z_STRVAL_PP(tmp), 0,
                                                                          
&params[i-1].vallen);
                        }
+                       if (rc == SQL_ERROR) {
+                               odbc_sql_error(result->conn_ptr, result->stmt, 
"SQLBindParameter");
+                               SQLFreeStmt(result->stmt, SQL_RESET_PARAMS);
+                               for (i = 0; i < result->numparams; i++) {
+                                       if (params[i].fp != -1) {
+                                               close(params[i].fp);
+                                       }
+                               }
+                               efree(params);
+                               RETURN_FALSE;
+                       }
                        zend_hash_move_forward(Z_ARRVAL_P(pv_param_arr));
                }
        }

Modified: php/php-src/trunk/ext/odbc/php_odbc.c
===================================================================
--- php/php-src/trunk/ext/odbc/php_odbc.c       2010-11-07 16:40:46 UTC (rev 
305169)
+++ php/php-src/trunk/ext/odbc/php_odbc.c       2010-11-07 18:13:53 UTC (rev 
305170)
@@ -1262,11 +1262,19 @@

                zend_hash_internal_pointer_reset(Z_ARRVAL_P(pv_param_arr));
                params = (params_t *)safe_emalloc(sizeof(params_t), 
result->numparams, 0);
+               for(i = 0; i < result->numparams; i++) {
+                       params[i].fp = -1;
+               }

                for(i = 1; i <= result->numparams; i++) {
                        if 
(zend_hash_get_current_data(Z_ARRVAL_P(pv_param_arr), (void **) &tmp) == 
FAILURE) {
                                php_error_docref(NULL TSRMLS_CC, 
E_WARNING,"Error getting parameter");
                                SQLFreeStmt(result->stmt,SQL_RESET_PARAMS);
+                               for (i = 0; i < result->numparams; i++) {
+                                       if (params[i].fp != -1) {
+                                               close(params[i].fp);
+                                       }
+                               }
                                efree(params);
                                RETURN_FALSE;
                        }
@@ -1276,13 +1284,29 @@
                        if (Z_TYPE_PP(tmp) != IS_STRING) {
                                php_error_docref(NULL TSRMLS_CC, 
E_WARNING,"Error converting parameter");
                                SQLFreeStmt(result->stmt, SQL_RESET_PARAMS);
+                               for (i = 0; i < result->numparams; i++) {
+                                       if (params[i].fp != -1) {
+                                               close(params[i].fp);
+                                       }
+                               }
                                efree(params);
                                RETURN_FALSE;
                        }

-                       SQLDescribeParam(result->stmt, (SQLUSMALLINT)i, 
&sqltype, &precision, &scale, &nullable);
+                       rc = SQLDescribeParam(result->stmt, (SQLUSMALLINT)i, 
&sqltype, &precision, &scale, &nullable);
                        params[i-1].vallen = Z_STRLEN_PP(tmp);
                        params[i-1].fp = -1;
+                       if (rc == SQL_ERROR) {
+                               odbc_sql_error(result->conn_ptr, result->stmt, 
"SQLDescribeParameter");
+                               SQLFreeStmt(result->stmt, SQL_RESET_PARAMS);
+                               for (i = 0; i < result->numparams; i++) {
+                                       if (params[i].fp != -1) {
+                                               close(params[i].fp);
+                                       }
+                               }
+                               efree(params);
+                               RETURN_FALSE;
+                       }

                        if (IS_SQL_BINARY(sqltype)) {
                                ctype = SQL_C_BINARY;
@@ -1299,6 +1323,12 @@
                                /* Check the basedir */
                                if (php_check_open_basedir(filename TSRMLS_CC)) 
{
                                        efree(filename);
+                                       SQLFreeStmt(result->stmt, 
SQL_RESET_PARAMS);
+                                       for (i = 0; i < result->numparams; i++) 
{
+                                               if (params[i].fp != -1) {
+                                                       close(params[i].fp);
+                                               }
+                                       }
                                        efree(params);
                                        RETURN_FALSE;
                                }
@@ -1306,7 +1336,7 @@
                                if ((params[i-1].fp = open(filename,O_RDONLY)) 
== -1) {
                                        php_error_docref(NULL TSRMLS_CC, 
E_WARNING,"Can't open file %s", filename);
                                        SQLFreeStmt(result->stmt, 
SQL_RESET_PARAMS);
-                                       for(i = 0; i < result->numparams; i++) {
+                                       for (i = 0; i < result->numparams; i++) 
{
                                                if (params[i].fp != -1) {
                                                        close(params[i].fp);
                                                }
@@ -1337,6 +1367,17 @@
                                                                          
Z_STRVAL_PP(tmp), 0,
                                                                          
&params[i-1].vallen);
                        }
+                       if (rc == SQL_ERROR) {
+                               odbc_sql_error(result->conn_ptr, result->stmt, 
"SQLBindParameter");
+                               SQLFreeStmt(result->stmt, SQL_RESET_PARAMS);
+                               for (i = 0; i < result->numparams; i++) {
+                                       if (params[i].fp != -1) {
+                                               close(params[i].fp);
+                                       }
+                               }
+                               efree(params);
+                               RETURN_FALSE;
+                       }
                        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