/* NB: does not preserve file position! */ static uint32_t find_cdf_offset(void) { cde_header_t cde_header; unsigned char *p; off_t end; unsigned char *buf = xzalloc(PEEK_FROM_END); end = xlseek(zip_fd, 0, SEEK_END); end -= PEEK_FROM_END; if (end < 0) end = 0; xlseek(zip_fd, end, SEEK_SET); full_read(zip_fd, buf, PEEK_FROM_END); p = buf; while (p <= buf + PEEK_FROM_END - CDE_HEADER_LEN - 4) { if (*p != 'P') { p++; continue; } if (*++p != 'K') continue; if (*++p != 5) continue; if (*++p != 6) continue; /* we found CDE! */ memcpy(cde_header.raw, p + 1, CDE_HEADER_LEN); FIX_ENDIANNESS_CDE(cde_header); free(buf); return cde_header.formatted.cdf_offset; } //free(buf); bb_error_msg_and_die("can't find file table"); };
/* NB: does not preserve file position! */ static uint32_t find_cdf_offset(void) { cde_header_t cde_header; unsigned char *p; off_t end; unsigned char *buf = xzalloc(PEEK_FROM_END); end = xlseek(zip_fd, 0, SEEK_END); end -= PEEK_FROM_END; if (end < 0) end = 0; xlseek(zip_fd, end, SEEK_SET); full_read(zip_fd, buf, PEEK_FROM_END); cde_header.formatted.cdf_offset = BAD_CDF_OFFSET; p = buf; while (p <= buf + PEEK_FROM_END - CDE_HEADER_LEN - 4) { if (*p != 'P') { p++; continue; } if (*++p != 'K') continue; if (*++p != 5) continue; if (*++p != 6) continue; /* we found CDE! */ memcpy(cde_header.raw, p + 1, CDE_HEADER_LEN); FIX_ENDIANNESS_CDE(cde_header); /* * I've seen .ZIP files with seemingly valid CDEs * where cdf_offset points past EOF - ?? * Ignore such CDEs: */ if (cde_header.formatted.cdf_offset < end + (p - buf)) break; cde_header.formatted.cdf_offset = BAD_CDF_OFFSET; } free(buf); return cde_header.formatted.cdf_offset; };