Alexandre Julliard : ntdll: Avoid using wine_get_server_dir() from libwine.

Alexandre Julliard julliard at winehq.org
Mon Apr 27 15:19:29 CDT 2020


Module: wine
Branch: master
Commit: 73211637c15b1dbd298364b5dd22161ce55f8145
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=73211637c15b1dbd298364b5dd22161ce55f8145

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Apr 27 12:34:30 2020 +0200

ntdll: Avoid using wine_get_server_dir() from libwine.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/server.c | 59 +++++++++++++++++++++++++++++++++++++++++------------
 1 file changed, 46 insertions(+), 13 deletions(-)

diff --git a/dlls/ntdll/server.c b/dlls/ntdll/server.c
index 4beee9e6e1..d15ece3f4e 100644
--- a/dlls/ntdll/server.c
+++ b/dlls/ntdll/server.c
@@ -114,6 +114,7 @@ static const enum cpu_type client_cpu = CPU_ARM64;
 #endif
 
 const char *config_dir = NULL;
+static const char *server_dir;
 
 unsigned int server_cpus = 0;
 BOOL is_wow64 = FALSE;
@@ -1215,6 +1216,38 @@ static void start_server(void)
 }
 
 
+/***********************************************************************
+ *           init_server_dir
+ */
+static const char *init_server_dir( dev_t dev, ino_t ino )
+{
+    char *p, *dir;
+    size_t len = sizeof("/server-") + 2 * sizeof(dev) + 2 * sizeof(ino) + 2;
+
+#ifdef __ANDROID__  /* there's no /tmp dir on Android */
+    len += strlen( config_dir ) + sizeof("/.wineserver");
+    dir = malloc( len );
+    strcpy( dir, config_dir );
+    strcat( dir, "/.wineserver/server-" );
+#else
+    len += sizeof("/tmp/.wine-") + 12;
+    dir = malloc( len );
+    sprintf( dir, "/tmp/.wine-%u/server-", getuid() );
+#endif
+    p = dir + strlen( dir );
+    if (dev != (unsigned long)dev)
+        p += sprintf( p, "%lx%08lx-", (unsigned long)((unsigned long long)dev >> 32), (unsigned long)dev );
+    else
+        p += sprintf( p, "%lx-", (unsigned long)dev );
+
+    if (ino != (unsigned long)ino)
+        sprintf( p, "%lx%08lx", (unsigned long)((unsigned long long)ino >> 32), (unsigned long)ino );
+    else
+        sprintf( p, "%lx", (unsigned long)ino );
+    return dir;
+}
+
+
 /***********************************************************************
  *           init_config_dir
  */
@@ -1277,6 +1310,8 @@ static int setup_config_dir(void)
     if (stat( ".", &st ) == -1) fatal_perror( "stat %s", config_dir );
     if (st.st_uid != getuid()) fatal_error( "'%s' is not owned by you\n", config_dir );
 
+    server_dir = init_server_dir( st.st_dev, st.st_ino );
+
     if (!mkdir( "dosdevices", 0777 ))
     {
         mkdir( "drive_c", 0777 );
@@ -1332,26 +1367,24 @@ static void server_connect_error( const char *serverdir )
  */
 static int server_connect(void)
 {
-    const char *serverdir;
     struct sockaddr_un addr;
     struct stat st;
     int s, slen, retry, fd_cwd;
 
     fd_cwd = setup_config_dir();
-    serverdir = wine_get_server_dir();
 
     /* chdir to the server directory */
-    if (chdir( serverdir ) == -1)
+    if (chdir( server_dir ) == -1)
     {
-        if (errno != ENOENT) fatal_perror( "chdir to %s", serverdir );
+        if (errno != ENOENT) fatal_perror( "chdir to %s", server_dir );
         start_server();
-        if (chdir( serverdir ) == -1) fatal_perror( "chdir to %s", serverdir );
+        if (chdir( server_dir ) == -1) fatal_perror( "chdir to %s", server_dir );
     }
 
     /* make sure we are at the right place */
-    if (stat( ".", &st ) == -1) fatal_perror( "stat %s", serverdir );
-    if (st.st_uid != getuid()) fatal_error( "'%s' is not owned by you\n", serverdir );
-    if (st.st_mode & 077) fatal_error( "'%s' must not be accessible by other users\n", serverdir );
+    if (stat( ".", &st ) == -1) fatal_perror( "stat %s", server_dir );
+    if (st.st_uid != getuid()) fatal_error( "'%s' is not owned by you\n", server_dir );
+    if (st.st_mode & 077) fatal_error( "'%s' must not be accessible by other users\n", server_dir );
 
     for (retry = 0; retry < 6; retry++)
     {
@@ -1364,16 +1397,16 @@ static int server_connect(void)
         }
         else if (lstat( SOCKETNAME, &st ) == -1) /* check for an already existing socket */
         {
-            if (errno != ENOENT) fatal_perror( "lstat %s/%s", serverdir, SOCKETNAME );
+            if (errno != ENOENT) fatal_perror( "lstat %s/%s", server_dir, SOCKETNAME );
             start_server();
             if (lstat( SOCKETNAME, &st ) == -1) continue;  /* still no socket, wait a bit more */
         }
 
         /* make sure the socket is sane (ISFIFO needed for Solaris) */
         if (!S_ISSOCK(st.st_mode) && !S_ISFIFO(st.st_mode))
-            fatal_error( "'%s/%s' is not a socket\n", serverdir, SOCKETNAME );
+            fatal_error( "'%s/%s' is not a socket\n", server_dir, SOCKETNAME );
         if (st.st_uid != getuid())
-            fatal_error( "'%s/%s' is not owned by you\n", serverdir, SOCKETNAME );
+            fatal_error( "'%s/%s' is not owned by you\n", server_dir, SOCKETNAME );
 
         /* try to connect to it */
         addr.sun_family = AF_UNIX;
@@ -1403,7 +1436,7 @@ static int server_connect(void)
         }
         close( s );
     }
-    server_connect_error( serverdir );
+    server_connect_error( server_dir );
 }
 
 
@@ -1426,7 +1459,7 @@ static void send_server_task_port(void)
 
     if (task_get_bootstrap_port(mach_task_self(), &bootstrap_port) != KERN_SUCCESS) return;
 
-    kret = bootstrap_look_up(bootstrap_port, (char*)wine_get_server_dir(), &wineserver_port);
+    kret = bootstrap_look_up(bootstrap_port, server_dir, &wineserver_port);
     if (kret != KERN_SUCCESS)
         fatal_error( "cannot find the server port: 0x%08x\n", kret );
 




More information about the wine-cvs mailing list