From 15101bae7b9a10d73b8edc05e0ea58590378db29 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Sun, 2 Jan 2022 13:45:40 +0100 Subject: [PATCH] ntdll: Fix current directory initialization on removable devices. Fix a regression caused by 3e73437ae8f04a12200bf537758d22e5f9723637. Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52311 Signed-off-by: Alexandre Julliard --- dlls/ntdll/unix/server.c | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/dlls/ntdll/unix/server.c b/dlls/ntdll/unix/server.c index b8c7ce715e6..6a3224d8385 100644 --- a/dlls/ntdll/unix/server.c +++ b/dlls/ntdll/unix/server.c @@ -104,6 +104,7 @@ timeout_t server_start_time = 0; /* time of server startup */ sigset_t server_block_set; /* signals to block during server calls */ static int fd_socket = -1; /* socket to exchange file descriptors with the server */ +static int initial_cwd = -1; static pid_t server_pid; static pthread_mutex_t fd_cache_mutex = PTHREAD_MUTEX_INITIALIZER; @@ -1173,16 +1174,6 @@ static int setup_config_dir(void) } else if (errno != EEXIST) fatal_perror( "cannot create %s/dosdevices", config_dir ); - if (fd_cwd != -1) - { - FILE_FS_DEVICE_INFORMATION info; - if (!get_device_info( fd_cwd, &info ) && (info.Characteristics & FILE_REMOVABLE_MEDIA)) - { - close( fd_cwd ); - fd_cwd = -1; - } - } - if (fd_cwd == -1) fd_cwd = open( "dosdevices/c:", O_RDONLY ); fcntl( fd_cwd, F_SETFD, FD_CLOEXEC ); return fd_cwd; @@ -1231,9 +1222,9 @@ static int server_connect(void) { struct sockaddr_un addr; struct stat st; - int s, slen, retry, fd_cwd; + int s, slen, retry; - fd_cwd = setup_config_dir(); + initial_cwd = setup_config_dir(); /* chdir to the server directory */ if (chdir( server_dir ) == -1) @@ -1287,12 +1278,7 @@ static int server_connect(void) #endif if (connect( s, (struct sockaddr *)&addr, slen ) != -1) { - /* switch back to the starting directory */ - if (fd_cwd != -1) - { - fchdir( fd_cwd ); - close( fd_cwd ); - } + fchdir( initial_cwd ); /* switch back to the starting directory */ fcntl( s, F_SETFD, FD_CLOEXEC ); return s; } @@ -1555,6 +1541,11 @@ void server_init_process_done(void) void *entry, *teb; NTSTATUS status; int suspend; + FILE_FS_DEVICE_INFORMATION info; + + if (!get_device_info( initial_cwd, &info ) && (info.Characteristics & FILE_REMOVABLE_MEDIA)) + chdir( "/" ); + close( initial_cwd ); #ifdef __APPLE__ send_server_task_port();