Maarten Lankhorst : ntdll: Set SO_PASSCRED before connecting to eliminate a race condition in obtaining server_pid .
Alexandre Julliard
julliard at winehq.org
Thu Oct 18 14:33:13 CDT 2012
Module: wine
Branch: master
Commit: 7457f37e4a69ce7c778c41559e0d39246b12d812
URL: http://source.winehq.org/git/wine.git/?a=commit;h=7457f37e4a69ce7c778c41559e0d39246b12d812
Author: Maarten Lankhorst <maarten.lankhorst at 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"
More information about the wine-cvs
mailing list