From 33e8b5df04a64261f21aff84e1ca2e713361ccb2 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Sun, 18 Dec 2016 16:56:11 -0800 Subject: [PATCH] sys,dll: create: correctly handle FILE_SUPERSEDE --- src/dll/fsop.c | 9 +++++---- src/sys/file.c | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/dll/fsop.c b/src/dll/fsop.c index 5ff6ad0d..c220ee84 100644 --- a/src/dll/fsop.c +++ b/src/dll/fsop.c @@ -546,7 +546,6 @@ static NTSTATUS FspFileSystemOpCreate_FileOverwrite(FSP_FILE_SYSTEM *FileSystem, UINT32 GrantedAccess; FSP_FSCTL_TRANSACT_FULL_CONTEXT FullContext; FSP_FSCTL_OPEN_FILE_INFO OpenFileInfo; - BOOLEAN Supersede = FILE_SUPERSEDE == ((Request->Req.Create.CreateOptions >> 24) & 0xff); Result = FspFileSystemOverwriteCheck(FileSystem, Request, Response, TRUE, &GrantedAccess); if (!NT_SUCCESS(Result) || STATUS_REPARSE == Result) @@ -570,7 +569,7 @@ static NTSTATUS FspFileSystemOpCreate_FileOverwrite(FSP_FILE_SYSTEM *FileSystem, Response->Rsp.Create.Opened.FileName.Size = (UINT16)OpenFileInfo.NormalizedNameSize; } - Response->IoStatus.Information = Supersede ? FILE_SUPERSEDED : FILE_OVERWRITTEN; + Response->IoStatus.Information = FILE_OVERWRITTEN; SetFileContext(Response->Rsp.Create.Opened, FullContext); Response->Rsp.Create.Opened.GrantedAccess = GrantedAccess; memcpy(&Response->Rsp.Create.Opened.FileInfo, @@ -586,6 +585,7 @@ static NTSTATUS FspFileSystemOpCreate_FileOverwriteIf(FSP_FILE_SYSTEM *FileSyste PSECURITY_DESCRIPTOR ParentDescriptor, ObjectDescriptor; FSP_FSCTL_TRANSACT_FULL_CONTEXT FullContext; FSP_FSCTL_OPEN_FILE_INFO OpenFileInfo; + BOOLEAN Supersede = FILE_SUPERSEDE == ((Request->Req.Create.CreateOptions >> 24) & 0xff); BOOLEAN Create = FALSE; Result = FspFileSystemOverwriteCheck(FileSystem, Request, Response, TRUE, &GrantedAccess); @@ -647,7 +647,8 @@ static NTSTATUS FspFileSystemOpCreate_FileOverwriteIf(FSP_FILE_SYSTEM *FileSyste Response->Rsp.Create.Opened.FileName.Size = (UINT16)OpenFileInfo.NormalizedNameSize; } - Response->IoStatus.Information = Create ? FILE_CREATED : FILE_OVERWRITTEN; + Response->IoStatus.Information = Create ? FILE_CREATED : + (Supersede ? FILE_SUPERSEDED : FILE_OVERWRITTEN); SetFileContext(Response->Rsp.Create.Opened, FullContext); Response->Rsp.Create.Opened.GrantedAccess = GrantedAccess; memcpy(&Response->Rsp.Create.Opened.FileInfo, @@ -816,10 +817,10 @@ FSP_API NTSTATUS FspFileSystemOpCreate(FSP_FILE_SYSTEM *FileSystem, Result = FspFileSystemOpCreate_FileOpenIf(FileSystem, Request, Response); break; case FILE_OVERWRITE: - case FILE_SUPERSEDE: Result = FspFileSystemOpCreate_FileOverwrite(FileSystem, Request, Response); break; case FILE_OVERWRITE_IF: + case FILE_SUPERSEDE: Result = FspFileSystemOpCreate_FileOverwriteIf(FileSystem, Request, Response); break; default: diff --git a/src/sys/file.c b/src/sys/file.c index 84ef3096..689f7dbb 100644 --- a/src/sys/file.c +++ b/src/sys/file.c @@ -1923,11 +1923,11 @@ NTSTATUS FspMainFileOpen( case FILE_CREATE: case FILE_OPEN_IF: case FILE_OVERWRITE_IF: + case FILE_SUPERSEDE: Disposition = FILE_OPEN_IF; break; case FILE_OPEN: case FILE_OVERWRITE: - case FILE_SUPERSEDE: Disposition = FILE_OPEN; break; default: