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 ) {
|