Module: wine Branch: master Commit: 73d0bb77409b1a27fd25169516759cf0bd9d3d9a URL: https://source.winehq.org/git/wine.git/?a=commit;h=73d0bb77409b1a27fd2516951...
Author: Qian Hong qhong@codeweavers.com Date: Fri Jun 25 00:28:49 2021 -0500
server: Forbid deleting files with an open mapping.
Signed-off-by: Zebediah Figura z.figura12@gmail.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntdll/tests/file.c | 8 ++++---- server/fd.c | 11 +++++++++++ 2 files changed, 15 insertions(+), 4 deletions(-)
diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c index 5d234114fd5..19ae5f2ac21 100644 --- a/dlls/ntdll/tests/file.c +++ b/dlls/ntdll/tests/file.c @@ -3329,14 +3329,14 @@ todo_wine
fdi.DoDeleteFile = TRUE; res = pNtSetInformationFile( handle, &io, &fdi, sizeof(fdi), FileDispositionInformation ); - todo_wine ok( res == STATUS_CANNOT_DELETE, "got %#x\n", res ); + ok( res == STATUS_CANNOT_DELETE, "got %#x\n", res ); res = GetFileAttributesA( buffer ); ok( res != INVALID_FILE_ATTRIBUTES, "expected file to exist\n" );
CloseHandle( mapping ); CloseHandle( handle ); res = DeleteFileA( buffer ); - todo_wine ok( res, "got error %u\n", GetLastError() ); + ok( res, "got error %u\n", GetLastError() );
GetTempFileNameA( tmp_path, "dis", 0, buffer ); handle = CreateFileA( buffer, GENERIC_READ | GENERIC_WRITE | DELETE, 0, NULL, CREATE_ALWAYS, 0, 0 ); @@ -3373,14 +3373,14 @@ todo_wine
fdi.DoDeleteFile = TRUE; res = pNtSetInformationFile( handle, &io, &fdi, sizeof(fdi), FileDispositionInformation ); - todo_wine ok( res == STATUS_CANNOT_DELETE, "got %#x\n", res ); + ok( res == STATUS_CANNOT_DELETE, "got %#x\n", res ); res = GetFileAttributesA( buffer ); ok( res != INVALID_FILE_ATTRIBUTES, "expected file to exist\n" );
UnmapViewOfFile( view ); CloseHandle( handle ); res = DeleteFileA( buffer ); - todo_wine ok( res, "got error %u\n", GetLastError() ); + ok( res, "got error %u\n", GetLastError() );
GetTempFileNameA( tmp_path, "dis", 0, buffer ); handle = CreateFileA( buffer, GENERIC_READ | GENERIC_WRITE | DELETE, 0, NULL, CREATE_ALWAYS, 0, 0 ); diff --git a/server/fd.c b/server/fd.c index bfa2805d82b..e326354d127 100644 --- a/server/fd.c +++ b/server/fd.c @@ -2452,6 +2452,17 @@ static void set_fd_disposition( struct fd *fd, int unlink )
if (unlink) { + struct fd *fd_ptr; + + LIST_FOR_EACH_ENTRY( fd_ptr, &fd->inode->open, struct fd, inode_entry ) + { + if (fd_ptr->access & FILE_MAPPING_ACCESS) + { + set_error( STATUS_CANNOT_DELETE ); + return; + } + } + if (fstat( fd->unix_fd, &st ) == -1) { file_set_error();