]> granicus.if.org Git - php/commitdiff
Fixed segfault in file_get_contents
authorXinchen Hui <laruence@gmail.com>
Fri, 21 Feb 2014 08:32:46 +0000 (16:32 +0800)
committerXinchen Hui <laruence@gmail.com>
Fri, 21 Feb 2014 08:32:46 +0000 (16:32 +0800)
main/streams/streams.c
main/streams/transports.c

index 8fa601a541ba89232eb1e8339a0e521c036c74d7..fe592c5e9b01255922293a135346d0e8ddac93b9 100644 (file)
@@ -232,7 +232,7 @@ void php_stream_display_wrapper_errors(php_stream_wrapper *wrapper, const char *
 void php_stream_tidy_wrapper_error_log(php_stream_wrapper *wrapper TSRMLS_DC)
 {
        if (wrapper && FG(wrapper_errors)) {
-               zend_hash_str_del(FG(wrapper_errors), (const char*)&wrapper, sizeof wrapper);
+               zend_hash_str_del(FG(wrapper_errors), (const char*)&wrapper, sizeof(wrapper));
        }
 }
 
@@ -241,6 +241,12 @@ static void wrapper_error_dtor(void *error)
        efree(*(char**)error);
 }
 
+static void wrapper_list_dtor(zval *item) {
+       zend_llist *list = (zend_llist*)Z_PTR_P(item);
+       zend_llist_destroy(list);
+       efree(list);
+}
+
 PHPAPI void php_stream_wrapper_log_error(php_stream_wrapper *wrapper, int options TSRMLS_DC, const char *fmt, ...)
 {
        va_list args;
@@ -257,18 +263,16 @@ PHPAPI void php_stream_wrapper_log_error(php_stream_wrapper *wrapper, int option
                zend_llist *list = NULL;
                if (!FG(wrapper_errors)) {
                        ALLOC_HASHTABLE(FG(wrapper_errors));
-                       zend_hash_init(FG(wrapper_errors), 8, NULL,
-                                       (dtor_func_t)zend_llist_destroy, 0);
+                       zend_hash_init(FG(wrapper_errors), 8, NULL, wrapper_list_dtor, 0);
                } else {
-                       list = zend_hash_str_find_ptr(FG(wrapper_errors), (const char*)&wrapper,
-                               sizeof wrapper);
+                       list = zend_hash_str_find_ptr(FG(wrapper_errors), (const char*)&wrapper, sizeof(wrapper));
                }
 
                if (!list) {
                        zend_llist new_list;
-                       zend_llist_init(&new_list, sizeof buffer, wrapper_error_dtor, 0);
-                       zend_hash_str_update_mem(FG(wrapper_errors), (const char*)&wrapper,
-                               sizeof wrapper, &new_list, sizeof new_list);
+                       zend_llist_init(&new_list, sizeof(buffer), wrapper_error_dtor, 0);
+                       list = zend_hash_str_update_mem(FG(wrapper_errors), (const char*)&wrapper, 
+                                       sizeof(wrapper), &new_list, sizeof(new_list));
                }
 
                /* append to linked list */
index 6588cb947ea30fda13fccdc6d0e84359bb497a6d..7ede9407e60a100fc5e6744c3d11c258f3cb21e4 100644 (file)
@@ -58,7 +58,7 @@ PHPAPI php_stream *_php_stream_xport_create(const char *name, size_t namelen, in
                STREAMS_DC TSRMLS_DC)
 {
        php_stream *stream = NULL;
-       php_stream_transport_factory *factory = NULL;
+       php_stream_transport_factory factory;
        const char *p, *protocol = NULL;
        int n = 0, failed = 0;
        char *error_text = NULL;
@@ -129,7 +129,7 @@ PHPAPI php_stream *_php_stream_xport_create(const char *name, size_t namelen, in
                return NULL;
        }
 
-       stream = (*factory)(protocol, n,
+       stream = (factory)(protocol, n,
                        (char*)name, namelen, persistent_id, options, flags, timeout,
                        context STREAMS_REL_CC TSRMLS_CC);