Merge remote-tracking branch 'remotes/origin/bug_599_picload_fd_leak'
authorghost <andreas.monzner@multimedia-labs.de>
Tue, 3 May 2011 09:41:31 +0000 (11:41 +0200)
committerghost <andreas.monzner@multimedia-labs.de>
Tue, 3 May 2011 09:41:31 +0000 (11:41 +0200)
1  2 
lib/gdi/picexif.cpp

diff --combined lib/gdi/picexif.cpp
@@@ -90,9 -90,9 +90,9 @@@ void Cexif::ClearExif(
  
  bool Cexif::DecodeExif(const char *filename, int Thumb)
  {
+       bool ret = false;
        FILE * hFile = fopen(filename, "r");
-       if(!hFile) return false;
+       if(!hFile) return ret;
  
        m_exifinfo = new EXIFINFO;
        memset(m_exifinfo,0,sizeof(EXIFINFO));
        int a = fgetc(hFile);
        strcpy(m_szLastError,"EXIF-Data not found");
  
-       if (a != 0xff || fgetc(hFile) != M_SOI) return false;
+       if (a != 0xff || fgetc(hFile) != M_SOI)
+               goto decode_exif_out_false;
  
        for(;;)
        {
  
                if (SectionsRead >= MAX_SECTIONS)
                {
-                       strcpy(m_szLastError,"Too many sections in jpg file"); return false;
+                       strcpy(m_szLastError,"Too many sections in jpg file");
+                       goto decode_exif_out_false;
                }
  
                for (a=0;a<7;a++)
  
                        if (a >= 6)
                        {
-                               strcpy(m_szLastError,"too many padding unsigned chars\n"); return false;
+                               strcpy(m_szLastError,"too many padding unsigned chars\n");
+                               goto decode_exif_out_false;
                        }
                }
  
                if (marker == 0xff)
                {
-                       strcpy(m_szLastError,"too many padding unsigned chars!"); return false;
+                       strcpy(m_szLastError,"too many padding unsigned chars!");
+                       goto decode_exif_out_false;
                }
  
                Sections[SectionsRead].Type = marker;
  
                if (itemlen < 2)
                {
-                       strcpy(m_szLastError,"invalid marker"); return false;
+                       strcpy(m_szLastError,"invalid marker");
+                       goto decode_exif_out_false;
                }
                Sections[SectionsRead].Size = itemlen;
  
                Data = (unsigned char *)malloc(itemlen);
                if (Data == NULL)
                {
-                       strcpy(m_szLastError,"Could not allocate memory"); return false;
+                       strcpy(m_szLastError,"Could not allocate memory");
+                       goto decode_exif_out_false;
                }
                Sections[SectionsRead].Data = Data;
  
                got = fread(Data+2, 1, itemlen-2,hFile);
                if (got != itemlen-2)
                {
-                       strcpy(m_szLastError,"Premature end of file?"); return false;
+                       strcpy(m_szLastError,"Premature end of file?");
+                       goto decode_exif_out_false;
                }
                SectionsRead += 1;
  
                switch(marker)
                {
                case M_SOS:
-                       return true;
+                       goto decode_exif_out_true;
                case M_EOI:
                        printf("No image in jpeg!\n");
-                       return false;
+                       goto decode_exif_out_false;
                case M_COM:
                        if (HaveCom)
                        {
                }
        }
  
+ decode_exif_out_true:
+       ret = true;
+ decode_exif_out_false:
        fclose(hFile);
-       return true;
+       return ret;
  }
  
  bool Cexif::process_EXIF(unsigned char * CharBuf, unsigned int length)
@@@ -428,7 -439,7 +439,7 @@@ bool Cexif::ProcessExifDir(unsigned cha
                        case 6:         strcpy(m_exifinfo->Orientation,"Right-Top"); break;
                        case 7:         strcpy(m_exifinfo->Orientation,"Right-Bottom"); break;
                        case 8:         strcpy(m_exifinfo->Orientation,"Left-Bottom"); break;
 -                      default:        strcpy(m_exifinfo->Orientation,"Undefined rotation value");
 +                      default:        strcpy(m_exifinfo->Orientation,"Undefined"); break;
                        }
                        break;
                case TAG_EXIF_IMAGELENGTH: