Package: amideco Version: 0.31e-3 Severity: normal Tags: patch -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
Some of the newer BIOS files I have seem to use a compression flag value unknown to amideco for some of their parts. amideco will attempt to decompress these parts using its built-in lzh decompression. This fails with the message "Bad Table [2]" and the program exits immediately, thereby failing to write any parts. The attached patch "fixes" this by ignoring the unknown flag and printing a warning. I have not been able to find any description of the file format, but my experiments so far indicates that treating the "IsComprs" byte as a bitmap instead of a two-value byte is correct. The only value I have observed in addition to 0x00 and 0x80 is 0x90. It is commonly used for values of class 11 (P6 Microcode), 15 (Memory Sizing) and 30 (Font Database). I assume the 0x10 bit has some significance, so I believe it is appropriate to issue a warning when handling these parts. Bjørn - -- System Information: Debian Release: lenny/sid APT prefers stable APT policy: (700, 'stable'), (650, 'testing') Architecture: amd64 (x86_64) Kernel: Linux 2.6.24-1-amd64 (SMP w/4 CPU cores) Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/bash Versions of packages amideco depends on: ii libc6 2.7-10 GNU C Library: Shared libraries amideco recommends no packages. - -- no debconf information -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) iD8DBQFIVCBT10rqkowbIskRAiHrAJ94rrbUiPHWvjgVkEndTHBNRDGq9wCdGFV/ 4qbcR6qua0xCJ0FnTvXXNsE= =ViCE -----END PGP SIGNATURE-----
--- amideco-0.31e/src/amifunc.c.old 2008-06-14 20:59:45.000000000 +0200 +++ amideco-0.31e/src/amifunc.c 2008-06-14 21:16:44.000000000 +0200 @@ -339,11 +339,11 @@ part.PartID, PartTotal, GetModuleName(part.PartID), - (part.IsComprs!=0x80)?(part.ROMSize):(part.CSize), - (part.IsComprs!=0x80)?(part.ROMSize):(part.CSize), - (part.IsComprs!=0x80)?(part.ExpSize):(part.CSize), - (part.IsComprs!=0x80)?(part.ExpSize):(part.CSize), - (part.IsComprs!=0x80)?(IDSign):(" "), + ((part.IsComprs&0x80)==0)?(part.ROMSize):(part.CSize), + ((part.IsComprs&0x80)==0)?(part.ROMSize):(part.CSize), + ((part.IsComprs&0x80)==0)?(part.ExpSize):(part.CSize), + ((part.IsComprs&0x80)==0)?(part.ExpSize):(part.CSize), + ((part.IsComprs&0x80)==0)?(IDSign):(" "), Offset-ConstOff ); @@ -376,7 +376,7 @@ interface.dicbit = 13; interface.method = 5; - if(part.IsComprs!=0x80) + if((part.IsComprs&0x80)==0) decode(interface); else { @@ -385,6 +385,9 @@ fread(&Buf[0],1,1,ptx); fwrite(&Buf[0],1,1,pto); }; + if(part.IsComprs!=0x80) + printf("WARNING: Ignoring unknown compression flag (0x%02x) for part id %02X\n", + part.IsComprs, part.PartID); } fclose(pto); break;