com php-src: Fixed segfault in file_get_contents: main/ streams/streams.c main/streams/transports.c
| From: | Dmitry Stogov | Date: | Fri, 21 Feb 2014 08:32:46 +0000 |
| Subject: | com php-src: Fixed segfault in file_get_contents: main/ streams/streams.c main/streams/transports.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-78039@lists.php.net to get a copy of this message | ||
Commit: 29e2ce597be8aad45f009cf72b1b6c2b8681de23
Author: Xinchen Hui <laruence@gmail.com> Fri, 21 Feb 2014 16:32:46 +0800
Parents: 15e9bfa048bd69024f5efb592a3a427285cb72fa
Branches: phpng
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=29e2ce597be8aad45f009cf72b1b6c2b8681de23
Log:
Fixed segfault in file_get_contents
Changed paths:
M main/streams/streams.c
M main/streams/transports.c
Diff:
diff --git a/main/streams/streams.c b/main/streams/streams.c
index 8fa601a..fe592c5 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 6588cb9..7ede940 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);