[FASTFAT]

- Correctly track the buffer length in VfatGetAllInformation. Fixes pool corruption when running ntdll_winetest:file

svn path=/trunk/; revision=69898
This commit is contained in:
Thomas Faber 2015-11-16 13:58:39 +00:00
parent 187db82af7
commit 352bcdb0e1

View file

@ -1070,12 +1070,11 @@ VfatGetAllInformation(
PULONG BufferLength)
{
NTSTATUS Status;
ULONG InitialBufferLength = *BufferLength;
ASSERT(Info);
ASSERT(Fcb);
if (*BufferLength < sizeof(FILE_ALL_INFORMATION))
if (*BufferLength < FIELD_OFFSET(FILE_ALL_INFORMATION, NameInformation.FileName))
return STATUS_BUFFER_OVERFLOW;
/* Basic Information */
@ -1088,20 +1087,20 @@ VfatGetAllInformation(
Status = VfatGetInternalInformation(Fcb, &Info->InternalInformation, BufferLength);
if (!NT_SUCCESS(Status)) return Status;
/* EA Information */
Info->EaInformation.EaSize = 0;
Status = VfatGetEaInformation(FileObject, Fcb, DeviceObject, &Info->EaInformation, BufferLength);
if (!NT_SUCCESS(Status)) return Status;
/* Access Information: The IO-Manager adds this information */
*BufferLength -= sizeof(FILE_ACCESS_INFORMATION);
/* Position Information */
Status = VfatGetPositionInformation(FileObject, Fcb, DeviceObject, &Info->PositionInformation, BufferLength);
if (!NT_SUCCESS(Status)) return Status;
/* Mode Information: The IO-Manager adds this information */
*BufferLength -= sizeof(FILE_MODE_INFORMATION);
/* Alignment Information: The IO-Manager adds this information */
*BufferLength -= sizeof(FILE_ALIGNMENT_INFORMATION);
/* Name Information */
Status = VfatGetNameInformation(FileObject, Fcb, DeviceObject, &Info->NameInformation, BufferLength);
*BufferLength = InitialBufferLength - sizeof(FILE_ALL_INFORMATION);
if (InitialBufferLength > sizeof(FILE_ALL_INFORMATION))
*BufferLength -= min(InitialBufferLength - sizeof(FILE_ALL_INFORMATION), Fcb->PathNameU.Length);
return Status;
}