diff --git a/libmineziper/include/libmineziper_zip.h b/libmineziper/include/libmineziper_zip.h index de47035..86dc934 100644 --- a/libmineziper/include/libmineziper_zip.h +++ b/libmineziper/include/libmineziper_zip.h @@ -86,6 +86,8 @@ typedef struct zip char* cd; CDH** cdh; LFH** lfh; + unsigned int* lfh_off; + unsigned int entries; EOCD* eocd; } zip; diff --git a/libmineziper/src/libmineziper_zip.c b/libmineziper/src/libmineziper_zip.c index 184c4d7..60893dc 100644 --- a/libmineziper/src/libmineziper_zip.c +++ b/libmineziper/src/libmineziper_zip.c @@ -16,8 +16,20 @@ void get_eocd(char* data, int size, zip* out) if (strcmp(se, EOCD_SIG) == 0) { out->eocd = (EOCD*) se; - out->cdh = (CDH**) malloc(out->eocd->number_of_entries * sizeof(CDH*)); - out->lfh = (LFH**) malloc(out->eocd->number_of_entries * sizeof(LFH*)); + out->entries = out->eocd->number_of_entries; + + out->cdh = (CDH**) malloc(out->entries * sizeof(CDH*)); + out->lfh = (LFH**) malloc(out->entries * sizeof(LFH*)); + out->lfh_off = malloc(out->entries * sizeof(int)); + + if (!out->cdh || !out->lfh || !out->lfh_off) + { + printf( + "[ERROR] Failed to allocate CDH/LFH buffer for %d entries\n", + out->entries); + exit(1); + } + break; } @@ -41,6 +53,8 @@ void get_cdh(char* data, zip* out) out->cdh[i] = cdh; out->lfh[i] = (LFH*) (data + cdh->off_lfh); + out->lfh_off[i] = cdh->off_lfh; + cdh = (CDH*) (((char*) cdh) + sizeof(CDH) + cdh->filename_length + cdh->extraf_length + cdh->file_comment_length); }