andrey                                   Mon, 01 Feb 2010 11:37:48 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=294298

Log:
backport checks from 5.3 which fix one known segfault,
and maybe others unknown.
Bug #50727      Accesing mysqli->affected_rows on no connection causes segfault

Bug: http://bugs.php.net/50727 (Assigned) Accesing mysqli->affected_rows on no 
connection causes segfault
      
Changed paths:
    U   php/php-src/branches/PHP_5_2/ext/mysqli/mysqli_prop.c

Modified: php/php-src/branches/PHP_5_2/ext/mysqli/mysqli_prop.c
===================================================================
--- php/php-src/branches/PHP_5_2/ext/mysqli/mysqli_prop.c	2010-02-01 09:11:27 UTC (rev 294297)
+++ php/php-src/branches/PHP_5_2/ext/mysqli/mysqli_prop.c	2010-02-01 11:37:48 UTC (rev 294298)
@@ -38,7 +38,7 @@

 #define MYSQLI_GET_MYSQL(statusval) \
 MYSQL *p; \
-ALLOC_ZVAL(*retval);\
+MAKE_STD_ZVAL(*retval);\
 if (!obj->ptr || !(MY_MYSQL *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr) { \
 	php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't fetch %s", obj->zo.ce->name);\
 	ZVAL_NULL(*retval);\
@@ -50,7 +50,7 @@

 #define MYSQLI_GET_RESULT(statusval) \
 MYSQL_RES *p; \
-ALLOC_ZVAL(*retval);\
+MAKE_STD_ZVAL(*retval);\
 if (!obj->ptr) { \
 	php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't fetch %s", obj->zo.ce->name);\
 	ZVAL_NULL(*retval);\
@@ -63,7 +63,7 @@

 #define MYSQLI_GET_STMT(statusval) \
 MYSQL_STMT *p; \
-ALLOC_ZVAL(*retval);\
+MAKE_STD_ZVAL(*retval);\
 if (!obj->ptr) { \
 	php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't fetch %s", obj->zo.ce->name);\
 	ZVAL_NULL(*retval);\
@@ -73,7 +73,7 @@
 	p = (MYSQL_STMT *)((MY_STMT *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr)->stmt;\
 }

-#define MYSQLI_MAP_PROPERTY_FUNC_LONG( __func, __int_func, __get_type, __ret_type)\
+#define MYSQLI_MAP_PROPERTY_FUNC_LONG( __func, __int_func, __get_type, __ret_type, __ret_type_sprint_mod)\
 static int __func(mysqli_object *obj, zval **retval TSRMLS_DC) \
 {\
 	__ret_type l;\
@@ -86,7 +86,7 @@
 			ZVAL_LONG(*retval, l);\
 		} else { \
 			char *ret; \
-			int ret_len = spprintf(&ret, 0, MYSQLI_LLU_SPEC, (my_ulonglong)l); \
+			int ret_len = spprintf(&ret, 0, __ret_type_sprint_mod, l); \
 			ZVAL_STRINGL(*retval, ret, ret_len, 0); \
 		} \
 	}\
@@ -114,7 +114,7 @@
 /* {{{ property link_client_version_read */
 static int link_client_version_read(mysqli_object *obj, zval **retval TSRMLS_DC)
 {
-	ALLOC_ZVAL(*retval);
+	MAKE_STD_ZVAL(*retval);
 	ZVAL_LONG(*retval, MYSQL_VERSION_ID);
 	return SUCCESS;
 }
@@ -123,7 +123,7 @@
 /* {{{ property link_client_info_read */
 static int link_client_info_read(mysqli_object *obj, zval **retval TSRMLS_DC)
 {
-	ALLOC_ZVAL(*retval);
+	MAKE_STD_ZVAL(*retval);
 	CHECK_STATUS(MYSQLI_STATUS_INITIALIZED);
 	ZVAL_STRING(*retval, MYSQL_SERVER_VERSION, 1);
 	return SUCCESS;
@@ -133,7 +133,7 @@
 /* {{{ property link_connect_errno_read */
 static int link_connect_errno_read(mysqli_object *obj, zval **retval TSRMLS_DC)
 {
-	ALLOC_ZVAL(*retval);
+	MAKE_STD_ZVAL(*retval);
 	ZVAL_LONG(*retval, (long)MyG(error_no));
 	return SUCCESS;
 }
@@ -142,7 +142,7 @@
 /* {{{ property link_connect_error_read */
 static int link_connect_error_read(mysqli_object *obj, zval **retval TSRMLS_DC)
 {
-	ALLOC_ZVAL(*retval);
+	MAKE_STD_ZVAL(*retval);
 	if (MyG(error_msg)) {
 		ZVAL_STRING(*retval, MyG(error_msg), 1);
 	} else {
@@ -158,8 +158,10 @@
 	MY_MYSQL *mysql;
 	my_ulonglong rc;

-	ALLOC_ZVAL(*retval);
+	MAKE_STD_ZVAL(*retval);

+	CHECK_STATUS(MYSQLI_STATUS_INITIALIZED);
+
  	mysql = (MY_MYSQL *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;

 	if (!mysql) {
@@ -169,7 +171,7 @@

 		rc = mysql_affected_rows(mysql->mysql);

-		if (rc == (my_ulonglong)-1) {
+		if (rc == (my_ulonglong) -1) {
 			ZVAL_LONG(*retval, -1);
 			return SUCCESS;
 		}
@@ -178,7 +180,7 @@
 			ZVAL_LONG(*retval, rc);
 		} else {
 			char *ret;
-			int l = spprintf(&ret, 0, MYSQLI_LLU_SPEC, (my_ulonglong) rc);
+			int l = spprintf(&ret, 0, MYSQLI_LLU_SPEC, rc);
 			ZVAL_STRINGL(*retval, ret, l, 0);
 		}
 	}
@@ -187,18 +189,18 @@
 /* }}} */

 /* link properties */
-MYSQLI_MAP_PROPERTY_FUNC_LONG(link_errno_read, mysql_errno, MYSQLI_GET_MYSQL(MYSQLI_STATUS_INITIALIZED), ulong);
+MYSQLI_MAP_PROPERTY_FUNC_LONG(link_errno_read, mysql_errno, MYSQLI_GET_MYSQL(MYSQLI_STATUS_INITIALIZED), ulong, "%lu");
 MYSQLI_MAP_PROPERTY_FUNC_STRING(link_error_read, mysql_error, MYSQLI_GET_MYSQL(MYSQLI_STATUS_INITIALIZED));
-MYSQLI_MAP_PROPERTY_FUNC_LONG(link_field_count_read, mysql_field_count, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), ulong);
+MYSQLI_MAP_PROPERTY_FUNC_LONG(link_field_count_read, mysql_field_count, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), ulong, "%lu");
 MYSQLI_MAP_PROPERTY_FUNC_STRING(link_host_info_read, mysql_get_host_info, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID));
 MYSQLI_MAP_PROPERTY_FUNC_STRING(link_info_read, mysql_info, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID));
-MYSQLI_MAP_PROPERTY_FUNC_LONG(link_insert_id_read, mysql_insert_id, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), my_ulonglong);
-MYSQLI_MAP_PROPERTY_FUNC_LONG(link_protocol_version_read, mysql_get_proto_info, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), ulong);
+MYSQLI_MAP_PROPERTY_FUNC_LONG(link_insert_id_read, mysql_insert_id, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), my_ulonglong, MYSQLI_LLU_SPEC);
+MYSQLI_MAP_PROPERTY_FUNC_LONG(link_protocol_version_read, mysql_get_proto_info, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), ulong, "%lu");
 MYSQLI_MAP_PROPERTY_FUNC_STRING(link_server_info_read, mysql_get_server_info, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID));
-MYSQLI_MAP_PROPERTY_FUNC_LONG(link_server_version_read, mysql_get_server_version, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), ulong);
+MYSQLI_MAP_PROPERTY_FUNC_LONG(link_server_version_read, mysql_get_server_version, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), ulong, "%lu");
 MYSQLI_MAP_PROPERTY_FUNC_STRING(link_sqlstate_read, mysql_sqlstate, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID));
-MYSQLI_MAP_PROPERTY_FUNC_LONG(link_thread_id_read, mysql_thread_id, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), ulong);
-MYSQLI_MAP_PROPERTY_FUNC_LONG(link_warning_count_read, mysql_warning_count, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), ulong);
+MYSQLI_MAP_PROPERTY_FUNC_LONG(link_thread_id_read, mysql_thread_id, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), ulong, "%lu");
+MYSQLI_MAP_PROPERTY_FUNC_LONG(link_warning_count_read, mysql_warning_count, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), ulong, "%lu");
 /* result properties */

 /* {{{ property result_type_read */
@@ -206,7 +208,7 @@
 {
 	MYSQL_RES *p;

-	ALLOC_ZVAL(*retval);
+	MAKE_STD_ZVAL(*retval);
 	CHECK_STATUS(MYSQLI_STATUS_VALID);
  	p = (MYSQL_RES *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;

@@ -223,33 +225,31 @@
 static int result_lengths_read(mysqli_object *obj, zval **retval TSRMLS_DC)
 {
 	MYSQL_RES *p;
+	ulong *ret;

-	ALLOC_ZVAL(*retval);
+	MAKE_STD_ZVAL(*retval);

 	CHECK_STATUS(MYSQLI_STATUS_VALID);
 	p = (MYSQL_RES *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
-	if (!p || !p->field_count) {
+	if (!p || !p->field_count || !(ret = mysql_fetch_lengths(p))) {
 		ZVAL_NULL(*retval);
 	} else {
 		ulong i;
-		zval *l;

 		array_init(*retval);

-		for (i=0; i < p->field_count; i++) {
-			MAKE_STD_ZVAL(l);
-			ZVAL_LONG(l, p->lengths[i]);
-			add_index_zval(*retval, i, l);
-		}
+		for (i = 0; i < p->field_count; i++) {
+			add_index_long(*retval, i, ret[i]);
+		}
 	}
 	return SUCCESS;
 }
 /* }}} */


-MYSQLI_MAP_PROPERTY_FUNC_LONG(result_current_field_read, mysql_field_tell, MYSQLI_GET_RESULT(MYSQLI_STATUS_VALID), ulong);
-MYSQLI_MAP_PROPERTY_FUNC_LONG(result_field_count_read, mysql_num_fields, MYSQLI_GET_RESULT(MYSQLI_STATUS_VALID), ulong);
-MYSQLI_MAP_PROPERTY_FUNC_LONG(result_num_rows_read, mysql_num_rows, MYSQLI_GET_RESULT(MYSQLI_STATUS_VALID), my_ulonglong);
+MYSQLI_MAP_PROPERTY_FUNC_LONG(result_current_field_read, mysql_field_tell, MYSQLI_GET_RESULT(MYSQLI_STATUS_VALID), ulong, "%lu");
+MYSQLI_MAP_PROPERTY_FUNC_LONG(result_field_count_read, mysql_num_fields, MYSQLI_GET_RESULT(MYSQLI_STATUS_VALID), ulong, "%lu");
+MYSQLI_MAP_PROPERTY_FUNC_LONG(result_num_rows_read, mysql_num_rows, MYSQLI_GET_RESULT(MYSQLI_STATUS_VALID), my_ulonglong, MYSQLI_LLU_SPEC);

 /* statement properties */

@@ -258,7 +258,7 @@
 {
 	MY_STMT *p;

-	ALLOC_ZVAL(*retval);
+	MAKE_STD_ZVAL(*retval);
 	CHECK_STATUS(MYSQLI_STATUS_VALID);

  	p = (MY_STMT*)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
@@ -278,7 +278,7 @@
 	MY_STMT *p;
 	my_ulonglong rc;

-	ALLOC_ZVAL(*retval);
+	MAKE_STD_ZVAL(*retval);
 	CHECK_STATUS(MYSQLI_STATUS_VALID);

  	p = (MY_STMT *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
@@ -288,7 +288,7 @@
 	} else {
 		rc = mysql_stmt_affected_rows(p->stmt);

-		if (rc == (my_ulonglong)-1) {
+		if (rc == (my_ulonglong) -1) {
 			ZVAL_LONG(*retval, -1);
 			return SUCCESS;
 		}
@@ -297,7 +297,7 @@
 			ZVAL_LONG(*retval, rc);
 		} else {
 			char *ret;
-			int l = spprintf(&ret, 0, MYSQLI_LLU_SPEC, (my_ulonglong) rc);
+			int l = spprintf(&ret, 0, MYSQLI_LLU_SPEC, rc);
 			ZVAL_STRINGL(*retval, ret, l, 0);
 		}
 	}
@@ -305,11 +305,11 @@
 }
 /* }}} */

-MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_insert_id_read, mysql_stmt_insert_id, MYSQLI_GET_STMT(MYSQLI_STATUS_VALID), my_ulonglong);
-MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_num_rows_read, mysql_stmt_num_rows, MYSQLI_GET_STMT(MYSQLI_STATUS_VALID), my_ulonglong);
-MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_param_count_read, mysql_stmt_param_count, MYSQLI_GET_STMT(MYSQLI_STATUS_VALID), ulong);
-MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_field_count_read, mysql_stmt_field_count, MYSQLI_GET_STMT(MYSQLI_STATUS_VALID), ulong);
-MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_errno_read, mysql_stmt_errno, MYSQLI_GET_STMT(MYSQLI_STATUS_INITIALIZED), ulong);
+MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_insert_id_read, mysql_stmt_insert_id, MYSQLI_GET_STMT(MYSQLI_STATUS_VALID), my_ulonglong, MYSQLI_LLU_SPEC);
+MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_num_rows_read, mysql_stmt_num_rows, MYSQLI_GET_STMT(MYSQLI_STATUS_VALID), my_ulonglong, MYSQLI_LLU_SPEC);
+MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_param_count_read, mysql_stmt_param_count, MYSQLI_GET_STMT(MYSQLI_STATUS_VALID), ulong, "%lu");
+MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_field_count_read, mysql_stmt_field_count, MYSQLI_GET_STMT(MYSQLI_STATUS_VALID), ulong, "%lu");
+MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_errno_read, mysql_stmt_errno, MYSQLI_GET_STMT(MYSQLI_STATUS_INITIALIZED), ulong, "%lu");
 MYSQLI_MAP_PROPERTY_FUNC_STRING(stmt_error_read, mysql_stmt_error, MYSQLI_GET_STMT(MYSQLI_STATUS_INITIALIZED));
 MYSQLI_MAP_PROPERTY_FUNC_STRING(stmt_sqlstate_read, mysql_stmt_sqlstate, MYSQLI_GET_STMT(MYSQLI_STATUS_INITIALIZED));

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to