From e6c8f727aac539b5ff65c5fe038f8425d2850c52 Mon Sep 17 00:00:00 2001 From: mattn Date: Thu, 29 Jan 2009 21:01:52 +0000 Subject: [PATCH] * patch from Micah Heyer (GtkRadiant Mailinglist) * fixes a segfault in gtkgensurf bitmap loading git-svn-id: https://zerowing.idsoftware.com/svn/radiant/GtkRadiant/trunk@326 8a3a26a2-13c4-0310-b231-cf6edde360e5 --- contrib/gtkgensurf/bitmap.cpp | 139 +++++++++++++++++---------------- contrib/gtkgensurf/gendlgs.cpp | 5 -- contrib/gtkgensurf/gensurf.cpp | 6 +- 3 files changed, 75 insertions(+), 75 deletions(-) diff --git a/contrib/gtkgensurf/bitmap.cpp b/contrib/gtkgensurf/bitmap.cpp index 4ea9393f..9955e8d5 100644 --- a/contrib/gtkgensurf/bitmap.cpp +++ b/contrib/gtkgensurf/bitmap.cpp @@ -77,24 +77,33 @@ void GenerateBitmapMapping () static unsigned char* OpenBitmapFile () { - int bmWidth; - int bmHeight; - unsigned char bmPlanes; - unsigned char bmBitsPixel; - unsigned char m1,m2; - unsigned long sizeimage; - short res1,res2; - long filesize, pixoff; - long bmisize, compression; - long xscale, yscale; - long colors, impcol; - unsigned long m_bytesRead = 0; +#define INVALID_FORMAT do{\ + fprintf(stderr,"%s:%d: Error file '%s' is malformed.\n",__FILE__,__LINE__,gbmp.name);\ + fclose(fp);\ + return NULL;\ +}while(0); + + int32_t bmWidth; + int32_t bmHeight; + uint16_t bmPlanes; + uint16_t bmBitsPixel; + uint8_t m1,m2; + uint32_t sizeimage; + int16_t res1,res2; + int32_t filesize, pixoff; + int32_t bmisize, compression; + int32_t xscale, yscale; + int32_t colors, impcol; + uint32_t m_bytesRead = 0; unsigned char *image; FILE *fp; fp = fopen (gbmp.name, "rb"); if (fp == NULL) - return NULL; + { + fprintf(stderr,"Error: Invalid filename '%s'\n",gbmp.name); + return NULL; + } long rc; rc = fread(&m1, 1, 1, fp); @@ -108,62 +117,58 @@ static unsigned char* OpenBitmapFile () rc = fread(&m2, 1, 1, fp); m_bytesRead++; if ((m1 != 'B') || (m2 != 'M')) - { - fclose(fp); - return NULL; - } + INVALID_FORMAT; - rc = fread((long*)&(filesize),4,1,fp); m_bytesRead+=4; - if (rc != 1) { fclose(fp); return NULL; } + rc = fread((uint32_t*)&(filesize),4,1,fp); m_bytesRead+=4; + if (rc != 1) INVALID_FORMAT; - rc = fread((int*)&(res1),2,1,fp); m_bytesRead+=2; - if (rc != 1) { fclose(fp); return NULL; } + rc = fread((uint16_t*)&(res1),2,1,fp); m_bytesRead+=2; + if (rc != 1) INVALID_FORMAT; - rc = fread((int*)&(res2),2,1,fp); m_bytesRead+=2; - if (rc != 1) { fclose(fp); return NULL; } + rc = fread((uint16_t*)&(res2),2,1,fp); m_bytesRead+=2; + if (rc != 1) INVALID_FORMAT; - rc = fread((long*)&(pixoff),4,1,fp); m_bytesRead+=4; - if (rc != 1) { fclose(fp); return NULL; } + rc = fread((uint32_t*)&(pixoff),4,1,fp); m_bytesRead+=4; + if (rc != 1) INVALID_FORMAT; - rc = fread((long*)&(bmisize),4,1,fp); m_bytesRead+=4; - if (rc != 1) { fclose(fp); return NULL; } + rc = fread((uint32_t*)&(bmisize),4,1,fp); m_bytesRead+=4; + if (rc != 1) INVALID_FORMAT; - rc = fread((long *)&(bmWidth),4,1,fp); m_bytesRead+=4; - if (rc != 1) { fclose(fp); return NULL; } + rc = fread((uint32_t *)&(bmWidth),4,1,fp); m_bytesRead+=4; + if (rc != 1) INVALID_FORMAT; - rc = fread((long*)&(bmHeight),4,1,fp); m_bytesRead+=4; - if (rc != 1) { fclose(fp); return NULL; } + rc = fread((uint32_t*)&(bmHeight),4,1,fp); m_bytesRead+=4; + if (rc != 1) INVALID_FORMAT; - rc = fread((int*)&(bmPlanes),2,1,fp); m_bytesRead+=2; - if (rc != 1) { fclose(fp); return NULL; } + rc = fread((uint16_t*)&(bmPlanes),2,1,fp); m_bytesRead+=2; + if (rc != 1) INVALID_FORMAT; - rc = fread((int*)&(bmBitsPixel),2,1,fp); m_bytesRead+=2; - if (rc != 1) { fclose(fp); return NULL; } + rc = fread((uint16_t*)&(bmBitsPixel),2,1,fp); m_bytesRead+=2; + if (rc != 1) INVALID_FORMAT; - rc = fread((long*)&(compression),4,1,fp); m_bytesRead+=4; - if (rc != 1) { fclose(fp); return NULL; } + rc = fread((uint32_t*)&(compression),4,1,fp); m_bytesRead+=4; + if (rc != 1) INVALID_FORMAT; - rc = fread((long*)&(sizeimage),4,1,fp); m_bytesRead+=4; - if (rc != 1) {fclose(fp); return NULL; } + rc = fread((uint32_t*)&(sizeimage),4,1,fp); m_bytesRead+=4; + if (rc != 1) INVALID_FORMAT; - rc = fread((long*)&(xscale),4,1,fp); m_bytesRead+=4; - if (rc != 1) { fclose(fp); return NULL; } + rc = fread((uint32_t*)&(xscale),4,1,fp); m_bytesRead+=4; + if (rc != 1) INVALID_FORMAT; - rc = fread((long*)&(yscale),4,1,fp); m_bytesRead+=4; - if (rc != 1) { fclose(fp); return NULL; } + rc = fread((uint32_t*)&(yscale),4,1,fp); m_bytesRead+=4; + if (rc != 1) INVALID_FORMAT; - rc = fread((long*)&(colors),4,1,fp); m_bytesRead+=4; - if (rc != 1) { fclose(fp); return NULL; } + rc = fread((uint32_t*)&(colors),4,1,fp); m_bytesRead+=4; + if (rc != 1) INVALID_FORMAT; - rc = fread((long*)&(impcol),4,1,fp); m_bytesRead+=4; - if (rc != 1) { fclose(fp); return NULL; } + rc = fread((uint32_t*)&(impcol),4,1,fp); m_bytesRead+=4; + if (rc != 1) INVALID_FORMAT; if (bmBitsPixel != 8) { g_FuncTable.m_pfnMessageBox (g_pWnd, "This is not an 8-bit image. GenSurf can't use it.", "Bitmap", MB_ICONEXCLAMATION, NULL); - fclose(fp); - return NULL; + INVALID_FORMAT; } if (colors == 0) @@ -180,40 +185,35 @@ static unsigned char* OpenBitmapFile () m_bytesRead++; if (rc!=1) { - fclose(fp); - return NULL; + INVALID_FORMAT; } rc = fread(&g, 1, 1, fp); m_bytesRead++; if (rc!=1) { - fclose(fp); - return NULL; + INVALID_FORMAT; } rc = fread(&r, 1, 1, fp); m_bytesRead++; if (rc != 1) { - fclose(fp); - return NULL; + INVALID_FORMAT; } rc = fread(&dummy, 1, 1, fp); m_bytesRead++; if (rc != 1) { - fclose(fp); - return NULL; + INVALID_FORMAT; } } } if ((long)m_bytesRead > pixoff) { - fclose(fp); - return NULL; + INVALID_FORMAT; } while ((long)m_bytesRead < pixoff) @@ -231,8 +231,6 @@ static unsigned char* OpenBitmapFile () if (image != NULL) { - gbmp.width = w; - gbmp.height = h; unsigned char* outbuf = image; long row = 0; long rowOffset = 0; @@ -261,8 +259,7 @@ static unsigned char* OpenBitmapFile () if (fread(&inbyte,1,1,fp) != 1) { free(image); - fclose(fp); - return NULL; + INVALID_FORMAT; } m_bytesRead++; } @@ -283,8 +280,7 @@ static unsigned char* OpenBitmapFile () if (fread(&dummy,1,1,fp)!=1) { free(image); - fclose(fp); - return NULL; + INVALID_FORMAT; } m_bytesRead++; } @@ -402,18 +398,25 @@ static unsigned char* OpenBitmapFile () } } fclose(fp); + + gbmp.width = w; + gbmp.height = h; + if(gbmp.colors) + free(gbmp.colors); + gbmp.colors = image; return image; + + } bool OpenBitmap () { - if (gbmp.colors) - free (gbmp.colors); - gbmp.colors = OpenBitmapFile (); + OpenBitmapFile (); if (!gbmp.colors) { + g_print("failed to load file gbmp %s\n",gbmp.name); char Text[256]; sprintf (Text, "Error opening %s", gbmp.name); diff --git a/contrib/gtkgensurf/gendlgs.cpp b/contrib/gtkgensurf/gendlgs.cpp index 8756f037..01df80b8 100644 --- a/contrib/gtkgensurf/gendlgs.cpp +++ b/contrib/gtkgensurf/gendlgs.cpp @@ -894,11 +894,6 @@ static gint bitmap_file_entryfocusout(GtkWidget* widget, GdkEventFocus* event, g strcpy (filename, gtk_entry_get_text (GTK_ENTRY(widget))); if(strcmp (filename,gbmp.name)) { - if (gbmp.colors) - { - free(gbmp.colors); - gbmp.colors=NULL; - } strcpy (gbmp.name,filename); if (strlen(gbmp.name) ) OpenBitmap (); diff --git a/contrib/gtkgensurf/gensurf.cpp b/contrib/gtkgensurf/gensurf.cpp index 5803b33f..77ef3086 100644 --- a/contrib/gtkgensurf/gensurf.cpp +++ b/contrib/gtkgensurf/gensurf.cpp @@ -133,11 +133,12 @@ bool GenSurfInit () else */ Game = QUAKE3; - ReadIniFile (gszIni); if (g_pWnd == NULL) g_pWnd = create_main_dialog (); + ReadIniFile (gszIni); + return true; } @@ -291,9 +292,10 @@ void ReadIniFile (const char *file) if(!strlen(Texture[GENESIS3D][0])) strcpy(Texture[GENESIS3D][0],"textures/rock13"); if(!strlen(Texture[QUAKE3][0])) strcpy(Texture[QUAKE3][0], "textures/organics/grass3"); if(!strlen(Texture[QUAKE3][1])) strcpy(Texture[QUAKE3][1], "textures/common/caulk"); - strcpy (gbmp.name, g_FuncTable.m_pfnProfileLoadString (file, "Bitmap","Filename","")); + + gbmp.colors = NULL; if (strlen(gbmp.name)) OpenBitmap (); -- 2.39.2