* patch from Micah Heyer (GtkRadiant Mailinglist)
authormattn <mattn>
Thu, 29 Jan 2009 21:01:52 +0000 (21:01 +0000)
committermattn <mattn>
Thu, 29 Jan 2009 21:01:52 +0000 (21:01 +0000)
* fixes a segfault in gtkgensurf bitmap loading

git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/trunk@326 8a3a26a2-13c4-0310-b231-cf6edde360e5

contrib/gtkgensurf/bitmap.cpp
contrib/gtkgensurf/gendlgs.cpp
contrib/gtkgensurf/gensurf.cpp

index 4ea9393f34e04593e8d7c68f76f710a3e738204c..9955e8d5575942cc8f1f93d2a11a9ae1bb34456f 100644 (file)
@@ -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);
index 8756f037af5fa14adb2454161891bd3320d4ff6b..01df80b8a686728980f1b40d915fae696084b395 100644 (file)
@@ -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 ();
index 5803b33f7f7a2c7e5f3c1ce430bf15de2ba1c037..77ef30863052509976420b81ac2fbcf6744e4a40 100644 (file)
@@ -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 ();