8d87dc
From 9137acc7ecdf1542fe6fda5056a0273359682735 Mon Sep 17 00:00:00 2001
8d87dc
From: Remi Collet <remi@php.net>
8d87dc
Date: Thu, 27 Feb 2014 08:45:16 +0100
8d87dc
Subject: [PATCH] Fixed Bug #66762 Segfault in mysqli_stmt::bind_result() when
8d87dc
 link closed
8d87dc
8d87dc
Each new mysqli_stmt now increase the refcount of the link object.
8d87dc
So the link is really destroy after all statements.
8d87dc
8d87dc
Only implemented with libmysqlclient, as mysqlnd already implement
8d87dc
this internally.
8d87dc
8d87dc
So, libmysqlclient and mysqlnd have the same behavior.
8d87dc
---
8d87dc
 ext/mysqli/mysqli.c             | 9 ++++++++-
8d87dc
 ext/mysqli/mysqli_api.c         | 8 ++++++++
8d87dc
 ext/mysqli/php_mysqli_structs.h | 4 ++++
8d87dc
 3 files changed, 20 insertions(+), 1 deletion(-)
8d87dc
8d87dc
diff --git a/ext/mysqli/mysqli.c b/ext/mysqli/mysqli.c
8d87dc
index 4e4ed5b..cbeb183 100644
8d87dc
--- a/ext/mysqli/mysqli.c
8d87dc
+++ b/ext/mysqli/mysqli.c
8d87dc
@@ -176,8 +176,11 @@ void php_clear_stmt_bind(MY_STMT *stmt TSRMLS_DC)
8d87dc
 	php_free_stmt_bind_buffer(stmt->param, FETCH_SIMPLE);
8d87dc
 	/* Clean output bind */
8d87dc
 	php_free_stmt_bind_buffer(stmt->result, FETCH_RESULT);
8d87dc
-#endif
8d87dc
 
8d87dc
+	if (stmt->link_handle) {
8d87dc
+	    zend_objects_store_del_ref_by_handle(stmt->link_handle TSRMLS_CC);
8d87dc
+	}
8d87dc
+#endif
8d87dc
 	if (stmt->query) {
8d87dc
 		efree(stmt->query);
8d87dc
 	}
8d87dc
@@ -1055,6 +1058,10 @@ PHP_FUNCTION(mysqli_stmt_construct)
8d87dc
 		efree(stmt);
8d87dc
 		RETURN_FALSE;
8d87dc
 	}
8d87dc
+#ifndef MYSQLI_USE_MYSQLND
8d87dc
+	stmt->link_handle = Z_OBJ_HANDLE(*mysql_link);
8d87dc
+	zend_objects_store_add_ref_by_handle(stmt->link_handle TSRMLS_CC);
8d87dc
+#endif
8d87dc
 
8d87dc
 	mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
8d87dc
 	mysqli_resource->ptr = (void *)stmt;
8d87dc
diff --git a/ext/mysqli/mysqli_api.c b/ext/mysqli/mysqli_api.c
8d87dc
index 1dbff87..0b28a43 100644
8d87dc
--- a/ext/mysqli/mysqli_api.c
8d87dc
+++ b/ext/mysqli/mysqli_api.c
8d87dc
@@ -1840,6 +1840,10 @@ PHP_FUNCTION(mysqli_prepare)
8d87dc
 		efree(stmt);
8d87dc
 		RETURN_FALSE;
8d87dc
 	}
8d87dc
+#ifndef MYSQLI_USE_MYSQLND
8d87dc
+	stmt->link_handle = Z_OBJ_HANDLE(*mysql_link);
8d87dc
+	zend_objects_store_add_ref_by_handle(stmt->link_handle TSRMLS_CC);
8d87dc
+#endif
8d87dc
 
8d87dc
 	mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
8d87dc
 	mysqli_resource->ptr = (void *)stmt;
8d87dc
@@ -2368,6 +2372,10 @@ PHP_FUNCTION(mysqli_stmt_init)
8d87dc
 		efree(stmt);
8d87dc
 		RETURN_FALSE;
8d87dc
 	}
8d87dc
+#ifndef MYSQLI_USE_MYSQLND
8d87dc
+	stmt->link_handle = Z_OBJ_HANDLE(*mysql_link);
8d87dc
+	zend_objects_store_add_ref_by_handle(stmt->link_handle TSRMLS_CC);
8d87dc
+#endif
8d87dc
 
8d87dc
 	mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
8d87dc
 	mysqli_resource->status = MYSQLI_STATUS_INITIALIZED;
8d87dc
diff --git a/ext/mysqli/php_mysqli_structs.h b/ext/mysqli/php_mysqli_structs.h
8d87dc
index d652592..d2fb34b 100644
8d87dc
--- a/ext/mysqli/php_mysqli_structs.h
8d87dc
+++ b/ext/mysqli/php_mysqli_structs.h
8d87dc
@@ -116,6 +116,10 @@ typedef struct {
8d87dc
 	BIND_BUFFER	param;
8d87dc
 	BIND_BUFFER	result;
8d87dc
 	char		*query;
8d87dc
+#ifndef MYSQLI_USE_MYSQLND
8d87dc
+	/* used to manage refcount with libmysql (already implement in mysqlnd) */
8d87dc
+	zend_object_handle link_handle;
8d87dc
+#endif
8d87dc
 } MY_STMT;
8d87dc
 
8d87dc
 typedef struct {
8d87dc
-- 
8d87dc
2.1.4
8d87dc
8d87dc
From 816a5d207270556aa5a9d74cdd8629d1b06cc350 Mon Sep 17 00:00:00 2001
8d87dc
From: Remi Collet <remi@php.net>
8d87dc
Date: Thu, 27 Feb 2014 08:48:01 +0100
8d87dc
Subject: [PATCH] test for bug #66762
8d87dc
8d87dc
---
8d87dc
 ext/mysqli/tests/bug66762.phpt | 26 ++++++++++++++++++++++++++
8d87dc
 1 file changed, 26 insertions(+)
8d87dc
 create mode 100644 ext/mysqli/tests/bug66762.phpt
8d87dc
8d87dc
diff --git a/ext/mysqli/tests/bug66762.phpt b/ext/mysqli/tests/bug66762.phpt
8d87dc
new file mode 100644
8d87dc
index 0000000..2b8a92c
8d87dc
--- /dev/null
8d87dc
+++ b/ext/mysqli/tests/bug66762.phpt
8d87dc
@@ -0,0 +1,26 @@
8d87dc
+--TEST--
8d87dc
+Bug #66762 	mysqli@libmysql segfault in mysqli_stmt::bind_result() when link closed
8d87dc
+--SKIPIF--
8d87dc
+
8d87dc
+require_once('skipif.inc');
8d87dc
+require_once('skipifconnectfailure.inc');
8d87dc
+?>
8d87dc
+--FILE--
8d87dc
+
8d87dc
+	require_once("connect.inc");
8d87dc
+
8d87dc
+	$mysqli = new mysqli($host, $user, $passwd, $db);
8d87dc
+
8d87dc
+	$read_stmt = $mysqli->prepare("SELECT 1");
8d87dc
+
8d87dc
+	var_dump($read_stmt->bind_result($data));
8d87dc
+
8d87dc
+	unset($mysqli);
8d87dc
+	var_dump($read_stmt->bind_result($data));
8d87dc
+	
8d87dc
+?>
8d87dc
+done!
8d87dc
+--EXPECT--
8d87dc
+bool(true)
8d87dc
+bool(true)
8d87dc
+done!
8d87dc
\ No newline at end of file
8d87dc
-- 
8d87dc
2.1.4
8d87dc