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