]> granicus.if.org Git - php/commitdiff
backport checks from 5.3 which fix one known segfault,
authorAndrey Hristov <andrey@php.net>
Mon, 1 Feb 2010 11:37:48 +0000 (11:37 +0000)
committerAndrey Hristov <andrey@php.net>
Mon, 1 Feb 2010 11:37:48 +0000 (11:37 +0000)
and maybe others unknown.
Bug #50727  Accesing mysqli->affected_rows on no connection causes segfault

ext/mysqli/mysqli_prop.c

index b5699d1f8d53c056a4e54fd9a95820a9648b989c..7e7e51304fdccd3ceaf4afbdbb613eb4d81c00bc 100644 (file)
@@ -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 @@ if (!obj->ptr || !(MY_MYSQL *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr) { \
 
 #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 @@ if (!obj->ptr) { \
 
 #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 @@ if (!obj->ptr) { \
        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 @@ static int __func(mysqli_object *obj, zval **retval TSRMLS_DC) \
                        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 @@ static int __func(mysqli_object *obj, zval **retval TSRMLS_DC)\
 /* {{{ 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 @@ static int link_client_version_read(mysqli_object *obj, zval **retval TSRMLS_DC)
 /* {{{ 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 @@ static int link_client_info_read(mysqli_object *obj, zval **retval TSRMLS_DC)
 /* {{{ 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 @@ static int link_connect_errno_read(mysqli_object *obj, zval **retval TSRMLS_DC)
 /* {{{ 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,7 +158,9 @@ static int link_affected_rows_read(mysqli_object *obj, zval **retval TSRMLS_DC)
        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;
        
@@ -169,7 +171,7 @@ static int link_affected_rows_read(mysqli_object *obj, zval **retval TSRMLS_DC)
 
                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 @@ static int link_affected_rows_read(mysqli_object *obj, zval **retval TSRMLS_DC)
                        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 @@ static int link_affected_rows_read(mysqli_object *obj, zval **retval TSRMLS_DC)
 /* }}} */
 
 /* 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 @@ static int result_type_read(mysqli_object *obj, zval **retval TSRMLS_DC)
 {
        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_type_read(mysqli_object *obj, zval **retval TSRMLS_DC)
 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 @@ static int stmt_id_read(mysqli_object *obj, zval **retval TSRMLS_DC)
 {
        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 @@ static int stmt_affected_rows_read(mysqli_object *obj, zval **retval TSRMLS_DC)
        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 @@ static int stmt_affected_rows_read(mysqli_object *obj, zval **retval TSRMLS_DC)
        } 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 @@ static int stmt_affected_rows_read(mysqli_object *obj, zval **retval TSRMLS_DC)
                        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 @@ static int stmt_affected_rows_read(mysqli_object *obj, zval **retval TSRMLS_DC)
 }
 /* }}} */
 
-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));