Author: tthompson Date: Tue Jul 4 21:16:46 2017 New Revision: 75278
URL: http://svn.reactos.org/svn/reactos?rev=75278&view=rev Log: [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.
Modified: branches/GSoC_2016/NTFS/drivers/filesystems/ntfs/mft.c
Modified: branches/GSoC_2016/NTFS/drivers/filesystems/ntfs/mft.c URL: http://svn.reactos.org/svn/reactos/branches/GSoC_2016/NTFS/drivers/filesyste... ============================================================================== --- branches/GSoC_2016/NTFS/drivers/filesystems/ntfs/mft.c [iso-8859-1] (original) +++ branches/GSoC_2016/NTFS/drivers/filesystems/ntfs/mft.c [iso-8859-1] Tue Jul 4 21:16:46 2017 @@ -1418,7 +1418,15 @@ 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. @@ -1439,6 +1447,18 @@ NewDataSize, 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);