php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Return to Bug #62534
Patch INTERNED_string revision 2012-10-22 07:45 UTC by rahulpriyadarshi@php.net

Patch INTERNED_string for ibm_db2 Bug #62534

Patch version 2012-10-22 07:45 UTC

Return to Bug #62534 | Download this patch
Patch Revisions:

Developer: rahulpriyadarshi@php.net

Index: ibm_db2.c
===================================================================
--- ibm_db2.c	(revision 328094)
+++ ibm_db2.c	(working copy)
@@ -3712,7 +3712,10 @@
 					if (curr->param_type == DB2_PARAM_INOUT)
 #endif
 						memset(Z_STRVAL_PP(bind_data)+origlen,0x20, curr->param_size-origlen);
-					if (nullterm) Z_STRVAL_PP(bind_data)[origlen] = '\0';
+					if (nullterm) {
+						Z_STRVAL_PP(bind_data)[origlen] = '\0';
+						Z_STRVAL_PP(bind_data)[curr->param_size] = '\0';
+					}
 						Z_STRLEN_PP(bind_data) = curr->param_size;
 				}
 #ifdef PASE /* help out PHP script trunc trailing chars -- LUW too? */
@@ -4239,7 +4242,9 @@
 			if (prev_ptr->value != NULL) {
 				if ( Z_TYPE_P(prev_ptr->value) == IS_STRING ) {
 					if((prev_ptr->value)->value.str.val != NULL || (prev_ptr->value)->value.str.len != 0) {
-						efree((prev_ptr->value)->value.str.val);
+						if (!IS_INTERNED((prev_ptr->value)->value.str.val)) {
+							efree((prev_ptr->value)->value.str.val);
+						}
 					}
 				}
 
@@ -6765,6 +6770,41 @@
 }
 /* }}} */
 
+/* {{{ static void _free_param_cache_list(stmt_handle *stmt_res)
+ */
+static void _free_param_cache_list(stmt_handle *stmt_res) {
+	param_node *prev_ptr = NULL, *curr_ptr = NULL;
+
+	curr_ptr = stmt_res->head_cache_list;
+	prev_ptr = stmt_res->head_cache_list;
+	/* Free param cache list */
+	while (curr_ptr != NULL) {
+		curr_ptr = curr_ptr->next;
+
+		/* Free Values */
+		if (prev_ptr->value != NULL) {
+			if ( Z_TYPE_P(prev_ptr->value) == IS_STRING ) {
+				if((prev_ptr->value)->value.str.val != NULL || (prev_ptr->value)->value.str.len != 0) {
+					if (!IS_INTERNED((prev_ptr->value)->value.str.val)) {
+						efree((prev_ptr->value)->value.str.val);
+					}
+				}
+			}
+
+			if( prev_ptr->param_type != DB2_PARAM_OUT && prev_ptr->param_type != DB2_PARAM_INOUT ){
+				efree(prev_ptr->value);
+			}
+		}
+		efree(prev_ptr);
+
+		prev_ptr = curr_ptr;
+	}
+
+	stmt_res->head_cache_list = NULL;
+	stmt_res->num_params = 0;	
+}
+/* }}} */
+
 /* {{{  static int _ibm_db_chaining_flag(stmt_handle *stmt_res, SQLINTEGER flag, error_msg_node *error_list, int client_err_cnt TSRMLS_DC)
  */
 static int _ibm_db_chaining_flag( stmt_handle *stmt_res, SQLINTEGER flag, error_msg_node *error_list, int client_err_cnt TSRMLS_DC ) {
@@ -6889,6 +6929,8 @@
 			if ( rc == SQL_ERROR ) {
 				php_error_docref(NULL TSRMLS_CC, E_WARNING, "Describe Param %d Failed", i + 1);
 				_php_db2_check_sql_errors((SQLHSTMT)stmt_res->hstmt, SQL_HANDLE_STMT, rc, 1, NULL, -1, 1 TSRMLS_CC);
+				efree(array_data_type);
+				efree(data_type);
 				RETURN_FALSE;
 			}
 			_php_db2_build_list( stmt_res, i + 1, data_type[i], precision, scale, nullable );
@@ -6965,12 +7007,25 @@
 				zend_hash_move_forward(Z_ARRVAL_PP(params_array));
 				curr = curr->next;
 			}
-			
 	 		if ( !chaining_start && (error[0] == '\0' ) ) {
 				/* Set statement attribute SQL_ATTR_CHAINING_BEGIN */
 				rc = _ibm_db_chaining_flag(stmt_res, SQL_ATTR_CHAINING_BEGIN, NULL, 0 TSRMLS_CC);
 				chaining_start = 1;
 				if ( rc != SQL_SUCCESS ) {
+					error_msg_node *tmp_err_node;
+					while ( head_error_list != NULL ) {
+						tmp_err_node = head_error_list;
+						head_error_list = head_error_list->next;
+						efree(tmp_err_node);
+					}
+					while ( stmt_res->head_cache_list != NULL ) {
+						curr = stmt_res->head_cache_list;
+						stmt_res->head_cache_list = stmt_res->head_cache_list->next;
+						efree(curr);
+					}
+					_free_param_cache_list(stmt_res);
+					efree(array_data_type);
+					efree(data_type);
 					RETURN_FALSE;
 				}
 			}
@@ -6981,11 +7036,15 @@
 			zend_hash_move_forward(Z_ARRVAL_P(params));
 		}
 	}
+	_free_param_cache_list(stmt_res);
+	efree(array_data_type);
+	efree(data_type);
 
 	/* Set statement attribute SQL_ATTR_CHAINING_END */
 	rc = SQL_ERROR;
 	if ( chaining_start ) {
 		rc = _ibm_db_chaining_flag(stmt_res, SQL_ATTR_CHAINING_END, head_error_list->next, err_count TSRMLS_CC);
+		efree(head_error_list);
 	}
 
 	if ( rc != SQL_SUCCESS || err_count != 0 ) {
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Fri Apr 26 00:01:30 2024 UTC