diff options
Diffstat (limited to 'ext/mysqlnd/mysqlnd.c')
| -rw-r--r-- | ext/mysqlnd/mysqlnd.c | 59 | 
1 files changed, 47 insertions, 12 deletions
diff --git a/ext/mysqlnd/mysqlnd.c b/ext/mysqlnd/mysqlnd.c index 3c1bc82f44..88c59a9a56 100644 --- a/ext/mysqlnd/mysqlnd.c +++ b/ext/mysqlnd/mysqlnd.c @@ -2651,24 +2651,24 @@ MYSQLND_METHOD(mysqlnd_conn_data, tx_cor_options_to_string)(const MYSQLND_CONN_D  {  	if (mode & TRANS_COR_AND_CHAIN && !(mode & TRANS_COR_AND_NO_CHAIN)) {  		if (str->len) { -			smart_str_appendl(str, ", ", sizeof(", ") - 1); +			smart_str_appendl(str, " ", sizeof(" ") - 1);  		}  		smart_str_appendl(str, "AND CHAIN", sizeof("AND CHAIN") - 1);  	} else if (mode & TRANS_COR_AND_NO_CHAIN && !(mode & TRANS_COR_AND_CHAIN)) {  		if (str->len) { -			smart_str_appendl(str, ", ", sizeof(", ") - 1); +			smart_str_appendl(str, " ", sizeof(" ") - 1);  		}  		smart_str_appendl(str, "AND NO CHAIN", sizeof("AND NO CHAIN") - 1);  	}  	if (mode & TRANS_COR_RELEASE && !(mode & TRANS_COR_NO_RELEASE)) {  		if (str->len) { -			smart_str_appendl(str, ", ", sizeof(", ") - 1); +			smart_str_appendl(str, " ", sizeof(" ") - 1);  		}  		smart_str_appendl(str, "RELEASE", sizeof("RELEASE") - 1);  	} else if (mode & TRANS_COR_NO_RELEASE && !(mode & TRANS_COR_RELEASE)) {  		if (str->len) { -			smart_str_appendl(str, ", ", sizeof(", ") - 1); +			smart_str_appendl(str, " ", sizeof(" ") - 1);  		}  		smart_str_appendl(str, "NO RELEASE", sizeof("NO RELEASE") - 1);  	} @@ -2691,23 +2691,58 @@ MYSQLND_METHOD(mysqlnd_conn_data, tx_commit_or_rollback)(MYSQLND_CONN_DATA * con  			conn->m->tx_cor_options_to_string(conn, &tmp_str, flags TSRMLS_CC);  			smart_str_0(&tmp_str); +  			{ -				char * commented_name = NULL; -				unsigned int commented_name_len = name? mnd_sprintf(&commented_name, 0, " /*%s*/", name):0;  				char * query; -				unsigned int query_len = mnd_sprintf(&query, 0, (commit? "COMMIT%s %s":"ROLLBACK%s %s"), -													 commented_name? commented_name:"", tmp_str.c? tmp_str.c:""); -				smart_str_free(&tmp_str); +				char * name_esc = NULL; +				size_t query_len; +		 +				if (name) {	 +					const char * p_orig = name; +					char * p_copy; +					p_copy = name_esc = mnd_emalloc(strlen(name) + 1 + 2 + 2 + 1); /* space, open, close, NullS */ +					*p_copy++ = ' '; +					*p_copy++ = '/'; +					*p_copy++ = '*'; +					while (1) { +						register char v = *p_orig; +						if (v == 0) { +							break; +						} +						if ((v >= '0' && v <= '9') || +							(v >= 'a' && v <= 'z') || +							(v >= 'A' && v <= 'Z') || +							v == '-' || +							v == '_' || +							v == ' ' || +							v == '=') +						{ +							*p_copy = v; +						} else { +							*p_copy = '?'; +						} +						++p_orig; +						++p_copy; +					} +					*p_copy++ = '*'; +					*p_copy++ = '/'; +					*p_copy++ = 0; +				} +				query_len = mnd_sprintf(&query, 0, (commit? "COMMIT%s %s":"ROLLBACK%s %s"), +										name_esc? name_esc:"", tmp_str.c? tmp_str.c:""); +				smart_str_free(&tmp_str);  				if (!query) {  					SET_OOM_ERROR(*conn->error_info);  					break;  				} +				if (name_esc) { +					mnd_efree(name_esc); +					name_esc = NULL; +				} +  				ret = conn->m->query(conn, query, query_len TSRMLS_CC);  				mnd_sprintf_free(query); -				if (commented_name) { -					mnd_sprintf_free(commented_name); -				}  			}  		} while (0);  		conn->m->local_tx_end(conn, this_func, ret TSRMLS_CC);	  | 
