mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 01:55:19 +00:00
[NTFS] - Fix UpdateFileNameRecord() when the file being updated resides in $INDEX_ROOT. Also, don't attempt to read beyond size of index root attribute, and check return value after reading.
svn path=/branches/GSoC_2016/NTFS/; revision=75278
This commit is contained in:
parent
612facc28f
commit
f5b7f90f23
1 changed files with 21 additions and 1 deletions
|
@ -1418,7 +1418,15 @@ UpdateFileNameRecord(PDEVICE_EXTENSION Vcb,
|
|||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
}
|
||||
|
||||
ReadAttribute(Vcb, IndexRootCtx, 0, IndexRecord, Vcb->NtfsInfo.BytesPerIndexRecord);
|
||||
Status = ReadAttribute(Vcb, IndexRootCtx, 0, IndexRecord, AttributeDataLength(&IndexRootCtx->Record));
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("ERROR: Failed to read Index Root!\n");
|
||||
ExFreePoolWithTag(IndexRecord, TAG_NTFS);
|
||||
ReleaseAttributeContext(IndexRootCtx);
|
||||
ExFreePoolWithTag(MftRecord, TAG_NTFS);
|
||||
}
|
||||
|
||||
IndexRoot = (PINDEX_ROOT_ATTRIBUTE)IndexRecord;
|
||||
IndexEntry = (PINDEX_ENTRY_ATTRIBUTE)((PCHAR)&IndexRoot->Header + IndexRoot->Header.FirstEntryOffset);
|
||||
// Index root is always resident.
|
||||
|
@ -1440,6 +1448,18 @@ UpdateFileNameRecord(PDEVICE_EXTENSION Vcb,
|
|||
NewAllocationSize,
|
||||
CaseSensitive);
|
||||
|
||||
if (Status == STATUS_PENDING)
|
||||
{
|
||||
// we need to write the index root attribute back to disk
|
||||
ULONG LengthWritten;
|
||||
Status = WriteAttribute(Vcb, IndexRootCtx, 0, IndexRecord, AttributeDataLength(&IndexRootCtx->Record), &LengthWritten);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("ERROR: Couldn't update Index Root!\n");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
ReleaseAttributeContext(IndexRootCtx);
|
||||
ExFreePoolWithTag(IndexRecord, TAG_NTFS);
|
||||
ExFreePoolWithTag(MftRecord, TAG_NTFS);
|
||||
|
|
Loading…
Reference in a new issue