filesystem: initial set of fixes for big endian

This commit is contained in:
Alibek Omarov
2025-11-06 23:26:12 +05:00
parent 822aa00bd6
commit 73950e867f
4 changed files with 67 additions and 8 deletions

View File

@@ -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 )

View File

@@ -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;

View File

@@ -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;

View File

@@ -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 );
}