From: Michael Gernoth Date: Sun, 1 Feb 2009 12:21:32 +0000 (+0100) Subject: don't ever update the checksum of a corrupt image X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/rsbs2/commitdiff_plain/8658e9676d6d4923546f0eab70a4e4527d5fcde0?ds=inline don't ever update the checksum of a corrupt image --- diff --git a/extract.c b/extract.c index 86491d1..784821b 100644 --- a/extract.c +++ b/extract.c @@ -22,7 +22,9 @@ struct file_entry* get_next_file(unsigned char *fw, int len) if (fw != NULL && len != 0) { pos = fw + 0x28; +#if 0 printf("Start of filesystem: 0x%08x\n", *((unsigned int*)pos)); +#endif pos = fw + *((unsigned int*)pos); end = fw + len; } @@ -38,7 +40,9 @@ struct file_entry* get_next_file(unsigned char *fw, int len) if ((fent.length > (end - pos)) || (name_length > (end - pos))) { +#if 0 printf("EOF reached\n"); +#endif return NULL; } diff --git a/firmware.c b/firmware.c index cd7927b..e73d7cc 100644 --- a/firmware.c +++ b/firmware.c @@ -466,6 +466,20 @@ int main(int argc, char **argv) } if (update_crc || patch_fw || patch_bd) { + struct file_entry *fent; + char *last_name = NULL; + + fent = get_next_file(fw, statbuf.st_size - 4); + while (fent != NULL) { + last_name = fent->name; + fent = get_next_file(NULL, 0); + } + + if (strcmp(last_name, "pdata")) { + fprintf(stderr, "corrupt firmware image found (pdata is not last entry, aborting!\n"); + exit(1); + } + ret = rsb_crc2(fw, statbuf.st_size, 0x55335053, &crc); if (ret == 4) { *((unsigned int*)(fw + statbuf.st_size - 4)) = crc;