X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=zip.c;h=6e52d493968ec5b19457bd26a1553fd1297af48b;hb=e38fee1b96c0b904d7f221a349fb2492258d5789;hp=dd1d52c5992b043a6b2976c1c11530942bd381a4;hpb=2823a4c8196a02da86ee180cf55586d4e8c91a2f;p=gpsp.git diff --git a/zip.c b/zip.c index dd1d52c..6e52d49 100644 --- a/zip.c +++ b/zip.c @@ -18,8 +18,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include #include "common.h" +#include #define ZIP_BUFFER_SIZE (128 * 1024) @@ -46,33 +46,35 @@ struct SZIPFileHeader u32 load_file_zip(char *filename) { struct SZIPFileHeader data; - u8 tmp[1024]; + char tmp[1024]; s32 retval = -1; u8 *buffer = NULL; u8 *cbuffer; - u8 *ext; + char *ext; + int ret; file_open(fd, filename, read); if(!file_check_valid(fd)) return -1; -#if 0 // EDIT: Why this while(1) is used is unknown and can cause a crash. - while(1) -#endif + while (1) { - file_read(fd, &data, sizeof(struct SZIPFileHeader)); - - // EDIT: Check if this is a zip file without worrying about endian - // It checks for the following: 0x50 0x4B 0x03 0x04 (PK..) - // Used to be: if(data.Sig != 0x04034b50) break; - if( data.Sig[0] != 0x50 || data.Sig[1] != 0x4B || - data.Sig[2] != 0x03 || data.Sig[3] != 0x04 ) - { - goto outcode; - } - - file_read(fd, tmp, data.FilenameLength); + ret = file_read(fd, &data, sizeof(data)); + if (ret != sizeof(data)) + break; + + // It checks for the following: 0x50 0x4B 0x03 0x04 (PK..) + if( data.Sig[0] != 0x50 || data.Sig[1] != 0x4B || + data.Sig[2] != 0x03 || data.Sig[3] != 0x04 ) + { + break; + } + + ret = file_read(fd, tmp, data.FilenameLength); + if (ret != data.FilenameLength) + break; + tmp[data.FilenameLength] = 0; // end string if(data.ExtraFieldLength) @@ -88,7 +90,7 @@ u32 load_file_zip(char *filename) // file is too big if(data.DataDescriptor.UncompressedSize > gamepak_ram_buffer_size) - goto outcode; + goto skip; if(!strcasecmp(ext, "bin") || !strcasecmp(ext, "gba")) { @@ -100,7 +102,6 @@ u32 load_file_zip(char *filename) case 0: retval = data.DataDescriptor.UncompressedSize; file_read(fd, buffer, retval); - goto outcode; case 8: @@ -115,9 +116,9 @@ u32 load_file_zip(char *filename) stream.next_out = (Bytef*)buffer; - // EDIT: Now uses proper conversion of data types for retval. - retval = (u32)data.DataDescriptor.UncompressedSize; - stream.avail_out = data.DataDescriptor.UncompressedSize; + // EDIT: Now uses proper conversion of data types for retval. + retval = (u32)data.DataDescriptor.UncompressedSize; + stream.avail_out = data.DataDescriptor.UncompressedSize; stream.zalloc = (alloc_func)0; stream.zfree = (free_func)0; @@ -146,6 +147,9 @@ u32 load_file_zip(char *filename) } } } + +skip: + file_seek(fd, data.DataDescriptor.CompressedSize, SEEK_CUR); } outcode: