]> granicus.if.org Git - php/commitdiff
Fixed segfault of stream handling
authorXinchen Hui <laruence@php.net>
Wed, 18 Jun 2014 06:42:46 +0000 (14:42 +0800)
committerXinchen Hui <laruence@php.net>
Wed, 18 Jun 2014 07:03:01 +0000 (15:03 +0800)
ext/mysqlnd/mysqlnd.c
ext/mysqlnd/mysqlnd_net.c
ext/mysqlnd/mysqlnd_result.c
ext/mysqlnd/mysqlnd_wireprotocol.c

index c5db05b91dda07196e300ce7d957a904d03d0497..acd1615f7cd87c6d3476cabe83f1880070c04ce8 100644 (file)
@@ -998,7 +998,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, connect)(MYSQLND_CONN_DATA * conn,
                                        SET_OOM_ERROR(*conn->error_info);
                                        goto err; /* OOM */
                                }
-                               conn->host_info =  mnd_pestrdup(p, conn->persistent);
+                               conn->host_info = mnd_pestrdup(p, conn->persistent);
                                mnd_sprintf_free(p);
                                if (!conn->host_info) {
                                        SET_OOM_ERROR(*conn->error_info);
index 4ec9aa4ee9e80f08b6621ba0fb5fd9e338ca93f1..6ca44ccc463e1a9e894c0ebdffe503558fc5d007 100644 (file)
@@ -200,7 +200,7 @@ MYSQLND_METHOD(mysqlnd_net, open_tcp_or_unix)(MYSQLND_NET * const net, const cha
                */
                zend_resource *le;
 
-               if ((le = zend_hash_str_find(&EG(persistent_list), hashed_details, hashed_details_len))) {
+               if ((le = zend_hash_str_find_ptr(&EG(persistent_list), hashed_details, hashed_details_len))) {
                        /*
                          in_free will let streams code skip destructing - big HACK,
                          but STREAMS suck big time regarding persistent streams.
@@ -223,7 +223,7 @@ MYSQLND_METHOD(mysqlnd_net, open_tcp_or_unix)(MYSQLND_NET * const net, const cha
          unregistered yntil the script ends. So, we need to take care of that.
        */
        net_stream->in_free = 1;
-       zend_hash_index_del(&EG(regular_list), net_stream->res->handle); /* ToDO: should it be res->handle, do streams register with addref ?*/
+       //????zend_hash_index_del(&EG(regular_list), net_stream->res->handle); /* ToDO: should it be res->handle, do streams register with addref ?*/
        net_stream->in_free = 0;
 
        DBG_RETURN(net_stream);
index a8ae8be92b92ca9ab77eee92f874f6577ae9b2b8..26551ecd69f43b24c4db77ee13aa97a481924236 100644 (file)
@@ -1800,7 +1800,6 @@ MYSQLND_METHOD(mysqlnd_res, fetch_into)(MYSQLND_RES * result, const unsigned int
          Hint Zend how many elements we will have in the hash. Thus it won't
          extend and rehash the hash constantly.
        */
-       ZVAL_NEW_ARR(return_value);
        array_init_size(return_value, mysqlnd_num_fields(result) * 2);
        if (FAIL == result->m.fetch_row(result, (void *)return_value, flags, &fetched_anything TSRMLS_CC)) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error while reading a row");
@@ -1868,7 +1867,6 @@ MYSQLND_METHOD(mysqlnd_res, fetch_all)(MYSQLND_RES * result, const unsigned int
        }
 
        /* 4 is a magic value. The cast is safe, if larger then the array will be later extended - no big deal :) */
-       ZVAL_NEW_ARR(return_value);
        array_init_size(return_value, set? (unsigned int) set->row_count : 4);
 
        do {
index e8237050dde2d36937ab43fa0553d7fea228e542..2eeebeed22d6b8a38c239c38170202ffa5e7b0e3 100644 (file)
@@ -1760,24 +1760,30 @@ php_mysqlnd_rowp_read_text_protocol_aux(MYSQLND_MEMORY_POOL_CHUNK * row_buffer,
                                        bit_area += 1 + sprintf((char *)start, "%ld", Z_LVAL_P(current_field));
                                        //????  ZVAL_STRINGL(current_field, (char *) start, bit_area - start - 1, copy_data);
                                        ZVAL_STRINGL(current_field, (char *) start, bit_area - start - 1);
+                                       /*
                                        if (!copy_data) {
                                                efree(start);
                                        }
+                                       */
                                } else if (Z_TYPE_P(current_field) == IS_STRING){
                                        memcpy(bit_area, Z_STRVAL_P(current_field), Z_STRLEN_P(current_field));
                                        bit_area += Z_STRLEN_P(current_field);
                                        *bit_area++ = '\0';
                                        zval_dtor(current_field);
                                        ZVAL_STRINGL(current_field, (char *) start, bit_area - start - 1);
+                                       /*
                                        if (!copy_data) {
                                                efree(start);
                                        }
+                                       */
                                }
                        } else {
                                ZVAL_STRINGL(current_field, (char *)p, len);
+                               /*
                                if (!copy_data) {
                                        efree(p);
                                }
+                               */
                        }
                        p += len;
                        last_field_was_string = TRUE;