List:Commits« Previous MessageNext Message »
From:ahristov Date:June 26 2007 3:20pm
Subject:PHP mysqlnd svn commit: r500 - in trunk: mysqlnd php5/ext/mysqli php6/ext/mysqli tests/ext/mysqli
View as plain text  
Author: ahristov
Date: 2007-06-26 15:20:09 +0200 (Tue, 26 Jun 2007)
New Revision: 500

Modified:
   trunk/mysqlnd/mysqlnd_loaddata.c
   trunk/php5/ext/mysqli/mysqli.c
   trunk/php6/ext/mysqli/mysqli.c
   trunk/tests/ext/mysqli/mysqli_set_local_infile_handler_buffer_overflow.phpt
Log:
Fix a test.

Fix mysqlnd's load_data, error from the callback does not lead any
more to connection termination. It should be something more severe.


Modified: trunk/mysqlnd/mysqlnd_loaddata.c
===================================================================
--- trunk/mysqlnd/mysqlnd_loaddata.c	2007-06-26 12:56:52 UTC (rev 499)
+++ trunk/mysqlnd/mysqlnd_loaddata.c	2007-06-26 13:20:09 UTC (rev 500)
@@ -137,7 +137,7 @@
 					rc = -1;
 				} else if (Z_STRLEN_P(*callback_args[1]) > buf_len) {
 					/* check buffer overflow */
-					msg = "Buffer too small";
+					msg = "Too much data returned";
 					rc = -1;
 				} else {
 					memcpy(buf, Z_STRVAL_P(*callback_args[1]), MIN(rc, Z_STRLEN_P(*callback_args[1])));
@@ -224,7 +224,7 @@
 	} else {
 		zval_dtor(conn->infile.callback);
 	}
-	ZVAL_STRING(conn->infile.callback, funcname, 1);
+	ZVAL_STRING(conn->infile.callback, (char*) funcname, 1);
 }
 /* }}} */
 
@@ -294,6 +294,7 @@
 
 	/* error during read occured */
 	if (bufsize < 0) {
+		*is_warning = TRUE;
 		strcpy(conn->error_info.sqlstate, UNKNOWN_SQLSTATE);
 		conn->error_info.error_no = infile.local_infile_error(info,
conn->error_info.error,
 															 sizeof(conn->error_info.error) TSRMLS_CC);

Modified: trunk/php5/ext/mysqli/mysqli.c
===================================================================
--- trunk/php5/ext/mysqli/mysqli.c	2007-06-26 12:56:52 UTC (rev 499)
+++ trunk/php5/ext/mysqli/mysqli.c	2007-06-26 13:20:09 UTC (rev 500)
@@ -1252,9 +1252,14 @@
 		zval_ptr_dtor(&retval);
 
 		if (rc > 0) {
-			if (rc > buf_len || Z_STRLEN_P(*callback_args[1]) > buf_len) {
+			if (rc >= 0 && rc != Z_STRLEN_P(*callback_args[1])) {
+				LOCAL_INFILE_ERROR_MSG(data->error_msg,
+							"Mismatch between the return value of the callback and the content "
+							"length of the buffer.");
+				rc = -1;
+			} else if (rc > buf_len) {
 				/* check buffer overflow */
-				LOCAL_INFILE_ERROR_MSG(data->error_msg, "Read buffer too large");
+				LOCAL_INFILE_ERROR_MSG(data->error_msg, "Too much data returned");
 				rc = -1;
 			} else {
 				memcpy(buf, Z_STRVAL_P(*callback_args[1]), MIN(rc, Z_STRLEN_P(*callback_args[1])));

Modified: trunk/php6/ext/mysqli/mysqli.c
===================================================================
--- trunk/php6/ext/mysqli/mysqli.c	2007-06-26 12:56:52 UTC (rev 499)
+++ trunk/php6/ext/mysqli/mysqli.c	2007-06-26 13:20:09 UTC (rev 500)
@@ -1168,7 +1168,8 @@
 
 #define LOCAL_INFILE_ERROR_MSG(source,dest)\
 memset(source, 0, LOCAL_INFILE_ERROR_LEN);\
-memcpy(source, dest, LOCAL_INFILE_ERROR_LEN-1);
+memcpy(source, dest, LOCAL_INFILE_ERROR_LEN-1);\
+php_error_docref(NULL TSRMLS_CC, E_WARNING, dest);
 
 /* {{{ void php_set_local_infile_handler_default 
 */
@@ -1283,9 +1284,14 @@
 		zval_ptr_dtor(&retval);
 
 		if (rc > 0) {
-			if (rc > buf_len || Z_STRLEN_P(*callback_args[1]) > buf_len) {
+			if (rc >= 0 && rc != Z_STRLEN_P(*callback_args[1])) {
+				LOCAL_INFILE_ERROR_MSG(data->error_msg,
+							"Mismatch between the return value of the callback and the content "
+							"length of the buffer.");
+				rc = -1;
+			} else if (rc > buf_len) {
 				/* check buffer overflow */
-				LOCAL_INFILE_ERROR_MSG(data->error_msg, "Read buffer too large");
+				LOCAL_INFILE_ERROR_MSG(data->error_msg, "Too much data returned");
 				rc = -1;
 			} else {
 				memcpy(buf, Z_STRVAL_P(*callback_args[1]), MIN(rc, Z_STRLEN_P(*callback_args[1])));

Modified: trunk/tests/ext/mysqli/mysqli_set_local_infile_handler_buffer_overflow.phpt
===================================================================
--- trunk/tests/ext/mysqli/mysqli_set_local_infile_handler_buffer_overflow.phpt	2007-06-26
12:56:52 UTC (rev 499)
+++ trunk/tests/ext/mysqli/mysqli_set_local_infile_handler_buffer_overflow.phpt	2007-06-26
13:20:09 UTC (rev 500)
@@ -116,7 +116,6 @@
 Callback set to 'callback_buffer_overflow'
 Callback: 0
 
-Warning: mysqli_query(): Buffer too small in %s on line %d
-[022] LOAD DATA failed, [2] Buffer too small
-[023] [2006] MySQL server has gone away
+Warning: mysqli_query(): Too much data returned in %s on line %d
+[022] LOAD DATA failed, [%d] Too much data returned
 done!

Thread
PHP mysqlnd svn commit: r500 - in trunk: mysqlnd php5/ext/mysqli php6/ext/mysqli tests/ext/mysqliahristov26 Jun