[Extractor-gtk-cvslog] SF.net SVN: extractor-gtk: [42] trunk/extractor/generic.c
Extract files from unusual archive formats
Brought to you by:
someone-guy
From: <som...@us...> - 2007-09-16 13:48:42
|
Revision: 42 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=42&view=rev Author: someone-guy Date: 2007-09-16 06:48:34 -0700 (Sun, 16 Sep 2007) Log Message: ----------- RIFF-check with less false positives Modified Paths: -------------- trunk/extractor/generic.c Modified: trunk/extractor/generic.c =================================================================== --- trunk/extractor/generic.c 2007-09-16 11:43:44 UTC (rev 41) +++ trunk/extractor/generic.c 2007-09-16 13:48:34 UTC (rev 42) @@ -26,6 +26,18 @@ *list = l; } +static int is_valid_fourcc(uint32_t id) { + static const char valid_chars[] = + "0123456789abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ_ "; + int i; + for (i = 0; i < 4; i++) { + if (!strchr(valid_chars, id)) return 0; + id >>= 8; + } + return 1; +} + typedef uint64_t buffer_t; static file_t *get_list(FILE *in) { @@ -38,12 +50,17 @@ int i; t = t << 8 | fgetc(in); switch (t & 0xffffffff) { - case TAG('R', 'I', 'F', 'F'): + case TAG('R', 'I', 'F', 'F'): { + uint32_t len = read_le32(in); + uint32_t type = read_le32(in); + fseek(in, -8, SEEK_CUR); + if (len <= 4 || !is_valid_fourcc(type)) break; add_entry(&list, cnt, "riff"); list[cnt].start = ftell(in) - 4; - list[cnt].len = peek_le32(in); + list[cnt].len = len; cnt++; break; + } } switch (t & 0xffffff) { case TAG(0, 'F', 'W', 'S'): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |