diff --git a/common.c b/common.c index aa32371..69794a4 100644 --- a/common.c +++ b/common.c @@ -74,7 +74,7 @@ void free_file_index(void) { gFileIndex = gLastFile = NULL; } -void read_file_index(void) { +bool read_file_index(void) { // find the last block lzma_index_iter iter; lzma_index_iter_init(&iter, gIndex); @@ -86,6 +86,14 @@ void read_file_index(void) { gFileIndexBuf = malloc(gFIBSize); gStream.avail_out = gFIBSize; gStream.avail_in = 0; + + // Check if this is really an index + read_file_index_data(); + if (xle64dec(gFileIndexBuf + gFIBPos) != PIXZ_INDEX_MAGIC) { + gLastFile = gFileIndex = NULL; + return false; + } + while (true) { char *name = read_file_index_name(); if (!name) @@ -106,6 +114,8 @@ void read_file_index(void) { free(gFileIndexBuf); lzma_end(&gStream); free(bdata); + + return true; } static char *read_file_index_name(void) { diff --git a/list.c b/list.c index c1f60f2..0da3e99 100644 --- a/list.c +++ b/list.c @@ -7,19 +7,6 @@ int main(int argc, char **argv) { char *progname = argv[0]; - int ch; - bool tar = false; - while ((ch = getopt(argc, argv, "t")) != -1) { - switch (ch) { - case 't': - tar = true; - break; - default: - die("Unknown option"); - } - } - argc -= optind - 1; - argv += optind - 1; if (argc != 2) die("Usage: %s [-t] file", progname); @@ -35,9 +22,8 @@ int main(int argc, char **argv) { (uintmax_t)iter.block.uncompressed_size); } - if (tar) { + if (read_file_index()) { fprintf(stderr, "\n"); - read_file_index(); dump_file_index(); free_file_index(); } diff --git a/pixz.h b/pixz.h index fd4f3cd..050e831 100644 --- a/pixz.h +++ b/pixz.h @@ -13,6 +13,8 @@ #pragma mark DEFINES +#define PIXZ_INDEX_MAGIC 0xDBAE14D62E324CA6LL + #define CHECK LZMA_CHECK_CRC32 #define MEMLIMIT (64L * 1024 * 1024 * 1024) // crazy high @@ -70,7 +72,7 @@ size_t num_threads(void); void decode_index(void); void *decode_block_start(off_t block_seek); -void read_file_index(void); +bool read_file_index(void); void dump_file_index(void); void free_file_index(void); diff --git a/read.c b/read.c index 2ac2fc6..ec56762 100644 --- a/read.c +++ b/read.c @@ -17,7 +17,8 @@ int main(int argc, char **argv) { char *target = argv[2]; decode_index(); - read_file_index(); + if (!read_file_index()) + die("File has no index"); extract_file(target); diff --git a/write.c b/write.c index e7e2c36..857fa7b 100644 --- a/write.c +++ b/write.c @@ -435,7 +435,9 @@ static void write_file_index(void) { if (lzma_block_encoder(&gStream, &block) != LZMA_OK) die("Error creating file index encoder"); - uint8_t offbuf[sizeof(uint64_t)]; + uint8_t offbuf[sizeof(uint64_t)]; + xle64enc(offbuf, PIXZ_INDEX_MAGIC); + write_file_index_bytes(sizeof(offbuf), offbuf); for (file_index_t *f = gFileIndex; f != NULL; f = f->next) { char *name = f->name ? f->name : ""; size_t len = strlen(name);