]> granicus.if.org Git - php/commitdiff
Fixed bug #75287 (Builtin webserver crash after chdir in a shutdown function)
authorXinchen Hui <laruence@gmail.com>
Sun, 15 Oct 2017 02:28:28 +0000 (10:28 +0800)
committerXinchen Hui <laruence@gmail.com>
Sun, 15 Oct 2017 02:28:28 +0000 (10:28 +0800)
NEWS
sapi/cli/php_cli_server.c

diff --git a/NEWS b/NEWS
index 11223dd97a5ee05d9a061a0b48c417e908370607..de12a7f586cdc03f59c1b7d32467c6eab9aaa453 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -6,6 +6,10 @@ PHP                                                                        NEWS
   . Fixed bug #75368 (mmap/munmap trashing on unlucky allocations). (Nikita,
     Dmitry)
 
+- CLI:
+  . Fixed bug #75287 (Builtin webserver crash after chdir in a shutdown
+    function). (Laruence)
+
 - Exif:
   . Fixed bug #75301 (Exif extension has built in revision version). (Peter
     Kokot)
index 39ded2f5b3cee07fd1ac037d62bd649ea0db4660..48480bb1e29e299bb7248e928fe531c808f5bd79 100644 (file)
@@ -2106,12 +2106,6 @@ static int php_cli_server_dispatch_router(php_cli_server *server, php_cli_server
 {
        int decline = 0;
        zend_file_handle zfd;
-       char *old_cwd;
-
-       ALLOCA_FLAG(use_heap)
-       old_cwd = do_alloca(MAXPATHLEN, use_heap);
-       old_cwd[0] = '\0';
-       php_ignore_value(VCWD_GETCWD(old_cwd, MAXPATHLEN - 1));
 
        zfd.type = ZEND_HANDLE_FILENAME;
        zfd.filename = server->router;
@@ -2133,12 +2127,6 @@ static int php_cli_server_dispatch_router(php_cli_server *server, php_cli_server
                }
        } zend_end_try();
 
-       if (old_cwd[0] != '\0') {
-               php_ignore_value(VCWD_CHDIR(old_cwd));
-       }
-
-       free_alloca(old_cwd, use_heap);
-
        return decline;
 }
 /* }}} */
@@ -2330,10 +2318,20 @@ static int php_cli_server_ctor(php_cli_server *server, const char *addr, const c
 
        if (router) {
                size_t router_len = strlen(router);
-               _router = pestrndup(router, router_len, 1);
-               if (!_router) {
-                       retval = FAILURE;
-                       goto out;
+               if (!IS_ABSOLUTE_PATH(router, router_len)) {
+                       _router = pemalloc(server->document_root_len + router_len + 2, 1);
+                       if (!_router) {
+                               retval = FAILURE;
+                               goto out;
+                       }
+                       snprintf(_router,
+                               server->document_root_len + router_len + 2, "%s%c%s", server->document_root, DEFAULT_SLASH, router);
+               } else {
+                       _router = pestrndup(router, router_len, 1);
+                       if (!_router) {
+                               retval = FAILURE;
+                               goto out;
+                       }
                }
                server->router = _router;
                server->router_len = router_len;