Author: ahristov
Date: 2007-06-28 14:37:50 +0200 (Thu, 28 Jun 2007)
New Revision: 566
Modified:
trunk/php4/ext/mysql/mysql_mysqlnd.h
trunk/php4/ext/mysql/php_mysql.c
trunk/php5/ext/mysql/mysql_mysqlnd.h
trunk/php5/ext/mysql/php_mysql.c
trunk/php5/ext/mysqli/mysqli_mysqlnd.h
trunk/php6/ext/mysql/mysql_mysqlnd.h
trunk/php6/ext/mysql/php_mysql.c
trunk/php6/ext/mysql/tests
trunk/php6/ext/mysqli/mysqli_mysqlnd.h
Log:
Fix crashes when there is unbuffered query left
Modified: trunk/php4/ext/mysql/mysql_mysqlnd.h
===================================================================
--- trunk/php4/ext/mysql/mysql_mysqlnd.h 2007-06-28 12:32:53 UTC (rev 565)
+++ trunk/php4/ext/mysql/mysql_mysqlnd.h 2007-06-28 12:37:50 UTC (rev 566)
@@ -110,13 +110,14 @@
#define mysql_get_server_info(r) mysqlnd_get_server_info((r))
#define mysql_get_server_version(r) mysqlnd_get_server_version((r))
#define mysql_warning_count(r) mysqlnd_warning_count((r))
+#define mysql_eof(r) (((r)->unbuf && (r)->unbuf->eof_reached) ||
(r)->data)
/* Here comes non-libmysql API to have less ifdefs in mysqli*/
#define MYSQLI_CLOSE_EXPLICIT MYSQLND_CLOSE_EXPLICIT
#define MYSQLI_CLOSE_IMPLICIT MYSQLND_CLOSE_IMPLICIT
#define MYSQLI_CLOSE_DISCONNECTED MYSQLND_CLOSE_DISCONNECTED
-#define mysqli_result_is_unbuffered(r) ((r)->conn)
+#define mysqli_result_is_unbuffered(r) ((r)->unbuf)
#define mysqli_server_status(c) (c)->upsert_status.server_status
#define mysqli_stmt_warning_count(s) mysqlnd_stmt_warning_count((s))
#define mysqli_stmt_server_status(s) (s)->upsert_status.server_status
Modified: trunk/php4/ext/mysql/php_mysql.c
===================================================================
--- trunk/php4/ext/mysql/php_mysql.c 2007-06-28 12:32:53 UTC (rev 565)
+++ trunk/php4/ext/mysql/php_mysql.c 2007-06-28 12:37:50 UTC (rev 566)
@@ -247,14 +247,12 @@
if (mysql->active_result_id) { \
do { \
int type; \
- MYSQL_RES *result; \
+ MYSQL_RES *mysql_result; \
\
- result = (MYSQL_RES *) zend_list_find(mysql->active_result_id, &type); \
- MYSQLND_RES_UNBUFFERED *unbuf = result->unbuf; \
- if (unbuf) { \
- if (unbuf->last_row_data) { \
+ mysql_result = (MYSQL_RES *) zend_list_find(mysql->active_result_id, &type); \
+ if (mysql_result && type==le_result) { \
+ if (mysqli_result_is_unbuffered(mysql_result) && !mysql_eof(mysql_result)) {
\
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Function called without first fetching
all rows from a previous unbuffered query"); \
- mysql_free_result(result); \
} \
zend_list_delete(mysql->active_result_id); \
mysql->active_result_id = 0; \
Modified: trunk/php5/ext/mysql/mysql_mysqlnd.h
===================================================================
--- trunk/php5/ext/mysql/mysql_mysqlnd.h 2007-06-28 12:32:53 UTC (rev 565)
+++ trunk/php5/ext/mysql/mysql_mysqlnd.h 2007-06-28 12:37:50 UTC (rev 566)
@@ -110,13 +110,14 @@
#define mysql_get_server_info(r) mysqlnd_get_server_info((r))
#define mysql_get_server_version(r) mysqlnd_get_server_version((r))
#define mysql_warning_count(r) mysqlnd_warning_count((r))
+#define mysql_eof(r) (((r)->unbuf && (r)->unbuf->eof_reached) ||
(r)->data)
/* Here comes non-libmysql API to have less ifdefs in mysqli*/
#define MYSQLI_CLOSE_EXPLICIT MYSQLND_CLOSE_EXPLICIT
#define MYSQLI_CLOSE_IMPLICIT MYSQLND_CLOSE_IMPLICIT
#define MYSQLI_CLOSE_DISCONNECTED MYSQLND_CLOSE_DISCONNECTED
-#define mysqli_result_is_unbuffered(r) ((r)->conn)
+#define mysqli_result_is_unbuffered(r) ((r)->unbuf)
#define mysqli_server_status(c) (c)->upsert_status.server_status
#define mysqli_stmt_warning_count(s) mysqlnd_stmt_warning_count((s))
#define mysqli_stmt_server_status(s) (s)->upsert_status.server_status
Modified: trunk/php5/ext/mysql/php_mysql.c
===================================================================
--- trunk/php5/ext/mysql/php_mysql.c 2007-06-28 12:32:53 UTC (rev 565)
+++ trunk/php5/ext/mysql/php_mysql.c 2007-06-28 12:37:50 UTC (rev 566)
@@ -256,14 +256,12 @@
if (mysql->active_result_id) { \
do { \
int type; \
- MYSQL_RES *result; \
+ MYSQL_RES *mysql_result; \
\
- result = (MYSQL_RES *) zend_list_find(mysql->active_result_id, &type); \
- MYSQLND_RES_UNBUFFERED *unbuf = result->unbuf; \
- if (unbuf) { \
- if (unbuf->last_row_data) { \
+ mysql_result = (MYSQL_RES *) zend_list_find(mysql->active_result_id, &type); \
+ if (mysql_result && type==le_result) { \
+ if (mysqli_result_is_unbuffered(mysql_result) && !mysql_eof(mysql_result)) {
\
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Function called without first fetching
all rows from a previous unbuffered query"); \
- mysql_free_result(result); \
} \
zend_list_delete(mysql->active_result_id); \
mysql->active_result_id = 0; \
Modified: trunk/php5/ext/mysqli/mysqli_mysqlnd.h
===================================================================
--- trunk/php5/ext/mysqli/mysqli_mysqlnd.h 2007-06-28 12:32:53 UTC (rev 565)
+++ trunk/php5/ext/mysqli/mysqli_mysqlnd.h 2007-06-28 12:37:50 UTC (rev 566)
@@ -110,6 +110,7 @@
#define mysql_get_server_info(r) mysqlnd_get_server_info((r))
#define mysql_get_server_version(r) mysqlnd_get_server_version((r))
#define mysql_warning_count(r) mysqlnd_warning_count((r))
+#define mysql_eof(r) (((r)->unbuf && (r)->unbuf->eof_reached) ||
(r)->data)
/* Here comes non-libmysql API to have less ifdefs in mysqli*/
#define MYSQLI_CLOSE_EXPLICIT MYSQLND_CLOSE_EXPLICIT
Modified: trunk/php6/ext/mysql/mysql_mysqlnd.h
===================================================================
--- trunk/php6/ext/mysql/mysql_mysqlnd.h 2007-06-28 12:32:53 UTC (rev 565)
+++ trunk/php6/ext/mysql/mysql_mysqlnd.h 2007-06-28 12:37:50 UTC (rev 566)
@@ -110,13 +110,14 @@
#define mysql_get_server_info(r) mysqlnd_get_server_info((r))
#define mysql_get_server_version(r) mysqlnd_get_server_version((r))
#define mysql_warning_count(r) mysqlnd_warning_count((r))
+#define mysql_eof(r) (((r)->unbuf && (r)->unbuf->eof_reached) ||
(r)->data)
/* Here comes non-libmysql API to have less ifdefs in mysqli*/
#define MYSQLI_CLOSE_EXPLICIT MYSQLND_CLOSE_EXPLICIT
#define MYSQLI_CLOSE_IMPLICIT MYSQLND_CLOSE_IMPLICIT
#define MYSQLI_CLOSE_DISCONNECTED MYSQLND_CLOSE_DISCONNECTED
-#define mysqli_result_is_unbuffered(r) ((r)->conn)
+#define mysqli_result_is_unbuffered(r) ((r)->unbuf)
#define mysqli_server_status(c) (c)->upsert_status.server_status
#define mysqli_stmt_warning_count(s) mysqlnd_stmt_warning_count((s))
#define mysqli_stmt_server_status(s) (s)->upsert_status.server_status
Modified: trunk/php6/ext/mysql/php_mysql.c
===================================================================
--- trunk/php6/ext/mysql/php_mysql.c 2007-06-28 12:32:53 UTC (rev 565)
+++ trunk/php6/ext/mysql/php_mysql.c 2007-06-28 12:37:50 UTC (rev 566)
@@ -252,14 +252,12 @@
if (mysql->active_result_id) { \
do { \
int type; \
- MYSQL_RES *result; \
+ MYSQL_RES *mysql_result; \
\
- result = (MYSQL_RES *) zend_list_find(mysql->active_result_id, &type); \
- MYSQLND_RES_UNBUFFERED *unbuf = result->unbuf; \
- if (unbuf) { \
- if (unbuf->last_row_data) { \
+ mysql_result = (MYSQL_RES *) zend_list_find(mysql->active_result_id, &type); \
+ if (mysql_result && type==le_result) { \
+ if (mysqli_result_is_unbuffered(mysql_result) && !mysql_eof(mysql_result)) {
\
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Function called without first fetching
all rows from a previous unbuffered query"); \
- mysql_free_result(result); \
} \
zend_list_delete(mysql->active_result_id); \
mysql->active_result_id = 0; \
Modified: trunk/php6/ext/mysql/tests
===================================================================
--- trunk/php6/ext/mysql/tests 2007-06-28 12:32:53 UTC (rev 565)
+++ trunk/php6/ext/mysql/tests 2007-06-28 12:37:50 UTC (rev 566)
@@ -1 +1 @@
-link ../../../tests
\ No newline at end of file
+link ../../../tests/ext/mysql
\ No newline at end of file
Modified: trunk/php6/ext/mysqli/mysqli_mysqlnd.h
===================================================================
--- trunk/php6/ext/mysqli/mysqli_mysqlnd.h 2007-06-28 12:32:53 UTC (rev 565)
+++ trunk/php6/ext/mysqli/mysqli_mysqlnd.h 2007-06-28 12:37:50 UTC (rev 566)
@@ -107,7 +107,7 @@
#define mysql_get_server_info(r) mysqlnd_get_server_info((r))
#define mysql_get_server_version(r) mysqlnd_get_server_version((r))
#define mysql_warning_count(r) mysqlnd_warning_count((r))
-
+#define mysql_eof(r) (((r)->unbuf && (r)->unbuf->eof_reached) ||
(r)->data)
/* Here comes non-libmysql API to have less ifdefs in mysqli*/
#define MYSQLI_CLOSE_EXPLICIT MYSQLND_CLOSE_EXPLICIT
#define MYSQLI_CLOSE_IMPLICIT MYSQLND_CLOSE_IMPLICIT
| Thread |
|---|
| • PHP mysqlnd svn commit: r566 - in trunk: php4/ext/mysql php5/ext/mysql php5/ext/mysqli php6/ext/mysql php6/ext/mysqli | ahristov | 28 Jun |