PUNICODE_STRING LongName,
PUNICODE_STRING ShortName);
+BOOLEAN
+CdfsIsRecordValid(IN PDEVICE_EXTENSION DeviceExt,
+ IN PDIR_RECORD Record);
+
/* rw.c */
NTSTATUS
return Status;
}
- if (Record->RecordLength < Record->FileIdLength + FIELD_OFFSET(DIR_RECORD, FileId))
+ if (!CdfsIsRecordValid(DeviceExt, Record))
{
- DPRINT1("Found corrupted entry! %u - %u\n", Record->RecordLength, Record->FileIdLength + FIELD_OFFSET(DIR_RECORD, FileId));
RtlFreeUnicodeString(&FileToFindUpcase);
CcUnpinData(Context);
return STATUS_DISK_CORRUPT_ERROR;
DPRINT("Name '%S'\n", name);
RtlInitUnicodeString(&LongName, name);
- /* Was the entry degenerated? */
- if (LongName.Length < sizeof(WCHAR))
- {
- DPRINT1("Found entry with invalid name!\n");
- RtlFreeUnicodeString(&FileToFindUpcase);
- CcUnpinData(Context);
- return STATUS_DISK_CORRUPT_ERROR;
- }
ShortName.Length = 0;
ShortName.MaximumLength = 26;
DPRINT("RecordLength %u ExtAttrRecordLength %u NameLength %u\n",
Record->RecordLength, Record->ExtAttrRecordLength, Record->FileIdLength);
- if (Record->RecordLength < Record->FileIdLength + FIELD_OFFSET(DIR_RECORD, FileId))
+ if (!CdfsIsRecordValid(DeviceExt, Record))
{
- DPRINT1("Found corrupted entry! %u - %u\n", Record->RecordLength, Record->FileIdLength + FIELD_OFFSET(DIR_RECORD, FileId));
RtlFreeUnicodeString(&FileToFindUpcase);
CcUnpinData(Context);
return STATUS_DISK_CORRUPT_ERROR;
DPRINT ("Offset %lu\n", Offset);
RtlInitUnicodeString(&LongName, Name);
- /* Was the entry degenerated? */
- if (LongName.Length < sizeof(WCHAR))
- {
- DPRINT1("Found entry with invalid name!\n");
- RtlFreeUnicodeString(&FileToFindUpcase);
- CcUnpinData(Context);
- return STATUS_DISK_CORRUPT_ERROR;
- }
-
RtlInitEmptyUnicodeString(&ShortName, ShortNameBuffer, sizeof(ShortNameBuffer));
RtlZeroMemory(ShortNameBuffer, sizeof(ShortNameBuffer));
return FsRtlIsFatDbcsLegal(DbcsName, FALSE, FALSE, FALSE);
}
+BOOLEAN
+CdfsIsRecordValid(IN PDEVICE_EXTENSION DeviceExt,
+ IN PDIR_RECORD Record)
+{
+ if (Record->RecordLength < Record->FileIdLength + FIELD_OFFSET(DIR_RECORD, FileId))
+ {
+ DPRINT1("Found corrupted entry! %u - %u\n", Record->RecordLength, Record->FileIdLength + FIELD_OFFSET(DIR_RECORD, FileId));
+ return FALSE;
+ }
+
+ if (Record->FileIdLength == 0)
+ {
+ DPRINT1("Found corrupted entry (null size)!\n");
+ return FALSE;
+ }
+
+ if (DeviceExt->CdInfo.JolietLevel == 0)
+ {
+ if (Record->FileId[0] == ANSI_NULL && Record->FileIdLength != 1)
+ {
+ DPRINT1("Found corrupted entry!\n");
+ return FALSE;
+ }
+ }
+ else
+ {
+ if (Record->FileIdLength & 1 && Record->FileIdLength != 1)
+ {
+ DPRINT1("Found corrupted entry! %u\n", Record->FileIdLength);
+ return FALSE;
+ }
+
+ if (Record->FileIdLength == 1 && Record->FileId[0] != 0 && Record->FileId[0] != 1)
+ {
+ DPRINT1("Found corrupted entry! %c\n", Record->FileId[0]);
+ DPRINT1("%wc\n", ((PWSTR)Record->FileId)[0]);
+ return FALSE;
+ }
+
+ if (((PWSTR)Record->FileId)[0] == UNICODE_NULL)
+ {
+ DPRINT1("Found corrupted entry!\n");
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
VOID
CdfsShortNameCacheGet
(PFCB DirectoryFcb,