From a830de9d0407f1d116dc214b098a7bb0278c3d1b Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Tue, 19 Mar 2019 13:22:35 -0700 Subject: [PATCH] sys: create: overwrite EA support --- src/sys/create.c | 10 +++++++++- tst/memfs-dotnet/Program.cs | 3 +++ tst/memfs/memfs.cpp | 15 ++++++++++++--- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/sys/create.c b/src/sys/create.c index 99bf2f3e..1ce68201 100644 --- a/src/sys/create.c +++ b/src/sys/create.c @@ -1171,8 +1171,16 @@ NTSTATUS FspFsvolCreateComplete( if (0 == FileNode->MainFileNode) FspFileNodeOverwriteStreams(FileNode); FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.Overwrite.FileInfo, TRUE); + if (0 == FileNode->MainFileNode && FsvolDeviceExtension->VolumeParams.ExtendedAttributes) + { + /* invalidate any existing EA and increment the EA change count */ + FspFileNodeSetEa(FileNode, 0, 0); + FileNode->EaChangeCount++; + } FspFileNodeNotifyChange(FileNode, - FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE, + FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE | + (0 == FileNode->MainFileNode && FsvolDeviceExtension->VolumeParams.ExtendedAttributes ? + FILE_NOTIFY_CHANGE_EA : 0), FILE_ACTION_MODIFIED, FALSE); diff --git a/tst/memfs-dotnet/Program.cs b/tst/memfs-dotnet/Program.cs index ad224c56..aab75778 100644 --- a/tst/memfs-dotnet/Program.cs +++ b/tst/memfs-dotnet/Program.cs @@ -460,6 +460,9 @@ namespace memfs FileNodeMap.Remove(StreamNode); } + SortedDictionary EaMap = FileNode.GetEaMap(false); + if (null != EaMap) + EaMap.Clear(); if (IntPtr.Zero != Ea) { Result = SetEa(FileNode, null, Ea, EaLength); diff --git a/tst/memfs/memfs.cpp b/tst/memfs/memfs.cpp index d4bec79e..a0a9df47 100644 --- a/tst/memfs/memfs.cpp +++ b/tst/memfs/memfs.cpp @@ -346,10 +346,10 @@ NTSTATUS MemfsFileNodeCreate(PWSTR FileName, MEMFS_FILE_NODE **PFileNode) return STATUS_SUCCESS; } -static inline -VOID MemfsFileNodeDelete(MEMFS_FILE_NODE *FileNode) -{ #if defined(MEMFS_EA) +static inline +VOID MemfsFileNodeDeleteAllEa(MEMFS_FILE_NODE *FileNode) +{ if (0 != FileNode->EaMap) { for (MEMFS_FILE_NODE_EA_MAP::iterator p = FileNode->EaMap->begin(), q = FileNode->EaMap->end(); @@ -357,6 +357,14 @@ VOID MemfsFileNodeDelete(MEMFS_FILE_NODE *FileNode) free(p->second); delete FileNode->EaMap; } +} +#endif + +static inline +VOID MemfsFileNodeDelete(MEMFS_FILE_NODE *FileNode) +{ +#if defined(MEMFS_EA) + MemfsFileNodeDeleteAllEa(FileNode); #endif #if defined(MEMFS_REPARSE_POINTS) free(FileNode->ReparseData); @@ -1244,6 +1252,7 @@ static NTSTATUS Overwrite(FSP_FILE_SYSTEM *FileSystem, #endif #if defined(MEMFS_EA) + MemfsFileNodeDeleteAllEa(FileNode); if (0 != Ea) { Result = FspFileSystemEnumerateEa(FileSystem, MemfsFileNodeSetEa, FileNode, Ea, EaLength);