From 9f3b3a55fec84609a4e64321413fe80f0ecbd667 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Thu, 12 Jan 2017 14:15:21 +0100 Subject: [PATCH] Fixed bug #73904 php-cgi fails to load -c specified php.ini file --- sapi/cgi/cgi_main.c | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/sapi/cgi/cgi_main.c b/sapi/cgi/cgi_main.c index e70579e0ab..f4f8cd9d3f 100644 --- a/sapi/cgi/cgi_main.c +++ b/sapi/cgi/cgi_main.c @@ -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(); -- 2.40.0