diff options
author | Stanislav Malyshev <stas@php.net> | 2015-04-12 22:00:18 -0700 |
---|---|---|
committer | Stanislav Malyshev <stas@php.net> | 2015-04-12 22:38:34 -0700 |
commit | 45facd15fb1be704ee1ae374fa306dad8450edbd (patch) | |
tree | be896dd53ba3ff118c887f9cec277b00afe8ff2c | |
parent | a643ccfb90750e0d830106588d2a46af87706b5b (diff) | |
download | php-git-45facd15fb1be704ee1ae374fa306dad8450edbd.tar.gz |
fix memory leak & add test
-rw-r--r-- | ext/standard/http_fopen_wrapper.c | 9 | ||||
-rw-r--r-- | ext/standard/tests/http/bug69337.phpt | 41 |
2 files changed, 48 insertions, 2 deletions
diff --git a/ext/standard/http_fopen_wrapper.c b/ext/standard/http_fopen_wrapper.c index 9c99496ed4..bd642875ee 100644 --- a/ext/standard/http_fopen_wrapper.c +++ b/ext/standard/http_fopen_wrapper.c @@ -922,8 +922,13 @@ out: if (transfer_encoding) { php_stream_filter_append(&stream->readfilters, transfer_encoding); } - } else if (transfer_encoding) { - php_stream_filter_free(transfer_encoding TSRMLS_CC); + } else { + if(response_header) { + Z_DELREF_P(response_header); + } + if (transfer_encoding) { + php_stream_filter_free(transfer_encoding TSRMLS_CC); + } } return stream; diff --git a/ext/standard/tests/http/bug69337.phpt b/ext/standard/tests/http/bug69337.phpt new file mode 100644 index 0000000000..1451d4bf01 --- /dev/null +++ b/ext/standard/tests/http/bug69337.phpt @@ -0,0 +1,41 @@ +--TEST-- +Bug #69337 (Stream context leaks when http request fails) +--SKIPIF-- +<?php require 'server.inc'; http_server_skipif('tcp://127.0.0.1:22345'); ?> +--INI-- +allow_url_fopen=1 +allow_url_include=1 +--FILE-- +<?php +require 'server.inc'; + +function stream_notification_callback($notification_code, $severity, $message, $message_code, $bytes_transferred, $bytes_max) +{ + if($notification_code == STREAM_NOTIFY_REDIRECTED) { + // $http_response_header is now a string, but will be used as an array + // by php_stream_url_wrap_http_ex() later on + $GLOBALS['http_response_header'] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\0\0\0\0"; + } +} + +$ctx = stream_context_create(); +stream_context_set_params($ctx, array("notification" => "stream_notification_callback")); + +$responses = array( + "data://text/plain,HTTP/1.0 302 Found\r\nLocation: http://127.0.0.1:22345/try-again\r\n\r\n", + "data://text/plain,HTTP/1.0 404 Not Found\r\n\r\n", +); + +$pid = http_server("tcp://127.0.0.1:22345", $responses, $output); + +$f = file_get_contents('http://127.0.0.1:22345/', 0, $ctx); + +http_server_kill($pid); +var_dump($f); +?> +==DONE== +--EXPECTF-- +string(26) "HTTP/1.0 404 Not Found + +" +==DONE==
\ No newline at end of file |