Module: wine Branch: master Commit: 76f949577aac88bbde4e9e7b904587f5bc8c808d URL: https://source.winehq.org/git/wine.git/?a=commit;h=76f949577aac88bbde4e9e7b9...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Jul 8 16:49:23 2021 +0200
ntdll: Avoid calling NtOpenFile() from the Unix side.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntdll/unix/env.c | 9 +++++---- dlls/ntdll/unix/process.c | 15 ++++++++++----- 2 files changed, 15 insertions(+), 9 deletions(-)
diff --git a/dlls/ntdll/unix/env.c b/dlls/ntdll/unix/env.c index 077c0058c83..b405624d7fb 100644 --- a/dlls/ntdll/unix/env.c +++ b/dlls/ntdll/unix/env.c @@ -162,7 +162,6 @@ static NTSTATUS open_nls_data_file( ULONG type, ULONG id, HANDLE *file ) 's','o','r','t','i','n','g','\',0};
NTSTATUS status = STATUS_OBJECT_NAME_NOT_FOUND; - IO_STATUS_BLOCK io; OBJECT_ATTRIBUTES attr; UNICODE_STRING valueW; WCHAR buffer[ARRAY_SIZE(sortdirW) + 16]; @@ -179,10 +178,12 @@ static NTSTATUS open_nls_data_file( ULONG type, ULONG id, HANDLE *file )
status = open_unix_file( file, path, GENERIC_READ, &attr, 0, FILE_SHARE_READ, FILE_OPEN, FILE_SYNCHRONOUS_IO_ALERT, NULL, 0 ); - if (status == STATUS_NO_SUCH_FILE) - /* try to open file in system dir */ - status = NtOpenFile( file, GENERIC_READ, &attr, &io, FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_ALERT ); + free( path ); + if (status != STATUS_NO_SUCH_FILE) return status;
+ if ((status = nt_to_unix_file_name( &attr, &path, FILE_OPEN ))) return status; + status = open_unix_file( file, path, GENERIC_READ, &attr, 0, FILE_SHARE_READ, + FILE_OPEN, FILE_SYNCHRONOUS_IO_ALERT, NULL, 0 ); free( path ); return status; } diff --git a/dlls/ntdll/unix/process.c b/dlls/ntdll/unix/process.c index 90bf01d76fd..b85132af131 100644 --- a/dlls/ntdll/unix/process.c +++ b/dlls/ntdll/unix/process.c @@ -353,21 +353,26 @@ static WCHAR *get_nt_pathname( const UNICODE_STRING *str ) */ static int get_unix_curdir( const RTL_USER_PROCESS_PARAMETERS *params ) { - UNICODE_STRING nt_name; + UNICODE_STRING nt_name, redir; OBJECT_ATTRIBUTES attr; - IO_STATUS_BLOCK io; NTSTATUS status; HANDLE handle; int fd = -1; + char *unix_name;
if (!(nt_name.Buffer = get_nt_pathname( ¶ms->CurrentDirectory.DosPath ))) return -1; nt_name.Length = wcslen( nt_name.Buffer ) * sizeof(WCHAR);
InitializeObjectAttributes( &attr, &nt_name, OBJ_CASE_INSENSITIVE, 0, NULL ); - status = NtOpenFile( &handle, FILE_TRAVERSE | SYNCHRONIZE, &attr, &io, - FILE_SHARE_READ | FILE_SHARE_WRITE, - FILE_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT ); + get_redirect( &attr, &redir ); + status = nt_to_unix_file_name( &attr, &unix_name, FILE_OPEN ); free( nt_name.Buffer ); + free( redir.Buffer ); + if (status) return -1; + status = open_unix_file( &handle, unix_name, FILE_TRAVERSE | SYNCHRONIZE, &attr, 0, + FILE_SHARE_READ | FILE_SHARE_DELETE, + FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0 ); + free( unix_name ); if (status) return -1; wine_server_handle_to_fd( handle, FILE_TRAVERSE, &fd, NULL ); NtClose( handle );