]> granicus.if.org Git - php/commitdiff
Fixed bug #73904 php-cgi fails to load -c specified php.ini file
authorAnatol Belski <ab@php.net>
Thu, 12 Jan 2017 13:15:21 +0000 (14:15 +0100)
committerAnatol Belski <ab@php.net>
Thu, 12 Jan 2017 13:15:21 +0000 (14:15 +0100)
sapi/cgi/cgi_main.c

index e70579e0abecb6c748a6a8214f6c5de1343a28d0..f4f8cd9d3fcbf23b820f47f8721a0e5cc46fc12a 100644 (file)
@@ -2102,9 +2102,9 @@ consult the installation file that came with this distribution, or visit \n\
 
 #else
                if (children) {
-                       char *cmd_line;
+                       wchar_t *cmd_line_tmp, cmd_line[PHP_WIN32_IOUTIL_MAXPATHLEN];
+                       size_t cmd_line_len;
                        char kid_buf[16];
-                       char my_name[MAX_PATH] = {0};
                        int i;
 
                        ZeroMemory(&kid_cgi_ps, sizeof(kid_cgi_ps));
@@ -2115,8 +2115,25 @@ consult the installation file that came with this distribution, or visit \n\
                        /* kids will inherit the env, don't let them spawn */
                        SetEnvironmentVariable("PHP_FCGI_CHILDREN", NULL);
 
-                       GetModuleFileName(NULL, my_name, MAX_PATH);
-                       cmd_line = my_name;
+                       /* The current command line is used as is. This should normally be no issue,
+                               even if there were some I/O redirection. If some issues turn out, an
+                               extra parsing might be needed here. */
+                       cmd_line_tmp = GetCommandLineW();
+                       if (!cmd_line_tmp) {
+                               DWORD err = GetLastError();
+                               char *err_text = php_win32_error_to_msg(err);
+
+                               fprintf(stderr, "unable to get current command line: [0x%08lx]: %s\n", err, err_text);
+
+                               goto parent_out;
+                       }
+
+                       cmd_line_len = wcslen(cmd_line_tmp);
+                       if (cmd_line_len > sizeof(cmd_line) - 1) {
+                               fprintf(stderr, "command line is too long\n");
+                               goto parent_out;
+                       }
+                       memmove(cmd_line, cmd_line_tmp, (cmd_line_len + 1)*sizeof(wchar_t));
 
                        job = CreateJobObject(NULL, NULL);
                        if (!job) {
@@ -2152,7 +2169,7 @@ consult the installation file that came with this distribution, or visit \n\
                                i = kids;
                                while (0 < i--) {
                                        PROCESS_INFORMATION pi;
-                                       STARTUPINFO si;
+                                       STARTUPINFOW si;
 
                                        if (NULL != kid_cgi_ps[i]) {
                                                continue;
@@ -2167,7 +2184,7 @@ consult the installation file that came with this distribution, or visit \n\
                                        si.hStdInput  = (HANDLE)_get_osfhandle(fcgi_fd);
                                        si.hStdError  = INVALID_HANDLE_VALUE;
 
-                                       if (CreateProcess(NULL, cmd_line, NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) {
+                                       if (CreateProcessW(NULL, cmd_line, NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) {
                                                kid_cgi_ps[i] = pi.hProcess;
                                                if (!AssignProcessToJobObject(job, pi.hProcess)) {
                                                        DWORD err = GetLastError();