X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/rsbs2/blobdiff_plain/1f1fa7b6b361da6fba6ec7f651ca589cb81a88c5..358935b6269b6f0392c87d8653541ab721cc0e70:/extract.c diff --git a/extract.c b/extract.c index feab68f..5d2a6fc 100644 --- a/extract.c +++ b/extract.c @@ -15,7 +15,9 @@ void extract_files(unsigned char *fw, int len) { unsigned char *pos; - unsigned int type, length; + unsigned int content_length; + unsigned int name_length; + unsigned char unknown; char *name; pos = fw + 0x28; @@ -24,23 +26,25 @@ void extract_files(unsigned char *fw, int len) pos = fw + *((unsigned int*)pos); while (pos < (fw + len)) { - type = *((unsigned int*)pos); + unknown = *pos; pos++; + name_length = *((unsigned int*)pos); pos += 4; - /* ??? */ - pos++; - length = *((unsigned int*)pos); + content_length = *((unsigned int*)pos); pos += 4; name = (char*)pos; - pos += strlen(name) + 1; - if ((pos + length) > (fw + len)) { + if (((pos + content_length) > (fw + len)) || + ((pos + name_length) > (fw + len))) { printf("EOF reached\n"); break; } - printf("%s: type: 0x%x, length: %d", name, type, length); + pos += name_length; - if (length > 0) { - write_file(name, pos, length); + printf("%s: unknown: 0x%02x, length: %d", + name, unknown, content_length); + + if (content_length > 0) { + write_file(name, pos, content_length); if (*((unsigned int*)pos) == LZ_MAGIC) { char *lzname; @@ -76,7 +80,7 @@ void extract_files(unsigned char *fw, int len) } } - pos += length; + pos += content_length; } }