sys: FspFsvolQueryDirectoryCopy: fix issue #380

This commit is contained in:
Bill Zissimopoulos 2021-10-13 16:35:02 +01:00
parent 490d021b22
commit 3e66082f11
No known key found for this signature in database
GPG Key ID: 3D4F95D52C7B3EA3

View File

@ -119,6 +119,17 @@ static NTSTATUS FspFsvolQueryDirectoryCopy(
DirInfo->FileInfo.FileAttributes : FILE_ATTRIBUTE_NORMAL;\ DirInfo->FileInfo.FileAttributes : FILE_ATTRIBUTE_NORMAL;\
__VA_ARGS__\ __VA_ARGS__\
) )
#define FILL_INFO_EASIZE()\
if (!FlagOn(DirInfo->FileInfo.FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT))\
{\
Info->EaSize = ReturnEaSize ? DirInfo->FileInfo.EaSize : 0;\
/* magic computations are courtesy of NTFS */\
if (0 != Info->EaSize)\
Info->EaSize += 4;\
}\
else\
/* Fix GitHub issue #380: turns out that the EaSize field is also used for the reparse tag */\
Info->EaSize = DirInfo->FileInfo.ReparseTag
PAGED_CODE(); PAGED_CODE();
@ -240,18 +251,12 @@ static NTSTATUS FspFsvolQueryDirectoryCopy(
break; break;
case FileFullDirectoryInformation: case FileFullDirectoryInformation:
FILL_INFO(FILE_FULL_DIR_INFORMATION, FILL_INFO(FILE_FULL_DIR_INFORMATION,
Info->EaSize = ReturnEaSize ? DirInfo->FileInfo.EaSize : 0; FILL_INFO_EASIZE();
/* magic computations are courtesy of NTFS */
if (0 != Info->EaSize)
Info->EaSize += 4;
); );
break; break;
case FileIdFullDirectoryInformation: case FileIdFullDirectoryInformation:
FILL_INFO(FILE_ID_FULL_DIR_INFORMATION, FILL_INFO(FILE_ID_FULL_DIR_INFORMATION,
Info->EaSize = ReturnEaSize ? DirInfo->FileInfo.EaSize : 0; FILL_INFO_EASIZE();
/* magic computations are courtesy of NTFS */
if (0 != Info->EaSize)
Info->EaSize += 4;
Info->FileId.QuadPart = DirInfo->FileInfo.IndexNumber; Info->FileId.QuadPart = DirInfo->FileInfo.IndexNumber;
); );
break; break;
@ -260,20 +265,14 @@ static NTSTATUS FspFsvolQueryDirectoryCopy(
break; break;
case FileBothDirectoryInformation: case FileBothDirectoryInformation:
FILL_INFO(FILE_BOTH_DIR_INFORMATION, FILL_INFO(FILE_BOTH_DIR_INFORMATION,
Info->EaSize = ReturnEaSize ? DirInfo->FileInfo.EaSize : 0; FILL_INFO_EASIZE();
/* magic computations are courtesy of NTFS */
if (0 != Info->EaSize)
Info->EaSize += 4;
Info->ShortNameLength = 0; Info->ShortNameLength = 0;
RtlZeroMemory(Info->ShortName, sizeof Info->ShortName); RtlZeroMemory(Info->ShortName, sizeof Info->ShortName);
); );
break; break;
case FileIdBothDirectoryInformation: case FileIdBothDirectoryInformation:
FILL_INFO(FILE_ID_BOTH_DIR_INFORMATION, FILL_INFO(FILE_ID_BOTH_DIR_INFORMATION,
Info->EaSize = ReturnEaSize ? DirInfo->FileInfo.EaSize : 0; FILL_INFO_EASIZE();
/* magic computations are courtesy of NTFS */
if (0 != Info->EaSize)
Info->EaSize += 4;
Info->ShortNameLength = 0; Info->ShortNameLength = 0;
RtlZeroMemory(Info->ShortName, sizeof Info->ShortName); RtlZeroMemory(Info->ShortName, sizeof Info->ShortName);
Info->FileId.QuadPart = DirInfo->FileInfo.IndexNumber; Info->FileId.QuadPart = DirInfo->FileInfo.IndexNumber;
@ -331,6 +330,7 @@ static NTSTATUS FspFsvolQueryDirectoryCopy(
return Result; return Result;
#undef FILL_INFO_EASIZE
#undef FILL_INFO #undef FILL_INFO
#undef FILL_INFO_BASE #undef FILL_INFO_BASE
} }