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/mysqli | ahristov | 26 Jun |