Merge pull request #178 from JohnOberschelp/master

Fixed to pass winfsp-tests and cleanup
This commit is contained in:
Bill Zissimopoulos 2018-07-24 21:52:32 -07:00 committed by GitHub
commit 500dfe1958
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -233,9 +233,7 @@ inline void DereferenceNode(AIRFS_ Airfs, NODE_ Node)
void GetFileInfo(NODE_ Node, FSP_FSCTL_FILE_INFO *FileInfo) void GetFileInfo(NODE_ Node, FSP_FSCTL_FILE_INFO *FileInfo)
{ {
#if defined(AIRFS_NAMED_STREAMS) #if defined(AIRFS_NAMED_STREAMS)
if (!Node->IsAStream) if (Node->IsAStream)
*FileInfo = Node->FileInfo;
else
{ {
*FileInfo = Node->Parent->FileInfo; *FileInfo = Node->Parent->FileInfo;
FileInfo->FileAttributes &= ~FILE_ATTRIBUTE_DIRECTORY; FileInfo->FileAttributes &= ~FILE_ATTRIBUTE_DIRECTORY;
@ -243,9 +241,9 @@ void GetFileInfo(NODE_ Node, FSP_FSCTL_FILE_INFO *FileInfo)
FileInfo->AllocationSize = Node->FileInfo.AllocationSize; FileInfo->AllocationSize = Node->FileInfo.AllocationSize;
FileInfo->FileSize = Node->FileInfo.FileSize; FileInfo->FileSize = Node->FileInfo.FileSize;
} }
#else else
*FileInfo = Node->FileInfo;
#endif #endif
*FileInfo = Node->FileInfo;
} }
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
@ -295,8 +293,7 @@ void DeleteAllNodes(AIRFS_ Airfs)
{ {
for (auto Iter = Node->Streams->begin(); Iter != Node->Streams->end(); ) for (auto Iter = Node->Streams->begin(); Iter != Node->Streams->end(); )
{ {
NODE_ Stream = *Iter; NODE_ Stream = *Iter++;
Iter++;
DeleteNode(Airfs, Stream); DeleteNode(Airfs, Stream);
} }
delete Node->Streams; delete Node->Streams;
@ -412,17 +409,10 @@ NTSTATUS FindNode(AIRFS_ Airfs, PWSTR Name, PWSTR *BaseName,
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
#if defined(AIRFS_NAMED_STREAMS) #if defined(AIRFS_NAMED_STREAMS)
BOOLEAN AddStreamInfo(NODE_ Node, PVOID Buffer, ULONG Length, PULONG PBytesTransferred) BOOLEAN AddStreamInfo(NODE_ Node, PWSTR StreamName, PVOID Buffer, ULONG Length, PULONG PBytesTransferred)
{ {
UINT8 StreamInfoBuf[sizeof(FSP_FSCTL_STREAM_INFO) + sizeof Node->Name]; UINT8 StreamInfoBuf[sizeof(FSP_FSCTL_STREAM_INFO) + sizeof Node->Name];
FSP_FSCTL_STREAM_INFO *StreamInfo = (FSP_FSCTL_STREAM_INFO *)StreamInfoBuf; FSP_FSCTL_STREAM_INFO *StreamInfo = (FSP_FSCTL_STREAM_INFO *)StreamInfoBuf;
PWSTR StreamName;
StreamName = wcschr(Node->Name, L':');
if (StreamName)
StreamName++;
else
StreamName = L"";
StreamInfo->Size = (UINT16)(sizeof(FSP_FSCTL_STREAM_INFO) + wcslen(StreamName) * sizeof(WCHAR)); StreamInfo->Size = (UINT16)(sizeof(FSP_FSCTL_STREAM_INFO) + wcslen(StreamName) * sizeof(WCHAR));
StreamInfo->StreamSize = Node->FileInfo.FileSize; StreamInfo->StreamSize = Node->FileInfo.FileSize;
@ -485,7 +475,14 @@ void RemoveNode(AIRFS_ Airfs, NODE_ Node)
#if defined(AIRFS_NAMED_STREAMS) #if defined(AIRFS_NAMED_STREAMS)
if (Node->IsAStream) if (Node->IsAStream)
Parent->Streams->erase(Node); {
if (Parent->Streams)
{
auto found = Parent->Streams->find(Node);
if (found != Parent->Streams->end())
Parent->Streams->erase(found);
}
}
else else
#endif #endif
Parent->Children->erase(Node); Parent->Children->erase(Node);
@ -988,11 +985,10 @@ NTSTATUS ApiOverwrite(FSP_FILE_SYSTEM *FileSystem, PVOID Node0, UINT32 FileAttri
{ {
for (auto Iter = Node->Streams->begin(); Iter != Node->Streams->end(); ) for (auto Iter = Node->Streams->begin(); Iter != Node->Streams->end(); )
{ {
NODE_ Stream = *Iter; NODE_ Stream = *Iter++;
LONG RefCount = Stream->RefCount; LONG RefCount = Stream->RefCount;
MemoryBarrier(); MemoryBarrier();
Iter++; if (RefCount <= 1)
if (RefCount <= 2)
{ {
RemoveNode(Airfs, Stream); RemoveNode(Airfs, Stream);
} }
@ -1073,8 +1069,7 @@ void ApiCleanup(FSP_FILE_SYSTEM *FileSystem, PVOID Node0, PWSTR Name, ULONG Flag
{ {
for (auto Iter = Node->Streams->begin(); Iter != Node->Streams->end(); ) for (auto Iter = Node->Streams->begin(); Iter != Node->Streams->end(); )
{ {
NODE_ Stream = *Iter; NODE_ Stream = *Iter++;
Iter++;
DeleteNode(Airfs, Stream); DeleteNode(Airfs, Stream);
} }
delete Node->Streams; delete Node->Streams;
@ -1314,10 +1309,7 @@ NTSTATUS ApiRename(FSP_FILE_SYSTEM *FileSystem, PVOID Node0, PWSTR Name,
if (NewNode->FileInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY) if (NewNode->FileInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
return STATUS_ACCESS_DENIED; return STATUS_ACCESS_DENIED;
}
if (NewNode && Node != NewNode)
{
ReferenceNode(NewNode); ReferenceNode(NewNode);
RemoveNode(Airfs, NewNode); RemoveNode(Airfs, NewNode);
DereferenceNode(Airfs, NewNode); DereferenceNode(Airfs, NewNode);
@ -1595,19 +1587,18 @@ NTSTATUS ApiGetStreamInfo(FSP_FILE_SYSTEM *FileSystem, PVOID Node0,
{ {
NODE_ Node = (NODE_) Node0; NODE_ Node = (NODE_) Node0;
if (Node->IsAStream) if (Node->IsAStream) Node = Node->Parent;
Node = Node->Parent;
if (!(Node->FileInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY) && if (!(Node->FileInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY))
!AddStreamInfo(Node, Buffer, Length, PBytesTransferred)) if (!AddStreamInfo(Node, L"", Buffer, Length, PBytesTransferred))
return STATUS_SUCCESS; return STATUS_SUCCESS;
// TODO: how to handle out-of-response-buffer-space condition?
if (Node->Streams) if (Node->Streams)
{ {
for (auto Iter = Node->Streams->begin(); Iter != Node->Streams->end(); ) // TODO: how to handle out-of-response-buffer-space condition?
for (auto Iter = Node->Streams->begin(); Iter != Node->Streams->end(); ++Iter)
{ {
BOOLEAN added = AddStreamInfo(*Iter, Buffer, Length, PBytesTransferred); BOOLEAN added = AddStreamInfo(*Iter, (*Iter)->Name, Buffer, Length, PBytesTransferred);
if (!added) goto done; if (!added) goto done;
} }
} }