mirror of
https://github.com/winfsp/winfsp.git
synced 2025-07-03 17:32:57 -05:00
grand EaSize patch; passes winfsp-tests and ifstest
This commit is contained in:
@ -1285,6 +1285,7 @@ typedef struct FSP_FILE_NODE
|
||||
UINT64 LastAccessTime;
|
||||
UINT64 LastWriteTime;
|
||||
UINT64 ChangeTime;
|
||||
UINT32 EaSize;
|
||||
ULONG FileInfoChangeNumber;
|
||||
UINT64 Security;
|
||||
ULONG SecurityChangeNumber;
|
||||
|
16
src/sys/ea.c
16
src/sys/ea.c
@ -578,9 +578,11 @@ NTSTATUS FspFsvolSetEaComplete(
|
||||
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
||||
FSP_FILE_NODE *FileNode = FileObject->FsContext;
|
||||
FSP_FSCTL_TRANSACT_REQ *Request = FspIrpRequest(Irp);
|
||||
BOOLEAN Valid;
|
||||
BOOLEAN EaValid;
|
||||
|
||||
Valid = FALSE;
|
||||
FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.SetEa.FileInfo, FALSE);
|
||||
|
||||
EaValid = FALSE;
|
||||
if (0 < Response->Rsp.SetEa.Ea.Size &&
|
||||
Response->Buffer + Response->Rsp.SetEa.Ea.Size <=
|
||||
(PUINT8)Response + Response->Size)
|
||||
@ -589,19 +591,17 @@ NTSTATUS FspFsvolSetEaComplete(
|
||||
(PVOID)Response->Buffer, /* FspEaBufferFromFileSystemValidate may alter the buffer! */
|
||||
Response->Rsp.SetEa.Ea.Size,
|
||||
(PULONG)&Irp->IoStatus.Information);
|
||||
Valid = NT_SUCCESS(Result);
|
||||
EaValid = NT_SUCCESS(Result);
|
||||
}
|
||||
|
||||
/* if the EA buffer that we got back is valid */
|
||||
if (Valid)
|
||||
if (EaValid)
|
||||
{
|
||||
/* update the cached EA */
|
||||
/* if the EA buffer that we got back is valid, update the cached EA */
|
||||
FspFileNodeSetEa(FileNode,
|
||||
Response->Buffer, Response->Rsp.SetEa.Ea.Size);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* invalidate the cached EA */
|
||||
/* if the EA buffer that we got back is not valid, invalidate the cached EA */
|
||||
FspFileNodeSetEa(FileNode, 0, 0);
|
||||
}
|
||||
|
||||
|
@ -1631,6 +1631,7 @@ VOID FspFileNodeGetFileInfo(FSP_FILE_NODE *FileNode, FSP_FSCTL_FILE_INFO *FileIn
|
||||
FileInfo->LastAccessTime = FileNode->LastAccessTime;
|
||||
FileInfo->LastWriteTime = FileNode->LastWriteTime;
|
||||
FileInfo->ChangeTime = FileNode->ChangeTime;
|
||||
FileInfo->EaSize = FileNode->EaSize;
|
||||
}
|
||||
|
||||
BOOLEAN FspFileNodeTryGetFileInfo(FSP_FILE_NODE *FileNode, FSP_FSCTL_FILE_INFO *FileInfo)
|
||||
@ -1778,6 +1779,7 @@ VOID FspFileNodeSetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject,
|
||||
MainFileNode->LastAccessTime = FileInfo->LastAccessTime;
|
||||
MainFileNode->LastWriteTime = FileInfo->LastWriteTime;
|
||||
MainFileNode->ChangeTime = FileInfo->ChangeTime;
|
||||
MainFileNode->EaSize = FileInfo->EaSize;
|
||||
|
||||
if (0 != CcFileObject)
|
||||
{
|
||||
|
@ -179,6 +179,9 @@ static NTSTATUS FspFsvolQueryAllInformation(PFILE_OBJECT FileObject,
|
||||
Info->EaInformation.EaSize =
|
||||
FspFsvolDeviceExtension(FileNode->FsvolDeviceObject)->VolumeParams.ExtendedAttributes ?
|
||||
FileInfo->EaSize : 0;
|
||||
/* magic computations are courtesy of NTFS */
|
||||
if (0 != Info->EaInformation.EaSize)
|
||||
Info->EaInformation.EaSize += 4;
|
||||
|
||||
Info->PositionInformation.CurrentByteOffset = FileObject->CurrentByteOffset;
|
||||
|
||||
@ -258,6 +261,9 @@ static NTSTATUS FspFsvolQueryEaInformation(PFILE_OBJECT FileObject,
|
||||
Info->EaSize =
|
||||
FspFsvolDeviceExtension(FileNode->FsvolDeviceObject)->VolumeParams.ExtendedAttributes ?
|
||||
FileInfo->EaSize : 0;
|
||||
/* magic computations are courtesy of NTFS */
|
||||
if (0 != Info->EaSize)
|
||||
Info->EaSize += 4;
|
||||
|
||||
*PBuffer = (PVOID)(Info + 1);
|
||||
|
||||
|
Reference in New Issue
Block a user