]> granicus.if.org Git - php/commitdiff
Fixed bug #71245 (file_get_contents() ignores "header" context option if it's a refer...
authorXinchen Hui <laruence@gmail.com>
Wed, 30 Dec 2015 13:04:21 +0000 (05:04 -0800)
committerXinchen Hui <laruence@gmail.com>
Wed, 30 Dec 2015 13:04:21 +0000 (05:04 -0800)
NEWS
ext/standard/streamsfuncs.c
ext/standard/tests/streams/bug71245.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 5999518f3211fec5223ee28c728d82a8248dc4d2..372f47cdc3e6bc0a7fc1098b5aae65248c8f5dab 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -19,6 +19,8 @@ PHP                                                                        NEWS
     immediately). (Laruence)
 
 - Standard:
+  . Fixed bug #71245 (file_get_contents() ignores "header" context option if
+    it's a reference). (Laruence)
   . Fixed bug #71220 (Null pointer deref (segfault) in compact via ob_start).
     (hugh at allthethings dot co dot nz)
   . Fixed bug #71190 (substr_replace converts integers in original $search
index f257ef85e6ba887f0d08de7fb84ad616493650c1..bc8c8557dee7cc6c92f41bb1ea5250ce118c4027 100644 (file)
@@ -881,10 +881,11 @@ static int parse_context_options(php_stream_context *context, zval *options)
        int ret = SUCCESS;
 
        ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(options), wkey, wval) {
-               if (wkey && Z_TYPE_P(wval) == IS_ARRAY) {
-
+               ZVAL_DEREF(wval);
+               if (Z_TYPE_P(wval) == IS_ARRAY) {
                    ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(wval), okey, oval) {
                                if (okey) {
+                                       ZVAL_DEREF(oval);
                                        php_stream_context_set_option(context, ZSTR_VAL(wkey), ZSTR_VAL(okey), oval);
                                }
                        } ZEND_HASH_FOREACH_END();
diff --git a/ext/standard/tests/streams/bug71245.phpt b/ext/standard/tests/streams/bug71245.phpt
new file mode 100644 (file)
index 0000000..e1d82f6
--- /dev/null
@@ -0,0 +1,39 @@
+--TEST--
+Bug #71245 (file_get_contents() ignores "header" context option if it's a reference)
+--FILE--
+<?php
+$headers = ['Host: okey.com'];
+$httpContext = [
+       'http' => [
+               'protocol_version'      => '1.1',
+               'method'                        => 'GET',
+               'header'                        => &$headers,
+               'follow_location'       => 0,
+               'max_redirects'         => 0,
+               'ignore_errors'         => true,
+               'timeout'                       => 60,
+       ],
+];
+$context = stream_context_create($httpContext);
+$headers = ["Host: bad.com"];
+print_r(stream_context_get_options($context));
+?>
+--EXPECTF--
+Array
+(
+    [http] => Array
+        (
+            [protocol_version] => 1.1
+            [method] => GET
+            [header] => Array
+                (
+                    [0] => Host: okey.com
+                )
+
+            [follow_location] => 0
+            [max_redirects] => 0
+            [ignore_errors] => 1
+            [timeout] => 60
+        )
+
+)