]> granicus.if.org Git - php/commitdiff
Fix bug #69625: FPM returns 200 status on request without SCRIPT_FILENAME
authorJakub Zelenka <bukka@php.net>
Sat, 28 Nov 2020 21:27:53 +0000 (21:27 +0000)
committerJakub Zelenka <bukka@php.net>
Sun, 13 Dec 2020 18:39:48 +0000 (18:39 +0000)
NEWS
sapi/fpm/fpm/fpm_main.c
sapi/fpm/tests/bug69625-no-script-filename.phpt [new file with mode: 0644]
sapi/fpm/tests/response.inc
sapi/fpm/tests/tester.inc

diff --git a/NEWS b/NEWS
index 20f7da0f02ac95fbb36f85dfb2fa55e231ab0348..80c3cdd9c73a4dfa05178bc53704ba44287dc66b 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -18,6 +18,10 @@ PHP                                                                        NEWS
 - Fileinfo:
   . Fixed bug #77961 (finfo_open crafted magic parsing SIGABRT). (cmb)
 
+- FPM:
+  . Fixed bug #69625 (FPM returns 200 status on request without
+    SCRIPT_FILENAME env). (Jakub Zelenka)
+
 - Intl:
   . Fixed bug #80425 (MessageFormatAdapter::getArgTypeList redefined). (Nikita)
 
index 839ed57eaacccdc4020364a383bebaba8a254e0c..7505afde76cb8ac935a80676e3e164ca8cc63352 100644 (file)
@@ -973,7 +973,7 @@ static void init_request_info(void)
 
        /* initialize the defaults */
        SG(request_info).path_translated = NULL;
-       SG(request_info).request_method = NULL;
+       SG(request_info).request_method = FCGI_GETENV(request, "REQUEST_METHOD");
        SG(request_info).proto_num = 1000;
        SG(request_info).query_string = NULL;
        SG(request_info).request_uri = NULL;
@@ -981,10 +981,8 @@ static void init_request_info(void)
        SG(request_info).content_length = 0;
        SG(sapi_headers).http_response_code = 200;
 
-       /* script_path_translated being set is a good indication that
-        * we are running in a cgi environment, since it is always
-        * null otherwise.  otherwise, the filename
-        * of the script will be retrieved later via argc/argv */
+       /* if script_path_translated is not set, then there is no point to carry on
+        * as the response is 404 and there is no further processing. */
        if (script_path_translated) {
                const char *auth;
                char *content_length = FCGI_GETENV(request, "CONTENT_LENGTH");
@@ -1314,7 +1312,6 @@ static void init_request_info(void)
                        SG(request_info).path_translated = estrdup(script_path_translated);
                }
 
-               SG(request_info).request_method = FCGI_GETENV(request, "REQUEST_METHOD");
                /* FIXME - Work out proto_num here */
                SG(request_info).query_string = FCGI_GETENV(request, "QUERY_STRING");
                SG(request_info).content_type = (content_type ? content_type : "" );
diff --git a/sapi/fpm/tests/bug69625-no-script-filename.phpt b/sapi/fpm/tests/bug69625-no-script-filename.phpt
new file mode 100644 (file)
index 0000000..9c6478d
--- /dev/null
@@ -0,0 +1,45 @@
+--TEST--
+FPM: bug69625 - 404 should be returned on missing SCRIPT_FILENAME
+--SKIPIF--
+<?php include "skipif.inc"; ?>
+--FILE--
+<?php
+
+require_once "tester.inc";
+
+$cfg = <<<EOT
+[global]
+error_log = {{FILE:LOG}}
+[unconfined]
+listen = {{ADDR}}
+pm = dynamic
+pm.max_children = 5
+pm.start_servers = 1
+pm.min_spare_servers = 1
+pm.max_spare_servers = 3
+EOT;
+
+$code = <<<EOT
+<?php
+echo "Test\n";
+EOT;
+
+$tester = new FPM\Tester($cfg, $code);
+$tester->start();
+$tester->expectLogStartNotices();
+$tester
+    ->request('', ['SCRIPT_FILENAME' => null])
+    ->expectHeader('Status', '404 Not Found')
+    ->expectError('Primary script unknown');
+$tester->terminate();
+$tester->close();
+
+?>
+Done
+--EXPECT--
+Done
+--CLEAN--
+<?php
+require_once "tester.inc";
+FPM\Tester::clean();
+?>
index 54f85bcfb60623b20aa53c92e394e0551f216932..7ee9cd46403ac8112029bfa0ac940d9fc411d0e0 100644 (file)
@@ -98,6 +98,34 @@ class Response
         return $this->expectBody('');
     }
 
+    /**
+     * @param string $name
+     * @param string $value
+     * @return Response
+     */
+    public function expectHeader($name, $value)
+    {
+        $this->checkHeader($name, $value);
+
+        return $this;
+    }
+
+    /**
+     * @param string $errorMessage
+     * @return Response
+     */
+    public function expectError($errorMessage)
+    {
+        $errorData = $this->getErrorData();
+        if ($errorData !== $errorMessage) {
+            $this->error(
+                "The expected error message '$errorMessage' is not equal to returned error '$errorData'"
+            );
+        }
+
+        return $this;
+    }
+
     /**
      * @param string $contentType
      * @return string|null
index da5719b0648b293d3eab45264d7af0463b19695b..5c57652d8843f258caee53ee940f3a1c7cb0cdad 100644 (file)
@@ -564,6 +564,10 @@ class Tester
             ],
             $headers
         );
+        $params = array_filter($params, function($value) {
+            return !is_null($value);
+        });
+
         try {
             $this->response = new Response(
                 $this->getClient($address, $connKeepAlive)->request_data($params, false)