diff --git a/src/sys/create.c b/src/sys/create.c index 08f2e077..a81c0553 100644 --- a/src/sys/create.c +++ b/src/sys/create.c @@ -216,6 +216,12 @@ static NTSTATUS FspFsvolCreateNoLock( FlagOn(CreateOptions, FILE_DIRECTORY_FILE)) return STATUS_INVALID_PARAMETER; + /* do not allow the temporary bit on a directory */ + if (FlagOn(CreateOptions, FILE_DIRECTORY_FILE) && + FlagOn(FileAttributes, FILE_ATTRIBUTE_TEMPORARY) && + (FILE_CREATE == CreateDisposition || FILE_OPEN_IF == CreateDisposition)) + return STATUS_INVALID_PARAMETER; + /* check security descriptor validity */ if (0 != SecurityDescriptor) { @@ -901,6 +907,13 @@ NTSTATUS FspFsvolCreateComplete( FileObject->PrivateCacheMap = 0; FileObject->FsContext = FileNode; FileObject->FsContext2 = FileDesc; + if (!FileNode->IsDirectory) + { + /* properly set temporary bit for lazy writer */ + if (FlagOn(Response->Rsp.Create.Opened.FileInfo.FileAttributes, + FILE_ATTRIBUTE_TEMPORARY)) + SetFlag(FileObject->Flags, FO_TEMPORARY_FILE); + } if (FspTimeoutInfinity32 == FsvolDeviceExtension->VolumeParams.FileInfoTimeout && !FlagOn(IrpSp->Parameters.Create.Options, FILE_NO_INTERMEDIATE_BUFFERING) && !Response->Rsp.Create.Opened.DisableCache) diff --git a/src/sys/fileinfo.c b/src/sys/fileinfo.c index 1c85c500..f0a37681 100644 --- a/src/sys/fileinfo.c +++ b/src/sys/fileinfo.c @@ -915,6 +915,15 @@ static NTSTATUS FspFsvolSetBasicInformation(PFILE_OBJECT FileObject, { if (sizeof(FILE_BASIC_INFORMATION) > Length) return STATUS_INVALID_PARAMETER; + + PFILE_BASIC_INFORMATION Info = (PFILE_BASIC_INFORMATION)Buffer; + FSP_FILE_NODE *FileNode = FileObject->FsContext; + UINT32 FileAttributes = Info->FileAttributes; + + /* do not allow the temporary bit on a directory */ + if (FileNode->IsDirectory && + FlagOn(FileAttributes, FILE_ATTRIBUTE_TEMPORARY)) + return STATUS_INVALID_PARAMETER; } else if (0 == Response) { @@ -941,6 +950,16 @@ static NTSTATUS FspFsvolSetBasicInformation(PFILE_OBJECT FileObject, FSP_FILE_NODE *FileNode = FileObject->FsContext; ULONG NotifyFilter = 0; + if (!FileNode->IsDirectory) + { + /* properly set temporary bit for lazy writer */ + if (FlagOn(Response->Rsp.SetInformation.FileInfo.FileAttributes, + FILE_ATTRIBUTE_TEMPORARY)) + SetFlag(FileObject->Flags, FO_TEMPORARY_FILE); + else + ClearFlag(FileObject->Flags, FO_TEMPORARY_FILE); + } + FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.SetInformation.FileInfo); if ((UINT32)-1 != Request->Req.SetInformation.Info.Basic.FileAttributes) diff --git a/tst/winfsp-tests/create-test.c b/tst/winfsp-tests/create-test.c index f2e76390..ea099931 100644 --- a/tst/winfsp-tests/create-test.c +++ b/tst/winfsp-tests/create-test.c @@ -200,6 +200,16 @@ void create_dotest(ULONG Flags, PWSTR Prefix) CloseHandle(Handle); } + StringCbPrintfW(FilePath, sizeof FilePath, L"%s%s\\file0", + Prefix ? L"" : L"\\\\?\\GLOBALROOT", Prefix ? Prefix : memfs_volumename(memfs)); + + Handle = CreateFileW(FilePath, + GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, 0, + CREATE_NEW, FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE, 0); + ASSERT(INVALID_HANDLE_VALUE != Handle); + CloseHandle(Handle); + memfs_stop(memfs); }