Skip to content

Commit

Permalink
Fixed bug #73904 php-cgi fails to load -c specified php.ini file
Browse files Browse the repository at this point in the history
  • Loading branch information
weltling committed Jan 12, 2017
1 parent 8f6dad1 commit 9f3b3a5
Showing 1 changed file with 23 additions and 6 deletions.
29 changes: 23 additions & 6 deletions sapi/cgi/cgi_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand All @@ -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) {
Expand Down Expand Up @@ -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;
Expand All @@ -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();
Expand Down

0 comments on commit 9f3b3a5

Please sign in to comment.