Merge pull request #2852 from bmiklautz/process_env

Update CreateProcess and rfx
This commit is contained in:
MartinHaimberger 2015-09-02 10:09:11 +02:00
commit 74817efbdb
3 changed files with 107 additions and 12 deletions

View File

@ -676,10 +676,12 @@ static BOOL rfx_process_message_region(RFX_CONTEXT* context, RFX_MESSAGE* messag
if (message->numRects < 1)
{
/* Unfortunately, it isn't documented.
It seems that server asks to clip whole session when numRects = 0.
Issue: https://github.com/FreeRDP/FreeRDP/issues/1738 */
WLog_ERR(TAG, "no rects. Clip whole session.");
/*
If numRects is zero the decoder must generate a rectangle with
coordinates (0, 0, width, height).
See [MS-RDPRFX] (revision >= 17.0) 2.2.2.3.3 TS_RFX_REGION
https://msdn.microsoft.com/en-us/library/ff635233.aspx
*/
if (!(message->rects = (RFX_RECT*) malloc(sizeof(RFX_RECT))))
return FALSE;

View File

@ -168,7 +168,7 @@ char* FindApplicationPath(char* application)
nSize = GetEnvironmentVariableA("PATH", NULL, 0);
if (!nSize)
return application;
return _strdup(application);
lpSystemPath = (LPSTR) malloc(nSize);
if (!lpSystemPath)
@ -288,16 +288,34 @@ BOOL _CreateProcessExA(HANDLE hToken, DWORD dwLogonFlags,
sigfillset(&set);
pthread_sigmask(SIG_UNBLOCK, &set, NULL);
if (lpStartupInfo)
{
int handle_fd;
handle_fd = winpr_Handle_getFd(lpStartupInfo->hStdOutput);
if (handle_fd != -1)
dup2(handle_fd, STDOUT_FILENO);
handle_fd = winpr_Handle_getFd(lpStartupInfo->hStdError);
if (handle_fd != -1)
dup2(handle_fd, STDERR_FILENO);
handle_fd = winpr_Handle_getFd(lpStartupInfo->hStdInput);
if (handle_fd != -1)
dup2(handle_fd, STDIN_FILENO);
}
#ifdef __sun
closefrom(3);
closefrom(3);
#else
#ifdef F_MAXFD // on some BSD derivates
maxfd = fcntl(0, F_MAXFD);
maxfd = fcntl(0, F_MAXFD);
#else
maxfd = sysconf(_SC_OPEN_MAX);
maxfd = sysconf(_SC_OPEN_MAX);
#endif
for(fd=3; fd<maxfd; fd++)
close(fd);
for(fd=3; fd<maxfd; fd++)
close(fd);
#endif // __sun
if (token)

View File

@ -5,6 +5,9 @@
#include <winpr/synch.h>
#include <winpr/thread.h>
#include <winpr/environment.h>
#include <winpr/pipe.h>
#define TESTENV "TEST_PROCESS=oyeah"
int TestThreadCreateProcess(int argc, char* argv[])
{
@ -21,6 +24,11 @@ int TestThreadCreateProcess(int argc, char* argv[])
STARTUPINFO StartupInfo;
PROCESS_INFORMATION ProcessInformation;
LPTCH lpszEnvironmentBlock;
HANDLE pipe_read = NULL;
HANDLE pipe_write = NULL;
char buf[255];
DWORD read_bytes;
int ret = 0;
lpszEnvironmentBlock = GetEnvironmentStrings();
@ -61,7 +69,6 @@ int TestThreadCreateProcess(int argc, char* argv[])
return 1;
}
FreeEnvironmentStrings(lpszEnvironmentBlock);
WaitForSingleObject(ProcessInformation.hProcess, INFINITE);
@ -73,7 +80,75 @@ int TestThreadCreateProcess(int argc, char* argv[])
CloseHandle(ProcessInformation.hProcess);
CloseHandle(ProcessInformation.hThread);
FreeEnvironmentStrings(lpszEnvironmentBlock);
return 0;
/* Test stdin,stdout,stderr redirection */
ZeroMemory(&StartupInfo, sizeof(STARTUPINFO));
StartupInfo.cb = sizeof(STARTUPINFO);
ZeroMemory(&ProcessInformation, sizeof(PROCESS_INFORMATION));
if (!CreatePipe(&pipe_read, &pipe_write, NULL, 0))
{
printf("Pipe creation failed. error=%d\n", GetLastError());
return 1;
}
StartupInfo.hStdOutput = pipe_write;
StartupInfo.hStdError = pipe_write;
lpEnvironment = calloc(1, sizeof(TESTENV) + 1);
strncpy(lpEnvironment, TESTENV, strlen(TESTENV));
lpCommandLine = _T("printenv");
status = CreateProcess(lpApplicationName,
lpCommandLine,
lpProcessAttributes,
lpThreadAttributes,
bInheritHandles,
dwCreationFlags,
lpEnvironment,
lpCurrentDirectory,
&StartupInfo,
&ProcessInformation);
free(lpEnvironment);
if (!status)
{
CloseHandle(pipe_read);
CloseHandle(pipe_write);
printf("CreateProcess failed. error=%d\n", GetLastError());
return 1;
}
if (WaitForSingleObject(pipe_read, 200) != WAIT_OBJECT_0)
{
printf("pipe wait failed.\n");
ret = 1;
}
else
{
ReadFile(pipe_read, buf, 255, &read_bytes, NULL);
if (read_bytes < strlen(TESTENV))
{
printf("pipe read problem?!\n");
ret = 1;
}
}
WaitForSingleObject(ProcessInformation.hProcess, INFINITE);
CloseHandle(pipe_read);
CloseHandle(pipe_write);
exitCode = 0;
status = GetExitCodeProcess(ProcessInformation.hProcess, &exitCode);
printf("GetExitCodeProcess status: %d\n", status);
printf("Process exited with code: 0x%08X\n", exitCode);
CloseHandle(ProcessInformation.hProcess);
CloseHandle(ProcessInformation.hThread);
return ret;
}