From bc9f98328586a4d8bf2a87e180d7ddc5ab27234c Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Thu, 3 Mar 2016 11:35:32 -0800 Subject: [PATCH] sys: IRP_MJ_SET_INFORMATION: FileEndOfFileInformation: ignore calls with the AdvanceOnly parameter --- inc/winfsp/fsctl.h | 1 - inc/winfsp/winfsp.h | 2 +- src/dll/fsop.c | 2 -- src/sys/fileinfo.c | 19 +++++++++---------- tst/winfsp-tests/memfs.cpp | 2 +- 5 files changed, 11 insertions(+), 15 deletions(-) diff --git a/inc/winfsp/fsctl.h b/inc/winfsp/fsctl.h index 33e1b5d6..6b14e9af 100644 --- a/inc/winfsp/fsctl.h +++ b/inc/winfsp/fsctl.h @@ -226,7 +226,6 @@ typedef struct struct { UINT64 FileSize; - UINT32 AdvanceOnly:1; } EndOfFile; struct { diff --git a/inc/winfsp/winfsp.h b/inc/winfsp/winfsp.h index dbad3ed1..d249fa7f 100644 --- a/inc/winfsp/winfsp.h +++ b/inc/winfsp/winfsp.h @@ -79,7 +79,7 @@ typedef struct _FSP_FILE_SYSTEM_INTERFACE FSP_FSCTL_FILE_INFO *FileInfo); NTSTATUS (*SetFileSize)(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, - PVOID FileNode, UINT64 FileSize, BOOLEAN AdvanceOnly, + PVOID FileNode, UINT64 FileSize, FSP_FSCTL_FILE_INFO *FileInfo); NTSTATUS (*CanDelete)(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, diff --git a/src/dll/fsop.c b/src/dll/fsop.c index 48d9eccd..c42651c0 100644 --- a/src/dll/fsop.c +++ b/src/dll/fsop.c @@ -459,7 +459,6 @@ FSP_API NTSTATUS FspFileSystemOpSetInformation(FSP_FILE_SYSTEM *FileSystem, Result = FileSystem->Interface->SetFileSize(FileSystem, Request, (PVOID)Request->Req.SetInformation.UserContext, Request->Req.SetInformation.Info.Allocation.AllocationSize, - FALSE, &FileInfo); } } @@ -469,7 +468,6 @@ FSP_API NTSTATUS FspFileSystemOpSetInformation(FSP_FILE_SYSTEM *FileSystem, Result = FileSystem->Interface->SetFileSize(FileSystem, Request, (PVOID)Request->Req.SetInformation.UserContext, Request->Req.SetInformation.Info.EndOfFile.FileSize, - Request->Req.SetInformation.Info.EndOfFile.AdvanceOnly, &FileInfo); break; case 13/*FileDispositionInformation*/: diff --git a/src/sys/fileinfo.c b/src/sys/fileinfo.c index 741d66d4..72f766ba 100644 --- a/src/sys/fileinfo.c +++ b/src/sys/fileinfo.c @@ -38,7 +38,7 @@ static NTSTATUS FspFsvolSetBasicInformation(PFILE_OBJECT FileObject, PVOID Buffer, ULONG Length, FSP_FSCTL_TRANSACT_REQ *Request, const FSP_FSCTL_TRANSACT_RSP *Response); static NTSTATUS FspFsvolSetEndOfFileInformation(PFILE_OBJECT FileObject, - PVOID Buffer, ULONG Length, BOOLEAN AdvanceOnly, + PVOID Buffer, ULONG Length, FSP_FSCTL_TRANSACT_REQ *Request, const FSP_FSCTL_TRANSACT_RSP *Response); static NTSTATUS FspFsvolSetPositionInformation(PFILE_OBJECT FileObject, PVOID Buffer, ULONG Length); @@ -640,7 +640,7 @@ static NTSTATUS FspFsvolSetBasicInformation(PFILE_OBJECT FileObject, } static NTSTATUS FspFsvolSetEndOfFileInformation(PFILE_OBJECT FileObject, - PVOID Buffer, ULONG Length, BOOLEAN AdvanceOnly, + PVOID Buffer, ULONG Length, FSP_FSCTL_TRANSACT_REQ *Request, const FSP_FSCTL_TRANSACT_RSP *Response) { PAGED_CODE(); @@ -656,9 +656,7 @@ static NTSTATUS FspFsvolSetEndOfFileInformation(PFILE_OBJECT FileObject, BOOLEAN Success; Request->Req.SetInformation.Info.EndOfFile.FileSize = Info->EndOfFile.QuadPart; - Request->Req.SetInformation.Info.EndOfFile.AdvanceOnly = AdvanceOnly; - // !!!: REVISIT after better understanding relationship between AllocationSize and FileSize Success = MmCanFileBeTruncated(FileObject->SectionObjectPointer, &Info->EndOfFile); if (!Success) return STATUS_USER_MAPPED_FILE; @@ -964,8 +962,11 @@ static NTSTATUS FspFsvolSetInformation( Result = FspFsvolSetBasicInformation(FileObject, Buffer, Length, 0, 0); break; case FileEndOfFileInformation: - Result = FspFsvolSetEndOfFileInformation(FileObject, Buffer, Length, - IrpSp->Parameters.SetFile.AdvanceOnly, 0, 0); + if (IrpSp->Parameters.SetFile.AdvanceOnly) + /* we do not support ValidDataLength currently! */ + Result = STATUS_INVALID_PARAMETER; + else + Result = FspFsvolSetEndOfFileInformation(FileObject, Buffer, Length, 0, 0); break; case FileLinkInformation: Result = STATUS_INVALID_PARAMETER; /* no hard link support */ @@ -1012,8 +1013,7 @@ static NTSTATUS FspFsvolSetInformation( Result = FspFsvolSetBasicInformation(FileObject, Buffer, Length, Request, 0); break; case FileEndOfFileInformation: - Result = FspFsvolSetEndOfFileInformation(FileObject, Buffer, Length, - IrpSp->Parameters.SetFile.AdvanceOnly, Request, 0); + Result = FspFsvolSetEndOfFileInformation(FileObject, Buffer, Length, Request, 0); break; default: ASSERT(0); @@ -1062,8 +1062,7 @@ NTSTATUS FspFsvolSetInformationComplete( Result = FspFsvolSetBasicInformation(FileObject, Buffer, Length, Request, Response); break; case FileEndOfFileInformation: - Result = FspFsvolSetEndOfFileInformation(FileObject, Buffer, Length, - IrpSp->Parameters.SetFile.AdvanceOnly, Request, Response); + Result = FspFsvolSetEndOfFileInformation(FileObject, Buffer, Length, Request, Response); break; default: ASSERT(0); diff --git a/tst/winfsp-tests/memfs.cpp b/tst/winfsp-tests/memfs.cpp index 48b7156e..c579d614 100644 --- a/tst/winfsp-tests/memfs.cpp +++ b/tst/winfsp-tests/memfs.cpp @@ -470,7 +470,7 @@ NTSTATUS SetAllocationSize(FSP_FILE_SYSTEM *FileSystem, NTSTATUS SetFileSize(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, - PVOID FileNode0, UINT64 FileSize, BOOLEAN AdvanceOnly, + PVOID FileNode0, UINT64 FileSize, FSP_FSCTL_FILE_INFO *FileInfo) { MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0;