From 2e90519c13c456815d02968eacdff90eeb9b1182 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 24 Apr 2009 22:31:35 +0000 Subject: [PATCH] -Fixes in new resource file code: Added file length checks and set lump count to 1 for single lump files. SVN r1558 (trunk) --- src/resourcefiles/file_7z.cpp | 17 ++++++++++------- src/resourcefiles/file_grp.cpp | 17 ++++++++++------- src/resourcefiles/file_lump.cpp | 1 + src/resourcefiles/file_pak.cpp | 17 ++++++++++------- src/resourcefiles/file_rff.cpp | 17 ++++++++++------- src/resourcefiles/file_wad.cpp | 17 ++++++++++------- src/resourcefiles/file_zip.cpp | 17 ++++++++++------- 7 files changed, 61 insertions(+), 42 deletions(-) diff --git a/src/resourcefiles/file_7z.cpp b/src/resourcefiles/file_7z.cpp index 04d9fe4fd..b1f81c804 100644 --- a/src/resourcefiles/file_7z.cpp +++ b/src/resourcefiles/file_7z.cpp @@ -334,14 +334,17 @@ FResourceFile *Check7Z(const char *filename, FileReader *file) { char head[k7zSignatureSize]; - file->Seek(0, SEEK_SET); - file->Read(&head, k7zSignatureSize); - file->Seek(0, SEEK_SET); - if (!memcmp(head, k7zSignature, k7zSignatureSize)) + if (file->GetLength() >= k7zSignatureSize) { - FResourceFile *rf = new F7ZFile(filename, file); - if (rf->Open()) return rf; - delete rf; + file->Seek(0, SEEK_SET); + file->Read(&head, k7zSignatureSize); + file->Seek(0, SEEK_SET); + if (!memcmp(head, k7zSignature, k7zSignatureSize)) + { + FResourceFile *rf = new F7ZFile(filename, file); + if (rf->Open()) return rf; + delete rf; + } } return NULL; } diff --git a/src/resourcefiles/file_grp.cpp b/src/resourcefiles/file_grp.cpp index f51f84846..c9ce2dc1b 100644 --- a/src/resourcefiles/file_grp.cpp +++ b/src/resourcefiles/file_grp.cpp @@ -138,14 +138,17 @@ FResourceFile *CheckGRP(const char *filename, FileReader *file) { char head[12]; - file->Seek(0, SEEK_SET); - file->Read(&head, 12); - file->Seek(0, SEEK_SET); - if (!memcmp(head, "KenSilverman", 12)) + if (file->GetLength() >= 12) { - FResourceFile *rf = new FGrpFile(filename, file); - if (rf->Open()) return rf; - delete rf; + file->Seek(0, SEEK_SET); + file->Read(&head, 12); + file->Seek(0, SEEK_SET); + if (!memcmp(head, "KenSilverman", 12)) + { + FResourceFile *rf = new FGrpFile(filename, file); + if (rf->Open()) return rf; + delete rf; + } } return NULL; } diff --git a/src/resourcefiles/file_lump.cpp b/src/resourcefiles/file_lump.cpp index da549f874..09d665173 100644 --- a/src/resourcefiles/file_lump.cpp +++ b/src/resourcefiles/file_lump.cpp @@ -80,6 +80,7 @@ bool FLumpFile::Open() Lumps->Namespace = ns_global; Lumps->Flags = 0; Lumps->FullName = NULL; + NumLumps = 1; return true; } diff --git a/src/resourcefiles/file_pak.cpp b/src/resourcefiles/file_pak.cpp index d9310c7b3..3554c1534 100644 --- a/src/resourcefiles/file_pak.cpp +++ b/src/resourcefiles/file_pak.cpp @@ -130,14 +130,17 @@ FResourceFile *CheckPak(const char *filename, FileReader *file) { char head[4]; - file->Seek(0, SEEK_SET); - file->Read(&head, 4); - file->Seek(0, SEEK_SET); - if (!memcmp(head, "PACK", 4)) + if (file->GetLength() >= 12) { - FResourceFile *rf = new FPakFile(filename, file); - if (rf->Open()) return rf; - delete rf; + file->Seek(0, SEEK_SET); + file->Read(&head, 4); + file->Seek(0, SEEK_SET); + if (!memcmp(head, "PACK", 4)) + { + FResourceFile *rf = new FPakFile(filename, file); + if (rf->Open()) return rf; + delete rf; + } } return NULL; } diff --git a/src/resourcefiles/file_rff.cpp b/src/resourcefiles/file_rff.cpp index b570e5f56..fb5daf708 100644 --- a/src/resourcefiles/file_rff.cpp +++ b/src/resourcefiles/file_rff.cpp @@ -235,14 +235,17 @@ FResourceFile *CheckRFF(const char *filename, FileReader *file) { char head[4]; - file->Seek(0, SEEK_SET); - file->Read(&head, 4); - file->Seek(0, SEEK_SET); - if (!memcmp(head, "RFF\x1a", 4)) + if (file->GetLength() >= 16) { - FResourceFile *rf = new FRFFFile(filename, file); - if (rf->Open()) return rf; - delete rf; + file->Seek(0, SEEK_SET); + file->Read(&head, 4); + file->Seek(0, SEEK_SET); + if (!memcmp(head, "RFF\x1a", 4)) + { + FResourceFile *rf = new FRFFFile(filename, file); + if (rf->Open()) return rf; + delete rf; + } } return NULL; } diff --git a/src/resourcefiles/file_wad.cpp b/src/resourcefiles/file_wad.cpp index 505627162..418a080c7 100644 --- a/src/resourcefiles/file_wad.cpp +++ b/src/resourcefiles/file_wad.cpp @@ -328,14 +328,17 @@ FResourceFile *CheckWad(const char *filename, FileReader *file) { char head[4]; - file->Seek(0, SEEK_SET); - file->Read(&head, 4); - file->Seek(0, SEEK_SET); - if (!memcmp(head, "IWAD", 4) || !memcmp(head, "PWAD", 4)) + if (file->GetLength() >= 12) { - FResourceFile *rf = new FWadFile(filename, file); - if (rf->Open()) return rf; - delete rf; + file->Seek(0, SEEK_SET); + file->Read(&head, 4); + file->Seek(0, SEEK_SET); + if (!memcmp(head, "IWAD", 4) || !memcmp(head, "PWAD", 4)) + { + FResourceFile *rf = new FWadFile(filename, file); + if (rf->Open()) return rf; + delete rf; + } } return NULL; } diff --git a/src/resourcefiles/file_zip.cpp b/src/resourcefiles/file_zip.cpp index a2f4b9e4d..5e1bf130b 100644 --- a/src/resourcefiles/file_zip.cpp +++ b/src/resourcefiles/file_zip.cpp @@ -391,14 +391,17 @@ FResourceFile *CheckZip(const char *filename, FileReader *file) { char head[4]; - file->Seek(0, SEEK_SET); - file->Read(&head, 4); - file->Seek(0, SEEK_SET); - if (!memcmp(head, "PK\x3\x4", 4)) + if (file->GetLength() >= sizeof(FZipLocalFileHeader)) { - FResourceFile *rf = new FZipFile(filename, file); - if (rf->Open()) return rf; - delete rf; + file->Seek(0, SEEK_SET); + file->Read(&head, 4); + file->Seek(0, SEEK_SET); + if (!memcmp(head, "PK\x3\x4", 4)) + { + FResourceFile *rf = new FZipFile(filename, file); + if (rf->Open()) return rf; + delete rf; + } } return NULL; }