From a9d56f0a135e05eb7183f28c2daaed5144887e6a Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 21 Jan 2012 22:16:46 +0000 Subject: [PATCH] [CDFS] - Prevent an infinite loop in CdfsDeviceIoControl if the the verify request is successful but IoCallDriver keeps returning STATUS_VERIFY_REQUIRED svn path=/trunk/; revision=55057 --- reactos/drivers/filesystems/cdfs/common.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/reactos/drivers/filesystems/cdfs/common.c b/reactos/drivers/filesystems/cdfs/common.c index 0b62cbaca0c..d73864bb054 100644 --- a/reactos/drivers/filesystems/cdfs/common.c +++ b/reactos/drivers/filesystems/cdfs/common.c @@ -154,6 +154,7 @@ CdfsDeviceIoControl (IN PDEVICE_OBJECT DeviceObject, KEVENT Event; PIRP Irp; NTSTATUS Status; + BOOLEAN LastChance = FALSE; DPRINT("CdfsDeviceIoControl(DeviceObject %x, CtlCode %x, " "InputBuffer %x, InputBufferSize %x, OutputBuffer %x, " @@ -208,21 +209,30 @@ again: { PDEVICE_OBJECT DeviceToVerify; - DPRINT1("STATUS_VERIFY_REQUIRED\n"); DeviceToVerify = IoGetDeviceToVerify(PsGetCurrentThread()); IoSetDeviceToVerify(PsGetCurrentThread(), NULL); if (DeviceToVerify) { Status = IoVerifyVolume(DeviceToVerify, FALSE); - DPRINT1("IoVerifyVolume() returned (Status %lx)\n", Status); + DPRINT("IoVerifyVolume() returned (Status %lx)\n", Status); } - if (NT_SUCCESS(Status)) + if (NT_SUCCESS(Status) && !LastChance) { DPRINT1("Volume verify succeeded; trying request again\n"); + LastChance = TRUE; goto again; } + else if (NT_SUCCESS(Status)) + { + DPRINT1("Failed to read after successful verify, aborting\n"); + Status = STATUS_DEVICE_NOT_READY; + } + else + { + DPRINT1("IoVerifyVolume() failed (Status %lx)\n", Status); + } } DPRINT("Returning Status %x\n", Status);