diff --git a/winpr/libwinpr/thread/process.c b/winpr/libwinpr/thread/process.c index cac0f73e6..d3945f28e 100644 --- a/winpr/libwinpr/thread/process.c +++ b/winpr/libwinpr/thread/process.c @@ -180,13 +180,14 @@ BOOL _CreateProcessExA(HANDLE hToken, DWORD dwLogonFlags, pid_t pid; int flags; int numArgs; - LPSTR* pArgs; - char** envp; + LPSTR* pArgs = NULL; + char** envp = NULL; char* filename = NULL; WINPR_THREAD* thread; WINPR_PROCESS* process; WINPR_ACCESS_TOKEN* token; LPTCH lpszEnvironmentBlock; + BOOL ret = FALSE; pid = 0; envp = NULL; @@ -210,6 +211,8 @@ BOOL _CreateProcessExA(HANDLE hToken, DWORD dwLogonFlags, } filename = FindApplicationPath(pArgs[0]); + if (NULL == filename) + goto finish; /* fork and exec */ @@ -218,7 +221,7 @@ BOOL _CreateProcessExA(HANDLE hToken, DWORD dwLogonFlags, if (pid < 0) { /* fork failure */ - return FALSE; + goto finish; } if (pid == 0) @@ -252,7 +255,8 @@ BOOL _CreateProcessExA(HANDLE hToken, DWORD dwLogonFlags, if (execve(filename, pArgs, envp) < 0) { - return FALSE; + /* execve failed - end the process */ + _exit(1); } } else @@ -263,7 +267,9 @@ BOOL _CreateProcessExA(HANDLE hToken, DWORD dwLogonFlags, process = (WINPR_PROCESS*) malloc(sizeof(WINPR_PROCESS)); if (!process) - return FALSE; + { + goto finish; + } ZeroMemory(process, sizeof(WINPR_PROCESS)); @@ -278,7 +284,9 @@ BOOL _CreateProcessExA(HANDLE hToken, DWORD dwLogonFlags, ZeroMemory(thread, sizeof(WINPR_THREAD)); if (!thread) - return FALSE; + { + goto finish; + } WINPR_HANDLE_SET_TYPE(thread, HANDLE_TYPE_THREAD); @@ -289,7 +297,13 @@ BOOL _CreateProcessExA(HANDLE hToken, DWORD dwLogonFlags, lpProcessInformation->dwProcessId = (DWORD) pid; lpProcessInformation->dwThreadId = (DWORD) pid; - free(filename); + ret = TRUE; + +finish: + if (filename) + { + free(filename); + } if (pArgs) { @@ -312,7 +326,7 @@ BOOL _CreateProcessExA(HANDLE hToken, DWORD dwLogonFlags, free(envp); } - return TRUE; + return ret; } BOOL CreateProcessA(LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes,