From fa1933fff541d225d4e426858a75cec2b6424d93 Mon Sep 17 00:00:00 2001 From: Garux Date: Wed, 6 Oct 2021 15:28:47 +0300 Subject: [PATCH] secure image_t business no need to keep in mind its destructor --- tools/quake3/q3map2/image.cpp | 56 +++++++++++++++-------------------- tools/quake3/q3map2/q3map2.h | 7 +++++ 2 files changed, 31 insertions(+), 32 deletions(-) diff --git a/tools/quake3/q3map2/image.cpp b/tools/quake3/q3map2/image.cpp index f9bee11b..8c710a54 100644 --- a/tools/quake3/q3map2/image.cpp +++ b/tools/quake3/q3map2/image.cpp @@ -228,11 +228,7 @@ static std::forward_list images; static struct construct_default_image { construct_default_image(){ - image_t img; - img.name = img.filename = DEFAULT_IMAGE; - img.width = img.height = 64; - img.pixels = void_ptr( memset( safe_malloc( 64 * 64 * 4 ), 255, 64 * 64 * 4 ) ); - images.emplace_front( std::move( img ) ); + images.emplace_front( DEFAULT_IMAGE, DEFAULT_IMAGE, 64, 64, void_ptr( memset( safe_malloc( 64 * 64 * 4 ), 255, 64 * 64 * 4 ) ) ); } } s_construct_default_image; @@ -271,7 +267,7 @@ static const image_t *ImageFind( const char *name ){ const image_t *ImageLoad( const char *name ){ /* dummy check */ if ( strEmptyOrNull( name ) ) { - return NULL; + return nullptr; } /* try to find existing image */ @@ -280,19 +276,18 @@ const image_t *ImageLoad( const char *name ){ } /* none found, so let's create a new one */ - image_t image; + byte *pixels = nullptr; + int width, height; char filename[ 1024 ]; int size; - byte *buffer = NULL; + byte *buffer = nullptr; bool alphaHack = false; - image.name = name; - /* attempt to load tga */ sprintf( filename, "%s.tga", name ); // StripExtension( name ); already size = vfsLoadFile( filename, (void**) &buffer, 0 ); if ( size > 0 ) { - LoadTGABuffer( buffer, buffer + size, &image.pixels, &image.width, &image.height ); + LoadTGABuffer( buffer, buffer + size, &pixels, &width, &height ); } else { @@ -300,7 +295,7 @@ const image_t *ImageLoad( const char *name ){ path_set_extension( filename, ".png" ); size = vfsLoadFile( filename, (void**) &buffer, 0 ); if ( size > 0 ) { - LoadPNGBuffer( buffer, size, &image.pixels, &image.width, &image.height ); + LoadPNGBuffer( buffer, size, &pixels, &width, &height ); } else { @@ -308,10 +303,10 @@ const image_t *ImageLoad( const char *name ){ path_set_extension( filename, ".jpg" ); size = vfsLoadFile( filename, (void**) &buffer, 0 ); if ( size > 0 ) { - if ( LoadJPGBuff( buffer, size, &image.pixels, &image.width, &image.height ) == -1 && image.pixels != NULL ) { - // On error, LoadJPGBuff might store a pointer to the error message in image.pixels - Sys_Warning( "LoadJPGBuff %s %s\n", filename, (unsigned char*) image.pixels ); - image.pixels = NULL; + if ( LoadJPGBuff( buffer, size, &pixels, &width, &height ) == -1 && pixels != nullptr ) { + // On error, LoadJPGBuff might store a pointer to the error message in pixels + Sys_Warning( "LoadJPGBuff %s %s\n", filename, (unsigned char*) pixels ); + pixels = nullptr; } alphaHack = true; } @@ -321,17 +316,17 @@ const image_t *ImageLoad( const char *name ){ path_set_extension( filename, ".dds" ); size = vfsLoadFile( filename, (void**) &buffer, 0 ); if ( size > 0 ) { - LoadDDSBuffer( buffer, size, &image.pixels, &image.width, &image.height ); + LoadDDSBuffer( buffer, size, &pixels, &width, &height ); /* debug code */ #if 0 { ddsPF_t pf; - DDSGetInfo( (ddsBuffer_t*) buffer, NULL, NULL, &pf ); + DDSGetInfo( (ddsBuffer_t*) buffer, nullptr, nullptr, &pf ); Sys_Printf( "pf = %d\n", pf ); - if ( image.width > 0 ) { + if ( width > 0 ) { path_set_extension( filename, "_converted.tga" ); - WriteTGA( "C:\\games\\quake3\\baseq3\\textures\\rad\\dds_converted.tga", image.pixels, image.width, image.height ); + WriteTGA( "C:\\games\\quake3\\baseq3\\textures\\rad\\dds_converted.tga", pixels, width, height ); } } #endif @@ -342,7 +337,7 @@ const image_t *ImageLoad( const char *name ){ path_set_extension( filename, ".ktx" ); size = vfsLoadFile( filename, (void**) &buffer, 0 ); if ( size > 0 ) { - LoadKTXBufferFirstImage( buffer, size, &image.pixels, &image.width, &image.height ); + LoadKTXBufferFirstImage( buffer, size, &pixels, &width, &height ); } } } @@ -353,24 +348,21 @@ const image_t *ImageLoad( const char *name ){ free( buffer ); /* make sure everything's kosher */ - if ( size <= 0 || image.width <= 0 || image.height <= 0 || image.pixels == NULL ) { + if ( size <= 0 || width <= 0 || height <= 0 || pixels == nullptr ) { //% Sys_Printf( "size = %d width = %d height = %d pixels = 0x%08x (%s)\n", - //% size, image.width, image.height, image.pixels, filename ); - image.pixels = NULL; - return NULL; + //% size, width, height, pixels, filename ); + return nullptr; } - /* set filename */ - image.filename = filename; + /* everybody's in the place, create new image */ + image_t& image = *images.emplace_after( images.cbegin(), name, filename, width, height, pixels ); if ( alphaHack ) { path_set_extension( filename, "_alpha.jpg" ); size = vfsLoadFile( (const char*) filename, (void**) &buffer, 0 ); if ( size > 0 ) { - unsigned char *pixels; - int width, height; if ( LoadJPGBuff( buffer, size, &pixels, &width, &height ) == -1 ) { - if (pixels) { + if ( pixels ) { // On error, LoadJPGBuff might store a pointer to the error message in pixels Sys_Warning( "LoadJPGBuff %s %s\n", filename, (unsigned char*) pixels ); } @@ -385,6 +377,6 @@ const image_t *ImageLoad( const char *name ){ } } - /* cache and return the image */ - return &( *images.insert_after( images.cbegin(), std::move( image ) ) ); + /* return the image */ + return ℑ } diff --git a/tools/quake3/q3map2/q3map2.h b/tools/quake3/q3map2/q3map2.h index f1db24ff..1d70c2c7 100644 --- a/tools/quake3/q3map2/q3map2.h +++ b/tools/quake3/q3map2/q3map2.h @@ -418,6 +418,13 @@ struct image_t byte *pixels = nullptr; image_t() = default; + image_t( const char *name, const char *filename, int width, int height, byte *pixels ) : + name( name ), + filename( filename ), + width( width ), + height(height ), + pixels( pixels ) + {} image_t( const image_t& ) = delete; image_t( image_t&& other ) noexcept : name( std::move( other.name ) ),