grand EaSize patch; passes winfsp-tests and ifstest

This commit is contained in:
Bill Zissimopoulos
2019-03-21 18:14:15 -07:00
parent b619dbfe97
commit 732e6cc38c
13 changed files with 123 additions and 41 deletions

View File

@ -371,7 +371,7 @@ namespace memfs
FileNode.FileSecurity = SecurityDescriptor;
if (IntPtr.Zero != Ea)
{
Result = SetEa(FileNode, null, Ea, EaLength);
Result = SetEaEntries(FileNode, null, Ea, EaLength);
if (0 > Result)
return Result;
}
@ -469,7 +469,7 @@ namespace memfs
}
if (IntPtr.Zero != Ea)
{
Result = SetEa(FileNode, null, Ea, EaLength);
Result = SetEaEntries(FileNode, null, Ea, EaLength);
if (0 > Result)
return Result;
}
@ -1121,6 +1121,11 @@ namespace memfs
SortedDictionary<String, EaValueData> EaMap = FileNode.GetEaMap(true);
EaValueData Data;
UInt32 EaSizePlus = 0, EaSizeMinus = 0;
if (EaMap.TryGetValue(EaName, out Data))
{
EaSizeMinus = GetEaEntrySize(EaName, Data.EaValue, Data.NeedEa);
EaMap.Remove(EaName);
}
if (null != EaValue)
{
Data.EaValue = EaValue;
@ -1128,11 +1133,6 @@ namespace memfs
EaMap[EaName] = Data;
EaSizePlus = GetEaEntrySize(EaName, EaValue, NeedEa);
}
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;
}

View File

@ -458,13 +458,15 @@ NTSTATUS MemfsFileNodeSetEa(
return STATUS_INSUFFICIENT_RESOURCES;
memcpy(FileNodeEa, Ea, EaSizePlus);
FileNodeEa->NextEntryOffset = 0;
EaSizePlus = FspFileSystemGetEaPackedSize(Ea);
}
p = EaMap->find(Ea->EaName);
if (p != EaMap->end())
{
EaSizeMinus = FIELD_OFFSET(FILE_FULL_EA_INFORMATION, EaName) +
p->second->EaNameLength + 1 + p->second->EaValueLength;
EaSizeMinus = FspFileSystemGetEaPackedSize(Ea);
free(p->second);
EaMap->erase(p);
}
@ -482,9 +484,7 @@ NTSTATUS MemfsFileNodeSetEa(
}
}
FileNode->FileInfo.EaSize = FileNode->FileInfo.EaSize
+ FSP_FSCTL_ALIGN_UP(EaSizePlus, sizeof(ULONG))
- FSP_FSCTL_ALIGN_UP(EaSizeMinus, sizeof(ULONG));
FileNode->FileInfo.EaSize = FileNode->FileInfo.EaSize + EaSizePlus - EaSizeMinus;
return STATUS_SUCCESS;
}
@ -2167,10 +2167,20 @@ static NTSTATUS GetEa(FSP_FILE_SYSTEM *FileSystem,
}
static NTSTATUS SetEa(FSP_FILE_SYSTEM *FileSystem,
PVOID FileNode,
PFILE_FULL_EA_INFORMATION Ea, ULONG EaLength)
PVOID FileNode0,
PFILE_FULL_EA_INFORMATION Ea, ULONG EaLength,
FSP_FSCTL_FILE_INFO *FileInfo)
{
return FspFileSystemEnumerateEa(FileSystem, MemfsFileNodeSetEa, FileNode, Ea, EaLength);
MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0;
NTSTATUS Result;
Result = FspFileSystemEnumerateEa(FileSystem, MemfsFileNodeSetEa, FileNode, Ea, EaLength);
if (!NT_SUCCESS(Result))
return Result;
MemfsFileNodeGetFileInfo(FileNode, FileInfo);
return STATUS_SUCCESS;
}
#endif