diff --git a/filesystem/filesystem.c b/filesystem/filesystem.c index d0016798..e3cdc729 100644 --- a/filesystem/filesystem.c +++ b/filesystem/filesystem.c @@ -1465,7 +1465,7 @@ static qboolean FS_CheckForCrypt( const char *dllname ) FS_Read( f, &key, sizeof( key )); FS_Close( f ); - return ( key == 0x12345678 ) ? true : false; + return ( key == LittleLong( 0x12345678 )) ? true : false; } static int FS_StripIdiotRelativePath( const char *dllname, const char *gamefolder ) diff --git a/filesystem/pak.c b/filesystem/pak.c index 6aef428e..dc525c8c 100644 --- a/filesystem/pak.c +++ b/filesystem/pak.c @@ -102,6 +102,7 @@ static pack_t *FS_LoadPackPAK( const char *packfile, int *error ) int numpackfiles; pack_t *pack; fs_size_t c; + int i; // TODO: use FS_Open to allow PK3 to be included into other archives // Currently, it doesn't work with rodir due to FS_FindFile logic @@ -118,7 +119,7 @@ static pack_t *FS_LoadPackPAK( const char *packfile, int *error ) c = FS_Read( packhandle, (void *)&header, sizeof( header )); - if( c != sizeof( header ) || header.ident != IDPACKV1HEADER ) + if( c != sizeof( header ) || header.ident != LittleLong( IDPACKV1HEADER )) { Con_Reportf( "%s is not a packfile. Ignored.\n", packfile ); if( error ) *error = PAK_LOAD_BAD_HEADER; @@ -126,6 +127,10 @@ static pack_t *FS_LoadPackPAK( const char *packfile, int *error ) return NULL; } + header.ident = LittleLong( header.ident ); + header.dirofs = LittleLong( header.dirofs ); + header.dirlen = LittleLong( header.dirlen ); + if( header.dirlen % sizeof( dpackfile_t )) { Con_Reportf( S_ERROR "%s has an invalid directory size. Ignored.\n", packfile ); @@ -165,6 +170,12 @@ static pack_t *FS_LoadPackPAK( const char *packfile, int *error ) return NULL; } + for( i = 0; i < numpackfiles; i++ ) + { + pack->files[i].filepos = LittleLong( pack->files[i].filepos ); + pack->files[i].filelen = LittleLong( pack->files[i].filelen ); + } + // TODO: validate directory? pack->handle = packhandle; diff --git a/filesystem/wad.c b/filesystem/wad.c index bc2ba7a9..195be39a 100644 --- a/filesystem/wad.c +++ b/filesystem/wad.c @@ -305,7 +305,7 @@ static wfile_t *W_Open( const char *filename, int *error, uint flags ) return NULL; } - if( header.ident != IDWAD2HEADER && header.ident != IDWAD3HEADER ) + if( header.ident != LittleLong( IDWAD2HEADER ) && header.ident != LittleLong( IDWAD3HEADER )) { Con_Reportf( S_ERROR "%s: %s is not a WAD2 or WAD3 file\n", __func__, filename ); if( error ) *error = WAD_LOAD_BAD_HEADER; @@ -313,6 +313,10 @@ static wfile_t *W_Open( const char *filename, int *error, uint flags ) return NULL; } + header.ident = LittleLong( header.ident ); + header.numlumps = LittleLong( header.numlumps ); + header.infotableofs = LittleLong( header.infotableofs ); + lumpcount = header.numlumps; if( lumpcount >= MAX_FILES_IN_WAD ) @@ -353,6 +357,13 @@ static wfile_t *W_Open( const char *filename, int *error, uint flags ) return NULL; } + for( i = 0; i < lumpcount; i++ ) + { + srclumps[i].filepos = LittleLong( srclumps[i].filepos ); + srclumps[i].disksize = LittleLong( srclumps[i].disksize ); + srclumps[i].size = LittleLong( srclumps[i].size ); + } + // starting to add lumps wad->lumps = (dlumpinfo_t *)Mem_Calloc( wad->mempool, lat_size ); wad->numlumps = 0; diff --git a/filesystem/zip.c b/filesystem/zip.c index a887b18d..d37f6ac1 100644 --- a/filesystem/zip.c +++ b/filesystem/zip.c @@ -209,7 +209,7 @@ static zip_t *FS_LoadZip( const char *zipfile, int *error ) c = FS_Read( zip->handle, &signature, sizeof( signature )); - if( c != sizeof( signature ) || signature == ZIP_HEADER_EOCD ) + if( c != sizeof( signature ) || signature == LittleLong( ZIP_HEADER_EOCD )) { Con_Reportf( S_WARN "%s has no files. Ignored.\n", zipfile ); @@ -220,7 +220,7 @@ static zip_t *FS_LoadZip( const char *zipfile, int *error ) return NULL; } - if( signature != ZIP_HEADER_LF ) + if( signature != LittleLong( ZIP_HEADER_LF )) { Con_Reportf( S_ERROR "%s is not a zip file. Ignored.\n", zipfile ); @@ -239,13 +239,13 @@ static zip_t *FS_LoadZip( const char *zipfile, int *error ) FS_Seek( zip->handle, filepos, SEEK_SET ); c = FS_Read( zip->handle, &signature, sizeof( signature )); - if( c == sizeof( signature ) && signature == ZIP_HEADER_EOCD ) + if( c == sizeof( signature ) && signature == LittleLong( ZIP_HEADER_EOCD )) break; filepos -= sizeof( char ); // step back one byte } - if( ZIP_HEADER_EOCD != signature ) + if( signature != LittleLong( ZIP_HEADER_EOCD )) { Con_Reportf( S_ERROR "cannot find EOCD in %s. Zip file corrupted.\n", zipfile ); @@ -269,6 +269,14 @@ static zip_t *FS_LoadZip( const char *zipfile, int *error ) return NULL; } + header_eocd.disk_number = LittleShort( header_eocd.disk_number ); + header_eocd.start_disk_number = LittleShort( header_eocd.start_disk_number ); + header_eocd.number_central_directory_record = LittleShort( header_eocd.number_central_directory_record ); + header_eocd.total_central_directory_record = LittleShort( header_eocd.total_central_directory_record ); + header_eocd.size_of_central_directory = LittleLong( header_eocd.size_of_central_directory ); + header_eocd.central_directory_offset = LittleLong( header_eocd.central_directory_offset ); + header_eocd.commentary_len = LittleShort( header_eocd.commentary_len ); + if( header_eocd.total_central_directory_record == 0 ) // refuse to load empty ZIP archives { Con_Reportf( S_WARN "%s has no files (total records is zero). Ignored.\n", zipfile ); @@ -291,7 +299,7 @@ static zip_t *FS_LoadZip( const char *zipfile, int *error ) { c = FS_Read( zip->handle, &header_cdf, sizeof( header_cdf )); - if( c != sizeof( header_cdf ) || header_cdf.signature != ZIP_HEADER_CDF ) + if( c != sizeof( header_cdf ) || header_cdf.signature != LittleLong( ZIP_HEADER_CDF )) { Con_Reportf( S_ERROR "CDF signature mismatch in %s. Zip file corrupted.\n", zipfile ); @@ -302,6 +310,24 @@ static zip_t *FS_LoadZip( const char *zipfile, int *error ) return NULL; } + header_cdf.signature = LittleLong( header_cdf.signature ); + header_cdf.version = LittleShort( header_cdf.version ); + header_cdf.version_need = LittleShort( header_cdf.version_need ); + header_cdf.generalPurposeBitFlag = LittleShort( header_cdf.generalPurposeBitFlag ); + header_cdf.flags = LittleShort( header_cdf.flags ); + header_cdf.modification_time = LittleShort( header_cdf.modification_time ); + header_cdf.modification_date = LittleShort( header_cdf.modification_date ); + header_cdf.crc32 = LittleLong( header_cdf.crc32 ); + header_cdf.compressed_size = LittleLong( header_cdf.compressed_size ); + header_cdf.uncompressed_size = LittleLong( header_cdf.uncompressed_size ); + header_cdf.filename_len = LittleShort( header_cdf.filename_len ); + header_cdf.extrafield_len = LittleShort( header_cdf.extrafield_len ); + header_cdf.file_commentary_len = LittleShort( header_cdf.file_commentary_len ); + header_cdf.disk_start = LittleShort( header_cdf.disk_start ); + header_cdf.internal_attr = LittleShort( header_cdf.internal_attr ); + header_cdf.external_attr = LittleLong( header_cdf.external_attr ); + header_cdf.local_header_offset = LittleLong( header_cdf.local_header_offset ); + if( header_cdf.uncompressed_size && header_cdf.filename_len && header_cdf.filename_len < sizeof( filename_buffer )) { memset( &filename_buffer, '\0', sizeof( filename_buffer )); @@ -365,6 +391,17 @@ static zip_t *FS_LoadZip( const char *zipfile, int *error ) return NULL; } + header.signature = LittleLong( header.signature ); + header.version = LittleShort( header.version ); + header.flags = LittleShort( header.flags ); + header.compression_flags = LittleShort( header.compression_flags ); + header.dos_date = LittleLong( header.dos_date ); + header.crc32 = LittleLong( header.crc32 ); + header.compressed_size = LittleLong( header.compressed_size ); + header.uncompressed_size = LittleLong( header.uncompressed_size ); + header.filename_len = LittleShort( header.filename_len ); + header.extrafield_len = LittleShort( header.extrafield_len ); + info[i].flags = header.compression_flags; info[i].offset = info[i].offset + header.filename_len + header.extrafield_len + sizeof( header ); }