mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2025-11-24 10:14:55 +00:00
cgptlib: Add support for IGNOREME GPT signature
This patch makes cgpt aware of a special "IGNOREME" GPT header signature string that may appear in either the primary or the secondary GPT and cause cgpt (and other cgptlib clients) to completely ignore that GPT. It will continue to function correctly for all other purposes (using the data from the non-ignored GPT), but never write any data back to the ignored GPT. BRANCH=None BUG=chrome-os-partner:52595 TEST=unit tests Change-Id: I7e53542385ae9d8d24dc25b75e91f4ff4917f66f Signed-off-by: Julius Werner <jwerner@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/340072 Reviewed-by: Nam Nguyen <namnguyen@google.com>
This commit is contained in:
committed by
chrome-bot
parent
5de0000ece
commit
39910d062d
@@ -184,7 +184,11 @@ static int GptLoad(struct drive *drive, uint32_t sector_bytes) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Warning("Primary GPT header is invalid\n");
|
Warning("Primary GPT header is %s\n",
|
||||||
|
memcmp(primary_header->signature, GPT_HEADER_SIGNATURE_IGNORED,
|
||||||
|
GPT_HEADER_SIGNATURE_SIZE) ? "invalid" : "being ignored");
|
||||||
|
drive->gpt.primary_entries = calloc(MAX_NUMBER_OF_ENTRIES,
|
||||||
|
sizeof(GptEntry));
|
||||||
}
|
}
|
||||||
GptHeader* secondary_header = (GptHeader*)drive->gpt.secondary_header;
|
GptHeader* secondary_header = (GptHeader*)drive->gpt.secondary_header;
|
||||||
if (CheckHeader(secondary_header, 1, drive->gpt.streaming_drive_sectors,
|
if (CheckHeader(secondary_header, 1, drive->gpt.streaming_drive_sectors,
|
||||||
@@ -198,13 +202,19 @@ static int GptLoad(struct drive *drive, uint32_t sector_bytes) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Warning("Secondary GPT header is invalid\n");
|
Warning("Secondary GPT header is %s\n",
|
||||||
|
memcmp(primary_header->signature, GPT_HEADER_SIGNATURE_IGNORED,
|
||||||
|
GPT_HEADER_SIGNATURE_SIZE) ? "invalid" : "being ignored");
|
||||||
|
drive->gpt.secondary_entries = calloc(MAX_NUMBER_OF_ENTRIES,
|
||||||
|
sizeof(GptEntry));
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int GptSave(struct drive *drive) {
|
static int GptSave(struct drive *drive) {
|
||||||
int errors = 0;
|
int errors = 0;
|
||||||
|
|
||||||
|
if (!(drive->gpt.ignored & MASK_PRIMARY)) {
|
||||||
if (drive->gpt.modified & GPT_MODIFIED_HEADER1) {
|
if (drive->gpt.modified & GPT_MODIFIED_HEADER1) {
|
||||||
if (CGPT_OK != Save(drive, drive->gpt.primary_header,
|
if (CGPT_OK != Save(drive, drive->gpt.primary_header,
|
||||||
GPT_PMBR_SECTORS,
|
GPT_PMBR_SECTORS,
|
||||||
@@ -230,9 +240,10 @@ static int GptSave(struct drive *drive) {
|
|||||||
errors++;
|
errors++;
|
||||||
Error("I/O error when trying to write primary GPT\n");
|
Error("I/O error when trying to write primary GPT\n");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Only start writing secondary GPT if primary was written correctly.
|
// Only start writing secondary GPT if primary was written correctly.
|
||||||
if (!errors) {
|
if (!errors && !(drive->gpt.ignored & MASK_SECONDARY)) {
|
||||||
if (drive->gpt.modified & GPT_MODIFIED_HEADER2) {
|
if (drive->gpt.modified & GPT_MODIFIED_HEADER2) {
|
||||||
if(CGPT_OK != Save(drive, drive->gpt.secondary_header,
|
if(CGPT_OK != Save(drive, drive->gpt.secondary_header,
|
||||||
drive->gpt.gpt_drive_sectors - GPT_PMBR_SECTORS,
|
drive->gpt.gpt_drive_sectors - GPT_PMBR_SECTORS,
|
||||||
|
|||||||
@@ -250,6 +250,10 @@ static int GptShow(struct drive *drive, CgptShowParams *params) {
|
|||||||
PMBRToStr(&drive->pmbr, buf, sizeof(buf)); // will exit if buf is too small
|
PMBRToStr(&drive->pmbr, buf, sizeof(buf)); // will exit if buf is too small
|
||||||
printf(GPT_FMT, 0, GPT_PMBR_SECTORS, "", buf);
|
printf(GPT_FMT, 0, GPT_PMBR_SECTORS, "", buf);
|
||||||
|
|
||||||
|
if (drive->gpt.ignored & MASK_PRIMARY) {
|
||||||
|
printf(GPT_FMT, (int)GPT_PMBR_SECTORS,
|
||||||
|
(int)GPT_HEADER_SECTORS, "IGNORED", "Pri GPT header");
|
||||||
|
} else {
|
||||||
if (drive->gpt.valid_headers & MASK_PRIMARY) {
|
if (drive->gpt.valid_headers & MASK_PRIMARY) {
|
||||||
printf(GPT_FMT, (int)GPT_PMBR_SECTORS,
|
printf(GPT_FMT, (int)GPT_PMBR_SECTORS,
|
||||||
(int)GPT_HEADER_SECTORS, "", "Pri GPT header");
|
(int)GPT_HEADER_SECTORS, "", "Pri GPT header");
|
||||||
@@ -278,8 +282,13 @@ static int GptShow(struct drive *drive, CgptShowParams *params) {
|
|||||||
if (params->debug ||
|
if (params->debug ||
|
||||||
(drive->gpt.valid_entries & MASK_PRIMARY))
|
(drive->gpt.valid_entries & MASK_PRIMARY))
|
||||||
EntriesDetails(drive, PRIMARY, params->numeric);
|
EntriesDetails(drive, PRIMARY, params->numeric);
|
||||||
|
}
|
||||||
|
|
||||||
/****************************** Secondary *************************/
|
/****************************** Secondary *************************/
|
||||||
|
if (drive->gpt.ignored & MASK_SECONDARY) {
|
||||||
|
printf(GPT_FMT, (int)(drive->gpt.gpt_drive_sectors - GPT_HEADER_SECTORS),
|
||||||
|
(int)GPT_HEADER_SECTORS, "IGNORED", "Sec GPT header");
|
||||||
|
} else {
|
||||||
GptHeader* secondary_header = (GptHeader*)drive->gpt.secondary_header;
|
GptHeader* secondary_header = (GptHeader*)drive->gpt.secondary_header;
|
||||||
printf(GPT_FMT, (int)secondary_header->entries_lba,
|
printf(GPT_FMT, (int)secondary_header->entries_lba,
|
||||||
(int)CalculateEntriesSectors(secondary_header),
|
(int)CalculateEntriesSectors(secondary_header),
|
||||||
@@ -287,10 +296,11 @@ static int GptShow(struct drive *drive, CgptShowParams *params) {
|
|||||||
"Sec GPT table");
|
"Sec GPT table");
|
||||||
/* We show secondary table details if any of following is true.
|
/* We show secondary table details if any of following is true.
|
||||||
* 1. in debug mode.
|
* 1. in debug mode.
|
||||||
* 2. only secondary is valid.
|
* 2. primary table is being ignored
|
||||||
* 3. secondary is not identical to promary.
|
* 3. only secondary is valid.
|
||||||
|
* 4. secondary is not identical to promary.
|
||||||
*/
|
*/
|
||||||
if (params->debug ||
|
if (params->debug || (drive->gpt.ignored & MASK_PRIMARY) ||
|
||||||
((drive->gpt.valid_entries & MASK_SECONDARY) &&
|
((drive->gpt.valid_entries & MASK_SECONDARY) &&
|
||||||
(!(drive->gpt.valid_entries & MASK_PRIMARY) ||
|
(!(drive->gpt.valid_entries & MASK_PRIMARY) ||
|
||||||
memcmp(drive->gpt.primary_entries, drive->gpt.secondary_entries,
|
memcmp(drive->gpt.primary_entries, drive->gpt.secondary_entries,
|
||||||
@@ -299,16 +309,17 @@ static int GptShow(struct drive *drive, CgptShowParams *params) {
|
|||||||
EntriesDetails(drive, SECONDARY, params->numeric);
|
EntriesDetails(drive, SECONDARY, params->numeric);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (drive->gpt.valid_headers & MASK_SECONDARY)
|
if (drive->gpt.valid_headers & MASK_SECONDARY) {
|
||||||
printf(GPT_FMT, (int)(drive->gpt.gpt_drive_sectors - GPT_HEADER_SECTORS),
|
printf(GPT_FMT, (int)(drive->gpt.gpt_drive_sectors - GPT_HEADER_SECTORS),
|
||||||
(int)GPT_HEADER_SECTORS, "", "Sec GPT header");
|
(int)GPT_HEADER_SECTORS, "", "Sec GPT header");
|
||||||
else
|
} else {
|
||||||
printf(GPT_FMT, (int)GPT_PMBR_SECTORS,
|
printf(GPT_FMT, (int)GPT_PMBR_SECTORS,
|
||||||
(int)GPT_HEADER_SECTORS, "INVALID", "Sec GPT header");
|
(int)GPT_HEADER_SECTORS, "INVALID", "Sec GPT header");
|
||||||
|
}
|
||||||
/* We show secondary header if any of following is true:
|
/* We show secondary header if any of following is true:
|
||||||
* 1. in debug mode.
|
* 1. in debug mode.
|
||||||
* 2. only secondary is valid.
|
* 2. only secondary is valid.
|
||||||
* 3. secondary is not synonymous to primary.
|
* 3. secondary is not synonymous to primary and not ignored.
|
||||||
*/
|
*/
|
||||||
if (params->debug ||
|
if (params->debug ||
|
||||||
((drive->gpt.valid_headers & MASK_SECONDARY) &&
|
((drive->gpt.valid_headers & MASK_SECONDARY) &&
|
||||||
@@ -325,6 +336,7 @@ static int GptShow(struct drive *drive, CgptShowParams *params) {
|
|||||||
HeaderDetails(header, entries, indent, params->numeric);
|
HeaderDetails(header, entries, indent, params->numeric);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
CheckValid(drive);
|
CheckValid(drive);
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,9 @@
|
|||||||
/* From https://chromium-review.googlesource.com/31264 */
|
/* From https://chromium-review.googlesource.com/31264 */
|
||||||
#define GPT_HEADER_SIGNATURE2 "CHROMEOS"
|
#define GPT_HEADER_SIGNATURE2 "CHROMEOS"
|
||||||
|
|
||||||
|
/* From http://crosbug.com/p/52595 */
|
||||||
|
#define GPT_HEADER_SIGNATURE_IGNORED "IGNOREME"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The first 3 numbers should be stored in network-endian format according to
|
* The first 3 numbers should be stored in network-endian format according to
|
||||||
* the GUID RFC. The UEFI spec appendix A claims they should be stored in
|
* the GUID RFC. The UEFI spec appendix A claims they should be stored in
|
||||||
|
|||||||
@@ -108,7 +108,7 @@ typedef struct {
|
|||||||
int current_kernel;
|
int current_kernel;
|
||||||
|
|
||||||
/* Internal variables */
|
/* Internal variables */
|
||||||
uint32_t valid_headers, valid_entries;
|
uint8_t valid_headers, valid_entries, ignored;
|
||||||
int current_priority;
|
int current_priority;
|
||||||
} GptData;
|
} GptData;
|
||||||
|
|
||||||
|
|||||||
@@ -245,6 +245,7 @@ int GptSanityCheck(GptData *gpt)
|
|||||||
|
|
||||||
gpt->valid_headers = 0;
|
gpt->valid_headers = 0;
|
||||||
gpt->valid_entries = 0;
|
gpt->valid_entries = 0;
|
||||||
|
gpt->ignored = 0;
|
||||||
|
|
||||||
retval = CheckParameters(gpt);
|
retval = CheckParameters(gpt);
|
||||||
if (retval != GPT_SUCCESS)
|
if (retval != GPT_SUCCESS)
|
||||||
@@ -255,12 +256,18 @@ int GptSanityCheck(GptData *gpt)
|
|||||||
gpt->gpt_drive_sectors, gpt->flags)) {
|
gpt->gpt_drive_sectors, gpt->flags)) {
|
||||||
gpt->valid_headers |= MASK_PRIMARY;
|
gpt->valid_headers |= MASK_PRIMARY;
|
||||||
goodhdr = header1;
|
goodhdr = header1;
|
||||||
|
} else if (header1 && !Memcmp(header1->signature,
|
||||||
|
GPT_HEADER_SIGNATURE_IGNORED, GPT_HEADER_SIGNATURE_SIZE)) {
|
||||||
|
gpt->ignored |= MASK_PRIMARY;
|
||||||
}
|
}
|
||||||
if (0 == CheckHeader(header2, 1, gpt->streaming_drive_sectors,
|
if (0 == CheckHeader(header2, 1, gpt->streaming_drive_sectors,
|
||||||
gpt->gpt_drive_sectors, gpt->flags)) {
|
gpt->gpt_drive_sectors, gpt->flags)) {
|
||||||
gpt->valid_headers |= MASK_SECONDARY;
|
gpt->valid_headers |= MASK_SECONDARY;
|
||||||
if (!goodhdr)
|
if (!goodhdr)
|
||||||
goodhdr = header2;
|
goodhdr = header2;
|
||||||
|
} else if (header2 && !Memcmp(header2->signature,
|
||||||
|
GPT_HEADER_SIGNATURE_IGNORED, GPT_HEADER_SIGNATURE_SIZE)) {
|
||||||
|
gpt->ignored |= MASK_SECONDARY;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!gpt->valid_headers)
|
if (!gpt->valid_headers)
|
||||||
@@ -309,6 +316,15 @@ int GptSanityCheck(GptData *gpt)
|
|||||||
0 != HeaderFieldsSame(header1, header2))
|
0 != HeaderFieldsSame(header1, header2))
|
||||||
gpt->valid_headers &= ~MASK_SECONDARY;
|
gpt->valid_headers &= ~MASK_SECONDARY;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* When we're ignoring a GPT, make it look in memory like the other one
|
||||||
|
* and pretend that everything is fine (until we try to save).
|
||||||
|
*/
|
||||||
|
if (MASK_NONE != gpt->ignored) {
|
||||||
|
GptRepair(gpt);
|
||||||
|
gpt->modified = 0;
|
||||||
|
}
|
||||||
|
|
||||||
return GPT_SUCCESS;
|
return GPT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -28,6 +28,8 @@ int AllocAndReadGptData(VbExDiskHandle_t disk_handle, GptData *gptdata)
|
|||||||
|
|
||||||
/* No data to be written yet */
|
/* No data to be written yet */
|
||||||
gptdata->modified = 0;
|
gptdata->modified = 0;
|
||||||
|
/* This should get overwritten by GptInit() */
|
||||||
|
gptdata->ignored = 0;
|
||||||
|
|
||||||
/* Allocate all buffers */
|
/* Allocate all buffers */
|
||||||
gptdata->primary_header = (uint8_t *)VbExMalloc(gptdata->sector_bytes);
|
gptdata->primary_header = (uint8_t *)VbExMalloc(gptdata->sector_bytes);
|
||||||
@@ -67,7 +69,11 @@ int AllocAndReadGptData(VbExDiskHandle_t disk_handle, GptData *gptdata)
|
|||||||
primary_valid = 0;
|
primary_valid = 0;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
VBDEBUG(("Primary GPT header invalid!\n"));
|
VBDEBUG(("Primary GPT header is %s\n",
|
||||||
|
Memcmp(primary_header->signature,
|
||||||
|
GPT_HEADER_SIGNATURE_IGNORED,
|
||||||
|
GPT_HEADER_SIGNATURE_SIZE)
|
||||||
|
? "invalid" : "being ignored"));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Read secondary header from the end of the drive */
|
/* Read secondary header from the end of the drive */
|
||||||
@@ -96,7 +102,11 @@ int AllocAndReadGptData(VbExDiskHandle_t disk_handle, GptData *gptdata)
|
|||||||
secondary_valid = 0;
|
secondary_valid = 0;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
VBDEBUG(("Secondary GPT header invalid!\n"));
|
VBDEBUG(("Secondary GPT header is %s\n",
|
||||||
|
Memcmp(secondary_header->signature,
|
||||||
|
GPT_HEADER_SIGNATURE_IGNORED,
|
||||||
|
GPT_HEADER_SIGNATURE_SIZE)
|
||||||
|
? "invalid" : "being ignored"));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return 0 if least one GPT header was valid */
|
/* Return 0 if least one GPT header was valid */
|
||||||
@@ -110,7 +120,7 @@ int AllocAndReadGptData(VbExDiskHandle_t disk_handle, GptData *gptdata)
|
|||||||
*/
|
*/
|
||||||
int WriteAndFreeGptData(VbExDiskHandle_t disk_handle, GptData *gptdata)
|
int WriteAndFreeGptData(VbExDiskHandle_t disk_handle, GptData *gptdata)
|
||||||
{
|
{
|
||||||
int legacy = 0;
|
int skip_primary = 0;
|
||||||
GptHeader *header = (GptHeader *)gptdata->primary_header;
|
GptHeader *header = (GptHeader *)gptdata->primary_header;
|
||||||
uint64_t entries_bytes = header->number_of_entries
|
uint64_t entries_bytes = header->number_of_entries
|
||||||
* header->size_of_entry;
|
* header->size_of_entry;
|
||||||
@@ -126,19 +136,16 @@ int WriteAndFreeGptData(VbExDiskHandle_t disk_handle, GptData *gptdata)
|
|||||||
GptHeader *h = (GptHeader *)(gptdata->primary_header);
|
GptHeader *h = (GptHeader *)(gptdata->primary_header);
|
||||||
entries_lba = h->entries_lba;
|
entries_lba = h->entries_lba;
|
||||||
|
|
||||||
/*
|
if (gptdata->ignored & MASK_PRIMARY) {
|
||||||
* Avoid even looking at this data if we don't need to. We
|
VBDEBUG(("Not updating primary GPT: "
|
||||||
* may in fact not have read it from disk if the read failed,
|
"marked to be ignored.\n"));
|
||||||
* and this avoids a valgrind complaint.
|
skip_primary = 1;
|
||||||
*/
|
} else if (gptdata->modified & GPT_MODIFIED_HEADER1) {
|
||||||
if (gptdata->modified) {
|
if (!Memcmp(h->signature, GPT_HEADER_SIGNATURE2,
|
||||||
legacy = !Memcmp(h->signature, GPT_HEADER_SIGNATURE2,
|
GPT_HEADER_SIGNATURE_SIZE)) {
|
||||||
GPT_HEADER_SIGNATURE_SIZE);
|
VBDEBUG(("Not updating primary GPT: "
|
||||||
}
|
|
||||||
if (gptdata->modified & GPT_MODIFIED_HEADER1) {
|
|
||||||
if (legacy) {
|
|
||||||
VBDEBUG(("Not updating GPT header 1: "
|
|
||||||
"legacy mode is enabled.\n"));
|
"legacy mode is enabled.\n"));
|
||||||
|
skip_primary = 1;
|
||||||
} else {
|
} else {
|
||||||
VBDEBUG(("Updating GPT header 1\n"));
|
VBDEBUG(("Updating GPT header 1\n"));
|
||||||
if (0 != VbExDiskWrite(disk_handle, 1, 1,
|
if (0 != VbExDiskWrite(disk_handle, 1, 1,
|
||||||
@@ -148,12 +155,8 @@ int WriteAndFreeGptData(VbExDiskHandle_t disk_handle, GptData *gptdata)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gptdata->primary_entries) {
|
if (gptdata->primary_entries && !skip_primary) {
|
||||||
if (gptdata->modified & GPT_MODIFIED_ENTRIES1) {
|
if (gptdata->modified & GPT_MODIFIED_ENTRIES1) {
|
||||||
if (legacy) {
|
|
||||||
VBDEBUG(("Not updating GPT entries 1: "
|
|
||||||
"legacy mode is enabled.\n"));
|
|
||||||
} else {
|
|
||||||
VBDEBUG(("Updating GPT entries 1\n"));
|
VBDEBUG(("Updating GPT entries 1\n"));
|
||||||
if (0 != VbExDiskWrite(disk_handle, entries_lba,
|
if (0 != VbExDiskWrite(disk_handle, entries_lba,
|
||||||
entries_sectors,
|
entries_sectors,
|
||||||
@@ -161,15 +164,14 @@ int WriteAndFreeGptData(VbExDiskHandle_t disk_handle, GptData *gptdata)
|
|||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
entries_lba = (gptdata->gpt_drive_sectors - entries_sectors -
|
entries_lba = (gptdata->gpt_drive_sectors - entries_sectors -
|
||||||
GPT_HEADER_SECTORS);
|
GPT_HEADER_SECTORS);
|
||||||
if (gptdata->secondary_header) {
|
if (gptdata->secondary_header && !(gptdata->ignored & MASK_SECONDARY)) {
|
||||||
GptHeader *h = (GptHeader *)(gptdata->secondary_header);
|
GptHeader *h = (GptHeader *)(gptdata->secondary_header);
|
||||||
entries_lba = h->entries_lba;
|
entries_lba = h->entries_lba;
|
||||||
if (gptdata->modified & GPT_MODIFIED_HEADER2) {
|
if (gptdata->modified & GPT_MODIFIED_HEADER2) {
|
||||||
VBDEBUG(("Updating GPT entries 2\n"));
|
VBDEBUG(("Updating GPT header 2\n"));
|
||||||
if (0 != VbExDiskWrite(disk_handle,
|
if (0 != VbExDiskWrite(disk_handle,
|
||||||
gptdata->gpt_drive_sectors - 1, 1,
|
gptdata->gpt_drive_sectors - 1, 1,
|
||||||
gptdata->secondary_header))
|
gptdata->secondary_header))
|
||||||
@@ -177,9 +179,9 @@ int WriteAndFreeGptData(VbExDiskHandle_t disk_handle, GptData *gptdata)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gptdata->secondary_entries) {
|
if (gptdata->secondary_entries && !(gptdata->ignored & MASK_SECONDARY)){
|
||||||
if (gptdata->modified & GPT_MODIFIED_ENTRIES2) {
|
if (gptdata->modified & GPT_MODIFIED_ENTRIES2) {
|
||||||
VBDEBUG(("Updating GPT header 2\n"));
|
VBDEBUG(("Updating GPT entries 2\n"));
|
||||||
if (0 != VbExDiskWrite(disk_handle,
|
if (0 != VbExDiskWrite(disk_handle,
|
||||||
entries_lba, entries_sectors,
|
entries_lba, entries_sectors,
|
||||||
gptdata->secondary_entries))
|
gptdata->secondary_entries))
|
||||||
|
|||||||
@@ -827,6 +827,7 @@ static int SanityCheckTest(void)
|
|||||||
{
|
{
|
||||||
GptData *gpt = GetEmptyGptData();
|
GptData *gpt = GetEmptyGptData();
|
||||||
GptHeader *h1 = (GptHeader *)gpt->primary_header;
|
GptHeader *h1 = (GptHeader *)gpt->primary_header;
|
||||||
|
GptHeader *h2 = (GptHeader *)gpt->secondary_header;
|
||||||
GptEntry *e1 = (GptEntry *)gpt->primary_entries;
|
GptEntry *e1 = (GptEntry *)gpt->primary_entries;
|
||||||
uint8_t *tempptr;
|
uint8_t *tempptr;
|
||||||
|
|
||||||
@@ -835,11 +836,13 @@ static int SanityCheckTest(void)
|
|||||||
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
||||||
EXPECT(MASK_BOTH == gpt->valid_headers);
|
EXPECT(MASK_BOTH == gpt->valid_headers);
|
||||||
EXPECT(MASK_BOTH == gpt->valid_entries);
|
EXPECT(MASK_BOTH == gpt->valid_entries);
|
||||||
|
EXPECT(MASK_NONE == gpt->ignored);
|
||||||
/* Repair doesn't damage it */
|
/* Repair doesn't damage it */
|
||||||
GptRepair(gpt);
|
GptRepair(gpt);
|
||||||
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
||||||
EXPECT(MASK_BOTH == gpt->valid_headers);
|
EXPECT(MASK_BOTH == gpt->valid_headers);
|
||||||
EXPECT(MASK_BOTH == gpt->valid_entries);
|
EXPECT(MASK_BOTH == gpt->valid_entries);
|
||||||
|
EXPECT(0 == gpt->ignored);
|
||||||
EXPECT(0 == gpt->modified);
|
EXPECT(0 == gpt->modified);
|
||||||
|
|
||||||
/* Invalid sector size should fail */
|
/* Invalid sector size should fail */
|
||||||
@@ -854,11 +857,13 @@ static int SanityCheckTest(void)
|
|||||||
EXPECT(GPT_ERROR_INVALID_HEADERS == GptSanityCheck(gpt));
|
EXPECT(GPT_ERROR_INVALID_HEADERS == GptSanityCheck(gpt));
|
||||||
EXPECT(0 == gpt->valid_headers);
|
EXPECT(0 == gpt->valid_headers);
|
||||||
EXPECT(0 == gpt->valid_entries);
|
EXPECT(0 == gpt->valid_entries);
|
||||||
|
EXPECT(0 == gpt->ignored);
|
||||||
/* Repair can't fix completely busted headers */
|
/* Repair can't fix completely busted headers */
|
||||||
GptRepair(gpt);
|
GptRepair(gpt);
|
||||||
EXPECT(GPT_ERROR_INVALID_HEADERS == GptSanityCheck(gpt));
|
EXPECT(GPT_ERROR_INVALID_HEADERS == GptSanityCheck(gpt));
|
||||||
EXPECT(0 == gpt->valid_headers);
|
EXPECT(0 == gpt->valid_headers);
|
||||||
EXPECT(0 == gpt->valid_entries);
|
EXPECT(0 == gpt->valid_entries);
|
||||||
|
EXPECT(0 == gpt->ignored);
|
||||||
EXPECT(0 == gpt->modified);
|
EXPECT(0 == gpt->modified);
|
||||||
|
|
||||||
BuildTestGptData(gpt);
|
BuildTestGptData(gpt);
|
||||||
@@ -866,10 +871,12 @@ static int SanityCheckTest(void)
|
|||||||
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
||||||
EXPECT(MASK_SECONDARY == gpt->valid_headers);
|
EXPECT(MASK_SECONDARY == gpt->valid_headers);
|
||||||
EXPECT(MASK_BOTH == gpt->valid_entries);
|
EXPECT(MASK_BOTH == gpt->valid_entries);
|
||||||
|
EXPECT(0 == gpt->ignored);
|
||||||
GptRepair(gpt);
|
GptRepair(gpt);
|
||||||
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
||||||
EXPECT(MASK_BOTH == gpt->valid_headers);
|
EXPECT(MASK_BOTH == gpt->valid_headers);
|
||||||
EXPECT(MASK_BOTH == gpt->valid_entries);
|
EXPECT(MASK_BOTH == gpt->valid_entries);
|
||||||
|
EXPECT(0 == gpt->ignored);
|
||||||
EXPECT(GPT_MODIFIED_HEADER1 == gpt->modified);
|
EXPECT(GPT_MODIFIED_HEADER1 == gpt->modified);
|
||||||
|
|
||||||
BuildTestGptData(gpt);
|
BuildTestGptData(gpt);
|
||||||
@@ -877,10 +884,12 @@ static int SanityCheckTest(void)
|
|||||||
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
||||||
EXPECT(MASK_PRIMARY == gpt->valid_headers);
|
EXPECT(MASK_PRIMARY == gpt->valid_headers);
|
||||||
EXPECT(MASK_BOTH == gpt->valid_entries);
|
EXPECT(MASK_BOTH == gpt->valid_entries);
|
||||||
|
EXPECT(0 == gpt->ignored);
|
||||||
GptRepair(gpt);
|
GptRepair(gpt);
|
||||||
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
||||||
EXPECT(MASK_BOTH == gpt->valid_headers);
|
EXPECT(MASK_BOTH == gpt->valid_headers);
|
||||||
EXPECT(MASK_BOTH == gpt->valid_entries);
|
EXPECT(MASK_BOTH == gpt->valid_entries);
|
||||||
|
EXPECT(0 == gpt->ignored);
|
||||||
EXPECT(GPT_MODIFIED_HEADER2 == gpt->modified);
|
EXPECT(GPT_MODIFIED_HEADER2 == gpt->modified);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -893,10 +902,12 @@ static int SanityCheckTest(void)
|
|||||||
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
||||||
EXPECT(MASK_PRIMARY == gpt->valid_headers);
|
EXPECT(MASK_PRIMARY == gpt->valid_headers);
|
||||||
EXPECT(MASK_BOTH == gpt->valid_entries);
|
EXPECT(MASK_BOTH == gpt->valid_entries);
|
||||||
|
EXPECT(0 == gpt->ignored);
|
||||||
GptRepair(gpt);
|
GptRepair(gpt);
|
||||||
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
||||||
EXPECT(MASK_BOTH == gpt->valid_headers);
|
EXPECT(MASK_BOTH == gpt->valid_headers);
|
||||||
EXPECT(MASK_BOTH == gpt->valid_entries);
|
EXPECT(MASK_BOTH == gpt->valid_entries);
|
||||||
|
EXPECT(0 == gpt->ignored);
|
||||||
EXPECT(GPT_MODIFIED_HEADER2 == gpt->modified);
|
EXPECT(GPT_MODIFIED_HEADER2 == gpt->modified);
|
||||||
|
|
||||||
/* Modify entries */
|
/* Modify entries */
|
||||||
@@ -906,11 +917,13 @@ static int SanityCheckTest(void)
|
|||||||
EXPECT(GPT_ERROR_INVALID_ENTRIES == GptSanityCheck(gpt));
|
EXPECT(GPT_ERROR_INVALID_ENTRIES == GptSanityCheck(gpt));
|
||||||
EXPECT(MASK_BOTH == gpt->valid_headers);
|
EXPECT(MASK_BOTH == gpt->valid_headers);
|
||||||
EXPECT(MASK_NONE == gpt->valid_entries);
|
EXPECT(MASK_NONE == gpt->valid_entries);
|
||||||
|
EXPECT(0 == gpt->ignored);
|
||||||
/* Repair can't fix both copies of entries being bad, either. */
|
/* Repair can't fix both copies of entries being bad, either. */
|
||||||
GptRepair(gpt);
|
GptRepair(gpt);
|
||||||
EXPECT(GPT_ERROR_INVALID_ENTRIES == GptSanityCheck(gpt));
|
EXPECT(GPT_ERROR_INVALID_ENTRIES == GptSanityCheck(gpt));
|
||||||
EXPECT(MASK_BOTH == gpt->valid_headers);
|
EXPECT(MASK_BOTH == gpt->valid_headers);
|
||||||
EXPECT(MASK_NONE == gpt->valid_entries);
|
EXPECT(MASK_NONE == gpt->valid_entries);
|
||||||
|
EXPECT(0 == gpt->ignored);
|
||||||
EXPECT(0 == gpt->modified);
|
EXPECT(0 == gpt->modified);
|
||||||
|
|
||||||
BuildTestGptData(gpt);
|
BuildTestGptData(gpt);
|
||||||
@@ -918,10 +931,12 @@ static int SanityCheckTest(void)
|
|||||||
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
||||||
EXPECT(MASK_BOTH == gpt->valid_headers);
|
EXPECT(MASK_BOTH == gpt->valid_headers);
|
||||||
EXPECT(MASK_SECONDARY == gpt->valid_entries);
|
EXPECT(MASK_SECONDARY == gpt->valid_entries);
|
||||||
|
EXPECT(0 == gpt->ignored);
|
||||||
GptRepair(gpt);
|
GptRepair(gpt);
|
||||||
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
||||||
EXPECT(MASK_BOTH == gpt->valid_headers);
|
EXPECT(MASK_BOTH == gpt->valid_headers);
|
||||||
EXPECT(MASK_BOTH == gpt->valid_entries);
|
EXPECT(MASK_BOTH == gpt->valid_entries);
|
||||||
|
EXPECT(0 == gpt->ignored);
|
||||||
EXPECT(GPT_MODIFIED_ENTRIES1 == gpt->modified);
|
EXPECT(GPT_MODIFIED_ENTRIES1 == gpt->modified);
|
||||||
|
|
||||||
BuildTestGptData(gpt);
|
BuildTestGptData(gpt);
|
||||||
@@ -929,10 +944,12 @@ static int SanityCheckTest(void)
|
|||||||
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
||||||
EXPECT(MASK_BOTH == gpt->valid_headers);
|
EXPECT(MASK_BOTH == gpt->valid_headers);
|
||||||
EXPECT(MASK_PRIMARY == gpt->valid_entries);
|
EXPECT(MASK_PRIMARY == gpt->valid_entries);
|
||||||
|
EXPECT(0 == gpt->ignored);
|
||||||
GptRepair(gpt);
|
GptRepair(gpt);
|
||||||
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
||||||
EXPECT(MASK_BOTH == gpt->valid_headers);
|
EXPECT(MASK_BOTH == gpt->valid_headers);
|
||||||
EXPECT(MASK_BOTH == gpt->valid_entries);
|
EXPECT(MASK_BOTH == gpt->valid_entries);
|
||||||
|
EXPECT(0 == gpt->ignored);
|
||||||
EXPECT(GPT_MODIFIED_ENTRIES2 == gpt->modified);
|
EXPECT(GPT_MODIFIED_ENTRIES2 == gpt->modified);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -949,6 +966,7 @@ static int SanityCheckTest(void)
|
|||||||
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
||||||
EXPECT(MASK_SECONDARY == gpt->valid_headers);
|
EXPECT(MASK_SECONDARY == gpt->valid_headers);
|
||||||
EXPECT(MASK_BOTH == gpt->valid_entries);
|
EXPECT(MASK_BOTH == gpt->valid_entries);
|
||||||
|
EXPECT(0 == gpt->ignored);
|
||||||
gpt->primary_entries = tempptr;
|
gpt->primary_entries = tempptr;
|
||||||
|
|
||||||
/* Modify both header and entries */
|
/* Modify both header and entries */
|
||||||
@@ -958,10 +976,12 @@ static int SanityCheckTest(void)
|
|||||||
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
||||||
EXPECT(MASK_SECONDARY == gpt->valid_headers);
|
EXPECT(MASK_SECONDARY == gpt->valid_headers);
|
||||||
EXPECT(MASK_SECONDARY == gpt->valid_entries);
|
EXPECT(MASK_SECONDARY == gpt->valid_entries);
|
||||||
|
EXPECT(0 == gpt->ignored);
|
||||||
GptRepair(gpt);
|
GptRepair(gpt);
|
||||||
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
||||||
EXPECT(MASK_BOTH == gpt->valid_headers);
|
EXPECT(MASK_BOTH == gpt->valid_headers);
|
||||||
EXPECT(MASK_BOTH == gpt->valid_entries);
|
EXPECT(MASK_BOTH == gpt->valid_entries);
|
||||||
|
EXPECT(0 == gpt->ignored);
|
||||||
EXPECT((GPT_MODIFIED_HEADER1 | GPT_MODIFIED_ENTRIES1) == gpt->modified);
|
EXPECT((GPT_MODIFIED_HEADER1 | GPT_MODIFIED_ENTRIES1) == gpt->modified);
|
||||||
|
|
||||||
BuildTestGptData(gpt);
|
BuildTestGptData(gpt);
|
||||||
@@ -970,10 +990,12 @@ static int SanityCheckTest(void)
|
|||||||
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
||||||
EXPECT(MASK_PRIMARY == gpt->valid_headers);
|
EXPECT(MASK_PRIMARY == gpt->valid_headers);
|
||||||
EXPECT(MASK_PRIMARY == gpt->valid_entries);
|
EXPECT(MASK_PRIMARY == gpt->valid_entries);
|
||||||
|
EXPECT(0 == gpt->ignored);
|
||||||
GptRepair(gpt);
|
GptRepair(gpt);
|
||||||
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
||||||
EXPECT(MASK_BOTH == gpt->valid_headers);
|
EXPECT(MASK_BOTH == gpt->valid_headers);
|
||||||
EXPECT(MASK_BOTH == gpt->valid_entries);
|
EXPECT(MASK_BOTH == gpt->valid_entries);
|
||||||
|
EXPECT(0 == gpt->ignored);
|
||||||
EXPECT((GPT_MODIFIED_HEADER2 | GPT_MODIFIED_ENTRIES2) == gpt->modified);
|
EXPECT((GPT_MODIFIED_HEADER2 | GPT_MODIFIED_ENTRIES2) == gpt->modified);
|
||||||
|
|
||||||
/* Test cross-correction (h1+e2, h2+e1) */
|
/* Test cross-correction (h1+e2, h2+e1) */
|
||||||
@@ -983,10 +1005,12 @@ static int SanityCheckTest(void)
|
|||||||
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
||||||
EXPECT(MASK_SECONDARY == gpt->valid_headers);
|
EXPECT(MASK_SECONDARY == gpt->valid_headers);
|
||||||
EXPECT(MASK_PRIMARY == gpt->valid_entries);
|
EXPECT(MASK_PRIMARY == gpt->valid_entries);
|
||||||
|
EXPECT(0 == gpt->ignored);
|
||||||
GptRepair(gpt);
|
GptRepair(gpt);
|
||||||
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
||||||
EXPECT(MASK_BOTH == gpt->valid_headers);
|
EXPECT(MASK_BOTH == gpt->valid_headers);
|
||||||
EXPECT(MASK_BOTH == gpt->valid_entries);
|
EXPECT(MASK_BOTH == gpt->valid_entries);
|
||||||
|
EXPECT(0 == gpt->ignored);
|
||||||
EXPECT((GPT_MODIFIED_HEADER1 | GPT_MODIFIED_ENTRIES2) == gpt->modified);
|
EXPECT((GPT_MODIFIED_HEADER1 | GPT_MODIFIED_ENTRIES2) == gpt->modified);
|
||||||
|
|
||||||
BuildTestGptData(gpt);
|
BuildTestGptData(gpt);
|
||||||
@@ -995,10 +1019,12 @@ static int SanityCheckTest(void)
|
|||||||
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
||||||
EXPECT(MASK_PRIMARY == gpt->valid_headers);
|
EXPECT(MASK_PRIMARY == gpt->valid_headers);
|
||||||
EXPECT(MASK_SECONDARY == gpt->valid_entries);
|
EXPECT(MASK_SECONDARY == gpt->valid_entries);
|
||||||
|
EXPECT(0 == gpt->ignored);
|
||||||
GptRepair(gpt);
|
GptRepair(gpt);
|
||||||
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
||||||
EXPECT(MASK_BOTH == gpt->valid_headers);
|
EXPECT(MASK_BOTH == gpt->valid_headers);
|
||||||
EXPECT(MASK_BOTH == gpt->valid_entries);
|
EXPECT(MASK_BOTH == gpt->valid_entries);
|
||||||
|
EXPECT(0 == gpt->ignored);
|
||||||
EXPECT((GPT_MODIFIED_HEADER2 | GPT_MODIFIED_ENTRIES1) == gpt->modified);
|
EXPECT((GPT_MODIFIED_HEADER2 | GPT_MODIFIED_ENTRIES1) == gpt->modified);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1011,35 +1037,90 @@ static int SanityCheckTest(void)
|
|||||||
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
||||||
EXPECT(MASK_PRIMARY == gpt->valid_headers);
|
EXPECT(MASK_PRIMARY == gpt->valid_headers);
|
||||||
EXPECT(MASK_PRIMARY == gpt->valid_entries);
|
EXPECT(MASK_PRIMARY == gpt->valid_entries);
|
||||||
|
EXPECT(0 == gpt->ignored);
|
||||||
GptRepair(gpt);
|
GptRepair(gpt);
|
||||||
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
||||||
EXPECT(MASK_BOTH == gpt->valid_headers);
|
EXPECT(MASK_BOTH == gpt->valid_headers);
|
||||||
EXPECT(MASK_BOTH == gpt->valid_entries);
|
EXPECT(MASK_BOTH == gpt->valid_entries);
|
||||||
|
EXPECT(0 == gpt->ignored);
|
||||||
EXPECT((GPT_MODIFIED_HEADER2 | GPT_MODIFIED_ENTRIES2) == gpt->modified);
|
EXPECT((GPT_MODIFIED_HEADER2 | GPT_MODIFIED_ENTRIES2) == gpt->modified);
|
||||||
|
|
||||||
/* Test unloaded entry array. */
|
/* Test unloaded entry array. */
|
||||||
gpt = GetEmptyGptData();
|
|
||||||
BuildTestGptData(gpt);
|
BuildTestGptData(gpt);
|
||||||
gpt->primary_entries = NULL;
|
gpt->primary_entries = NULL;
|
||||||
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
||||||
EXPECT(MASK_SECONDARY == gpt->valid_entries);
|
EXPECT(MASK_SECONDARY == gpt->valid_entries);
|
||||||
|
EXPECT(0 == gpt->ignored);
|
||||||
gpt = GetEmptyGptData();
|
gpt = GetEmptyGptData();
|
||||||
BuildTestGptData(gpt);
|
BuildTestGptData(gpt);
|
||||||
gpt->secondary_entries = NULL;
|
gpt->secondary_entries = NULL;
|
||||||
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
||||||
EXPECT(MASK_PRIMARY == gpt->valid_entries);
|
EXPECT(MASK_PRIMARY == gpt->valid_entries);
|
||||||
|
EXPECT(0 == gpt->ignored);
|
||||||
|
gpt = GetEmptyGptData();
|
||||||
|
|
||||||
/* Test unloaded header. */
|
/* Test unloaded header. */
|
||||||
gpt = GetEmptyGptData();
|
|
||||||
BuildTestGptData(gpt);
|
BuildTestGptData(gpt);
|
||||||
gpt->primary_header = NULL;
|
gpt->primary_header = NULL;
|
||||||
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
||||||
EXPECT(MASK_SECONDARY == gpt->valid_headers);
|
EXPECT(MASK_SECONDARY == gpt->valid_headers);
|
||||||
|
EXPECT(0 == gpt->ignored);
|
||||||
gpt = GetEmptyGptData();
|
gpt = GetEmptyGptData();
|
||||||
BuildTestGptData(gpt);
|
BuildTestGptData(gpt);
|
||||||
gpt->secondary_header = NULL;
|
gpt->secondary_header = NULL;
|
||||||
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
||||||
EXPECT(MASK_PRIMARY == gpt->valid_headers);
|
EXPECT(MASK_PRIMARY == gpt->valid_headers);
|
||||||
|
EXPECT(0 == gpt->ignored);
|
||||||
|
gpt = GetEmptyGptData();
|
||||||
|
|
||||||
|
/* Test correct recognition of IGNOREME in primary GPT. */
|
||||||
|
BuildTestGptData(gpt);
|
||||||
|
Memset(gpt->primary_entries, 0, PARTITION_ENTRIES_SIZE);
|
||||||
|
Memset(gpt->primary_header, 0, sizeof(GptHeader));
|
||||||
|
Memcpy(h1->signature, GPT_HEADER_SIGNATURE_IGNORED,
|
||||||
|
GPT_HEADER_SIGNATURE_SIZE);
|
||||||
|
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
||||||
|
EXPECT(MASK_BOTH == gpt->valid_headers);
|
||||||
|
EXPECT(MASK_BOTH == gpt->valid_entries);
|
||||||
|
EXPECT(MASK_PRIMARY == gpt->ignored);
|
||||||
|
EXPECT(0 == gpt->modified);
|
||||||
|
|
||||||
|
/* Test correct recognition of IGNOREME in secondary GPT. */
|
||||||
|
BuildTestGptData(gpt);
|
||||||
|
Memset(gpt->secondary_entries, 0, PARTITION_ENTRIES_SIZE);
|
||||||
|
Memset(gpt->secondary_header, 0, sizeof(GptHeader));
|
||||||
|
Memcpy(h2->signature, GPT_HEADER_SIGNATURE_IGNORED,
|
||||||
|
GPT_HEADER_SIGNATURE_SIZE);
|
||||||
|
EXPECT(GPT_SUCCESS == GptSanityCheck(gpt));
|
||||||
|
EXPECT(MASK_BOTH == gpt->valid_headers);
|
||||||
|
EXPECT(MASK_BOTH == gpt->valid_entries);
|
||||||
|
EXPECT(MASK_SECONDARY == gpt->ignored);
|
||||||
|
EXPECT(0 == gpt->modified);
|
||||||
|
|
||||||
|
/* Test that two IGNOREME GPTs are invalid. */
|
||||||
|
ZeroHeadersEntries(gpt);
|
||||||
|
Memcpy(h1->signature, GPT_HEADER_SIGNATURE_IGNORED,
|
||||||
|
GPT_HEADER_SIGNATURE_SIZE);
|
||||||
|
Memcpy(h2->signature, GPT_HEADER_SIGNATURE_IGNORED,
|
||||||
|
GPT_HEADER_SIGNATURE_SIZE);
|
||||||
|
EXPECT(GPT_ERROR_INVALID_HEADERS == GptSanityCheck(gpt));
|
||||||
|
EXPECT(0 == gpt->valid_headers);
|
||||||
|
EXPECT(0 == gpt->valid_entries);
|
||||||
|
EXPECT(MASK_BOTH == gpt->ignored);
|
||||||
|
EXPECT(0 == gpt->modified);
|
||||||
|
|
||||||
|
/* Test that one IGNOREME GPT and one corrupted one are invalid. */
|
||||||
|
BuildTestGptData(gpt);
|
||||||
|
Memset(gpt->primary_entries, 0, PARTITION_ENTRIES_SIZE);
|
||||||
|
Memset(gpt->primary_header, 0, sizeof(GptHeader));
|
||||||
|
Memcpy(h1->signature, GPT_HEADER_SIGNATURE_IGNORED,
|
||||||
|
GPT_HEADER_SIGNATURE_SIZE);
|
||||||
|
gpt->secondary_entries[0]++;
|
||||||
|
EXPECT(GPT_ERROR_INVALID_ENTRIES == GptSanityCheck(gpt));
|
||||||
|
EXPECT(MASK_SECONDARY == gpt->valid_headers);
|
||||||
|
EXPECT(0 == gpt->valid_entries);
|
||||||
|
EXPECT(MASK_PRIMARY == gpt->ignored);
|
||||||
|
EXPECT(0 == gpt->modified);
|
||||||
|
|
||||||
return TEST_OK;
|
return TEST_OK;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user