From 81c8bbee46ad6ebacf72eae70ba5147f376205a4 Mon Sep 17 00:00:00 2001 From: Rod Smith Date: Mon, 14 Sep 2020 10:08:18 -0400 Subject: [PATCH] Fix segfault on some weird data structures --- NEWS | 6 ++++++ gpt.cc | 13 ++++++++++++- support.h | 2 +- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 54c865e..bac3da3 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,9 @@ +1.0.6 (?/??/2020): +------------------ + +- Fixed bug that could cause segfault if GPT header claimed partition + entries are oversized. + 1.0.5 (2/17/2020): ------------------ diff --git a/gpt.cc b/gpt.cc index fe8e956..1b4e10f 100644 --- a/gpt.cc +++ b/gpt.cc @@ -1041,6 +1041,14 @@ int GPTData::LoadHeader(struct GPTHeader *header, DiskIO & disk, uint64_t sector } // if *crcOk = CheckHeaderCRC(&tempHeader); + if (tempHeader.sizeOfPartitionEntries != sizeof(GPTPart)) { + cerr << "Warning: Partition table header claims that the size of partition table\n"; + cerr << "entries is " << tempHeader.sizeOfPartitionEntries << " bytes, but this program "; + cerr << " supports only " << sizeof(GPTPart) << "-byte entries.\n"; + cerr << "Adjusting accordingly, but partition table may be garbage.\n"; + tempHeader.sizeOfPartitionEntries = sizeof(GPTPart); + } + if (allOK && (numParts != tempHeader.numParts) && *crcOk) { allOK = SetGPTSize(tempHeader.numParts, 0); } @@ -1058,7 +1066,10 @@ int GPTData::LoadPartitionTable(const struct GPTHeader & header, DiskIO & disk, uint32_t sizeOfParts, newCRC; int retval; - if (disk.OpenForRead()) { + if (header.sizeOfPartitionEntries != sizeof(GPTPart)) { + cerr << "Error! GPT header contains invalid partition entry size!\n"; + retval = 0; + } else if (disk.OpenForRead()) { if (sector == 0) { retval = disk.Seek(header.partitionEntriesLBA); } else { diff --git a/support.h b/support.h index 9a79b95..978bfe1 100644 --- a/support.h +++ b/support.h @@ -8,7 +8,7 @@ #ifndef __GPTSUPPORT #define __GPTSUPPORT -#define GPTFDISK_VERSION "1.0.5" +#define GPTFDISK_VERSION "1.0.5.1" #if defined (__FreeBSD__) || defined (__FreeBSD_kernel__) || defined (__APPLE__) // Darwin (Mac OS) & FreeBSD: disk IOCTLs are different, and there is no lseek64 -- 1.8.3.1