brian 98/05/28 16:14:12
Modified: src/main util_script.c Log: PR: 2294 Submitted by: W G Stoddard <[EMAIL PROTECTED]> Reviewed by: Brian Behlendorf The environment variables were not properly being passed to the spawned process, now they are. Revision Changes Path 1.114 +37 -11 apache-1.3/src/main/util_script.c Index: util_script.c =================================================================== RCS file: /export/home/cvs/apache-1.3/src/main/util_script.c,v retrieving revision 1.113 retrieving revision 1.114 diff -u -r1.113 -r1.114 --- util_script.c 1998/05/28 11:32:44 1.113 +++ util_script.c 1998/05/28 23:14:11 1.114 @@ -711,7 +711,9 @@ int is_exe = 0; STARTUPINFO si; PROCESS_INFORMATION pi; - char *pCommand; + char *pCommand; + char *pEnvBlock, *pNext; + int iEnvBlockLen; memset(&si, 0, sizeof(si)); memset(&pi, 0, sizeof(pi)); @@ -861,16 +863,40 @@ r->filename, " ", arguments, NULL); } } - - if (CreateProcess(NULL, pCommand, NULL, NULL, TRUE, 0, env, NULL, &si, &pi)) { - pid = pi.dwProcessId; - /* - * We must close the handles to the new process and its main thread - * to prevent handle and memory leaks. - */ - CloseHandle(pi.hProcess); - CloseHandle(pi.hThread); - } + + /* + * Win32's CreateProcess call requires that the environment + * be passed in an environment block, a null terminated block of + * null terminated strings. + */ + + i = 0; + iEnvBlockLen = 1; + while (env[i]) { + iEnvBlockLen += strlen(env[i]) + 1; + i++; + } + + pEnvBlock = (char *)ap_pcalloc(r->pool,iEnvBlockLen); + + i = 0; + pNext = pEnvBlock; + while (env[i]) { + strcpy(pNext, env[i]); + pNext = pNext + strlen(pNext) + 1; + i++; + } + + if (CreateProcess(NULL, pCommand, NULL, NULL, TRUE, 0, pEnvBlock, + NULL, &si, &pi)) { + pid = pi.dwProcessId; + /* + * We must close the handles to the new process and its main thread + * to prevent handle and memory leaks. + */ + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + } #if 0 if ((!r->args) || (!r->args[0]) || strchr(r->args, '=')) { if (is_exe || is_binary) {