svn: /php/php-src/ branches/PHP_5_3/NEWS branches/PHP_5_3/ext/odbc/php_odbc.c trunk/ext/odbc/php_odbc.c
| From: | Felipe Pena | Date: | Sun, 07 Nov 2010 18:13:53 +0000 |
| Subject: | svn: /php/php-src/ branches/PHP_5_3/NEWS branches/PHP_5_3/ext/odbc/php_odbc.c trunk/ext/odbc/php_odbc.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-63774@lists.php.net to get a copy of this message | ||
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,
¶ms[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,
¶ms[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));
}
}