[FASTFAT]

- Fix incorrect referencing in VfatCreateFile. vfatGetFCBForFile expects a reference on ParentFcb (and may release it), and also returns a referenced parent FCB.
CORE-8756 #resolve

svn path=/trunk/; revision=65276
This commit is contained in:
Thomas Faber 2014-11-05 23:23:52 +00:00
parent 46f478ab95
commit 0e9ce28f2c
3 changed files with 7 additions and 15 deletions

View file

@ -565,11 +565,14 @@ VfatCreateFile(
LONG idx, FileNameLen; LONG idx, FileNameLen;
ParentFcb = (FileObject->RelatedFileObject != NULL) ? FileObject->RelatedFileObject->FsContext : NULL; ParentFcb = (FileObject->RelatedFileObject != NULL) ? FileObject->RelatedFileObject->FsContext : NULL;
Status = vfatGetFCBForFile(DeviceExt, &ParentFcb, &TargetFcb, &PathNameU); if (ParentFcb)
if (Status == STATUS_SUCCESS)
{ {
vfatGrabFCB(DeviceExt, ParentFcb); vfatGrabFCB(DeviceExt, ParentFcb);
}
Status = vfatGetFCBForFile(DeviceExt, &ParentFcb, &TargetFcb, &PathNameU);
if (NT_SUCCESS(Status))
{
vfatReleaseFCB(DeviceExt, TargetFcb); vfatReleaseFCB(DeviceExt, TargetFcb);
Irp->IoStatus.Information = FILE_EXISTS; Irp->IoStatus.Information = FILE_EXISTS;
} }
@ -623,6 +626,7 @@ VfatCreateFile(
if (NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
{ {
pFcb = FileObject->FsContext; pFcb = FileObject->FsContext;
ASSERT(pFcb == ParentFcb);
if (pFcb->OpenHandleCount == 0) if (pFcb->OpenHandleCount == 0)
{ {
@ -640,7 +644,6 @@ VfatCreateFile(
FALSE); FALSE);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
vfatReleaseFCB(DeviceExt, ParentFcb);
VfatCloseFile(DeviceExt, FileObject); VfatCloseFile(DeviceExt, FileObject);
return Status; return Status;
} }

View file

@ -201,12 +201,6 @@ FATGetNextDirEntry(
CcUnpinData(*pContext); CcUnpinData(*pContext);
} }
if (!pDirFcb->FileObject)
{
DPRINT1("Buggy FCB (cleaned up)! %S (%d / %u)\n", pDirFcb->PathNameBuffer, pDirFcb->RefCount, pDirFcb->OpenHandleCount);
return STATUS_NO_MORE_ENTRIES;
}
if (FileOffset.u.LowPart >= pDirFcb->RFCB.FileSize.u.LowPart || if (FileOffset.u.LowPart >= pDirFcb->RFCB.FileSize.u.LowPart ||
!CcMapData(pDirFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, pContext, pPage)) !CcMapData(pDirFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, pContext, pPage))
{ {

View file

@ -167,11 +167,6 @@ vfatFindDirSpace(
{ {
CcUnpinData(Context); CcUnpinData(Context);
} }
if (!pDirFcb->FileObject)
{
DPRINT1("Buggy FCB (cleaned up)! %S (%d / %u)\n", pDirFcb->PathNameBuffer, pDirFcb->RefCount, pDirFcb->OpenHandleCount);
return FALSE;
}
if (!CcPinRead(pDirFcb->FileObject, &FileOffset, DeviceExt->FatInfo.BytesPerCluster, if (!CcPinRead(pDirFcb->FileObject, &FileOffset, DeviceExt->FatInfo.BytesPerCluster,
TRUE, &Context, (PVOID*)&pFatEntry)) TRUE, &Context, (PVOID*)&pFatEntry))
{ {