summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStanislav Malyshev <stas@php.net>2015-04-12 22:00:18 -0700
committerStanislav Malyshev <stas@php.net>2015-04-12 22:38:34 -0700
commit45facd15fb1be704ee1ae374fa306dad8450edbd (patch)
treebe896dd53ba3ff118c887f9cec277b00afe8ff2c
parenta643ccfb90750e0d830106588d2a46af87706b5b (diff)
downloadphp-git-45facd15fb1be704ee1ae374fa306dad8450edbd.tar.gz
fix memory leak & add test
-rw-r--r--ext/standard/http_fopen_wrapper.c9
-rw-r--r--ext/standard/tests/http/bug69337.phpt41
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