Module: wine Branch: master Commit: 7457f37e4a69ce7c778c41559e0d39246b12d812 URL: http://source.winehq.org/git/wine.git/?a=commit;h=7457f37e4a69ce7c778c41559e...
Author: Maarten Lankhorst maarten.lankhorst@canonical.com Date: Tue Oct 16 14:11:45 2012 +0200
ntdll: Set SO_PASSCRED before connecting to eliminate a race condition in obtaining server_pid.
---
dlls/kernel32/process.c | 7 +++++++ dlls/ntdll/server.c | 18 +++++++++++------- 2 files changed, 18 insertions(+), 7 deletions(-)
diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c index 1b10f9e..3a88aaa 100644 --- a/dlls/kernel32/process.c +++ b/dlls/kernel32/process.c @@ -1919,6 +1919,13 @@ static BOOL create_process( HANDLE hFile, LPCWSTR filename, LPWSTR cmd_line, LPW SetLastError( ERROR_TOO_MANY_OPEN_FILES ); return FALSE; } +#ifdef SO_PASSCRED + else + { + int enable = 1; + setsockopt( socketfd[0], SOL_SOCKET, SO_PASSCRED, &enable, sizeof(enable) ); + } +#endif
if (exec_only) /* things are much simpler in this case */ { diff --git a/dlls/ntdll/server.c b/dlls/ntdll/server.c index 218c6eb..2fe7877 100644 --- a/dlls/ntdll/server.c +++ b/dlls/ntdll/server.c @@ -881,6 +881,13 @@ static int server_connect(void) addr.sun_len = slen; #endif if ((s = socket( AF_UNIX, SOCK_STREAM, 0 )) == -1) fatal_perror( "socket" ); +#ifdef SO_PASSCRED + else + { + int enable = 1; + setsockopt( s, SOL_SOCKET, SO_PASSCRED, &enable, sizeof(enable) ); + } +#endif if (connect( s, (struct sockaddr *)&addr, slen ) != -1) { /* switch back to the starting directory */ @@ -1004,18 +1011,15 @@ void server_init_process(void) pthread_sigmask( SIG_BLOCK, &server_block_set, NULL );
/* receive the first thread request fd on the main socket */ + ntdll_get_thread_data()->request_fd = receive_fd( &version ); + #ifdef SO_PASSCRED - if (server_pid == -1) + /* now that we hopefully received the server_pid, disable SO_PASSCRED */ { - int enable = 1; - setsockopt( fd_socket, SOL_SOCKET, SO_PASSCRED, &enable, sizeof(enable) ); - ntdll_get_thread_data()->request_fd = receive_fd( &version ); - enable = 0; + int enable = 0; setsockopt( fd_socket, SOL_SOCKET, SO_PASSCRED, &enable, sizeof(enable) ); } - else #endif - ntdll_get_thread_data()->request_fd = receive_fd( &version );
if (version != SERVER_PROTOCOL_VERSION) server_protocol_error( "version mismatch %d/%d.\n"