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 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))) {
-#if 0
- printf("EOF reached\n");
-#endif
- 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;