diff --git a/tst/memfs-dotnet/Program.cs b/tst/memfs-dotnet/Program.cs index b3c2270e..c766919c 100644 --- a/tst/memfs-dotnet/Program.cs +++ b/tst/memfs-dotnet/Program.cs @@ -463,7 +463,10 @@ namespace memfs SortedDictionary EaMap = FileNode.GetEaMap(false); if (null != EaMap) + { EaMap.Clear(); + FileNode.FileInfo.EaSize = 0; + } if (IntPtr.Zero != Ea) { Result = SetEa(FileNode, null, Ea, EaLength); @@ -1116,15 +1119,21 @@ namespace memfs { FileNode FileNode = (FileNode)FileNode0; SortedDictionary EaMap = FileNode.GetEaMap(true); + EaValueData Data; + UInt32 EaSizePlus = 0, EaSizeMinus = 0; if (null != EaValue) { - EaValueData Data; Data.EaValue = EaValue; Data.NeedEa = NeedEa; EaMap[EaName] = Data; + EaSizePlus = GetEaEntrySize(EaName, EaValue, NeedEa); } - else + else if (EaMap.TryGetValue(EaName, out Data)) + { + EaSizeMinus = GetEaEntrySize(EaName, Data.EaValue, Data.NeedEa); EaMap.Remove(EaName); + } + FileNode.FileInfo.EaSize = FileNode.FileInfo.EaSize + EaSizePlus - EaSizeMinus; return STATUS_SUCCESS; } diff --git a/tst/memfs/memfs.cpp b/tst/memfs/memfs.cpp index 8dc4ba1e..b6c8442a 100644 --- a/tst/memfs/memfs.cpp +++ b/tst/memfs/memfs.cpp @@ -357,6 +357,7 @@ VOID MemfsFileNodeDeleteEaMap(MEMFS_FILE_NODE *FileNode) free(p->second); delete FileNode->EaMap; FileNode->EaMap = 0; + FileNode->FileInfo.EaSize = 0; } } #endif @@ -441,6 +442,7 @@ NTSTATUS MemfsFileNodeSetEa( MEMFS_FILE_NODE_EA_MAP *EaMap; FILE_FULL_EA_INFORMATION *FileNodeEa = 0; MEMFS_FILE_NODE_EA_MAP::iterator p; + ULONG EaSizePlus = 0, EaSizeMinus = 0; NTSTATUS Result; Result = MemfsFileNodeGetEaMap(FileNode, &EaMap); @@ -449,18 +451,20 @@ NTSTATUS MemfsFileNodeSetEa( if (0 != Ea->EaValueLength) { - FileNodeEa = (FILE_FULL_EA_INFORMATION *)malloc( - FIELD_OFFSET(FILE_FULL_EA_INFORMATION, EaName) + Ea->EaNameLength + 1 + Ea->EaValueLength); + EaSizePlus = FIELD_OFFSET(FILE_FULL_EA_INFORMATION, EaName) + + Ea->EaNameLength + 1 + Ea->EaValueLength; + FileNodeEa = (FILE_FULL_EA_INFORMATION *)malloc(EaSizePlus); if (0 == FileNodeEa) return STATUS_INSUFFICIENT_RESOURCES; - memcpy(FileNodeEa, Ea, - FIELD_OFFSET(FILE_FULL_EA_INFORMATION, EaName) + Ea->EaNameLength + 1 + Ea->EaValueLength); + memcpy(FileNodeEa, Ea, EaSizePlus); FileNodeEa->NextEntryOffset = 0; } p = EaMap->find(Ea->EaName); if (p != EaMap->end()) { + EaSizeMinus = FIELD_OFFSET(FILE_FULL_EA_INFORMATION, EaName) + + p->second->EaNameLength + 1 + p->second->EaValueLength; free(p->second); EaMap->erase(p); } @@ -470,7 +474,6 @@ NTSTATUS MemfsFileNodeSetEa( try { EaMap->insert(MEMFS_FILE_NODE_EA_MAP::value_type(FileNodeEa->EaName, FileNodeEa)); - return STATUS_SUCCESS; } catch (...) { @@ -479,6 +482,10 @@ NTSTATUS MemfsFileNodeSetEa( } } + FileNode->FileInfo.EaSize = FileNode->FileInfo.EaSize + + FSP_FSCTL_ALIGN_UP(EaSizePlus, sizeof(ULONG)) + - FSP_FSCTL_ALIGN_UP(EaSizeMinus, sizeof(ULONG)); + return STATUS_SUCCESS; }