struct file_entry* get_next_file(unsigned char *fw, int len)
{
static unsigned char *pos;
+ static unsigned char *start;
static unsigned char *end;
static struct file_entry fent;
int name_length;
if (fw != NULL && len != 0) {
pos = fw + 0x28;
+#if 0
printf("Start of filesystem: 0x%08x\n", *((unsigned int*)pos));
+#endif
+ start = fw;
pos = fw + *((unsigned int*)pos);
end = fw + len;
}
fent.unknown = *pos;
pos++;
+ if (fent.unknown == 0x00) {
+ /* EOF */
+ int fill = (4 - ((pos - start) % 4)) % 4;
+ int i;
+
+ for (i = 0; i < fill; i++) {
+ if (*pos != 0xff) {
+ fprintf(stderr, "Wrong fill byte after EOF: 0x%02x, aborting!\n", *pos);
+ exit(1);
+ }
+ pos++;
+ }
+
+ if (pos != end) {
+ fprintf(stderr, "EOF marker not at end-of-file %p <-> %p, aborting!\n", pos, end);
+ exit(1);
+ }
+
+ return NULL;
+ }
+
+
name_length = *((unsigned int*)pos);
pos += 4;
if ((fent.length > (end - pos)) ||
(name_length > (end - pos))) {
- printf("EOF reached\n");
- return NULL;
+ printf("EOF reached without hitting EOF marker, aborting "
+ "(unknown: 0x%02x, namelen: 0x%08x, contentlen: 0x%08x!\n",
+ fent.unknown, name_length, fent.length);
+ exit(1);
}
fent.name = (char*)pos;
extract_lz_file(lzpos, (unsigned char*)lzname);
}
}
+ } else {
+ printf(", ignoring...\n");
}
fent = get_next_file(NULL, 0);
}