From 29e2ce597be8aad45f009cf72b1b6c2b8681de23 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Fri, 21 Feb 2014 16:32:46 +0800 Subject: [PATCH] Fixed segfault in file_get_contents --- main/streams/streams.c | 20 ++++++++++++-------- main/streams/transports.c | 4 ++-- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/main/streams/streams.c b/main/streams/streams.c index 8fa601a541..fe592c5e9b 100644 --- a/main/streams/streams.c +++ b/main/streams/streams.c @@ -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 */ diff --git a/main/streams/transports.c b/main/streams/transports.c index 6588cb947e..7ede9407e6 100644 --- a/main/streams/transports.c +++ b/main/streams/transports.c @@ -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); -- 2.40.0