[gexiv2] gexiv2_metadata_get_gps_longitude(): Fix leak



commit 529d8e9ef70b33278dc0a470c56b2aa012d85e79
Author: Roman Lebedev <lebedev ri gmail com>
Date:   Fri Aug 28 16:55:43 2015 +0300

    gexiv2_metadata_get_gps_longitude(): Fix leak
    
    free return from gexiv2_metadata_get_exif_tag_string()
    
    Fixes following AddressSanitizer issue:
    Direct leak of 2 byte(s) in 1 object(s) allocated from:
        #0 0x7fb07c59437a in malloc (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x9437a)
        #1 0x7fb079e87799 in g_malloc (/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x4f799)
        #2 0x7fb079ea012e in g_strdup (/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x6812e)
        #3 0x7fb07d6377ce in gexiv2_metadata_get_exif_tag_string gexiv2/gexiv2-metadata-exif.cpp:113
        #4 0x7fb07d63a3c2 in gexiv2_metadata_get_gps_longitude gexiv2/gexiv2-metadata-gps.cpp:30
        #5 0x7fb07d63aeb8 in gexiv2_metadata_get_gps_info gexiv2/gexiv2-metadata-gps.cpp:186
        #6 0x4172a1 in a_geotag_get_position /home/lebedevri/src/viking/src/geotag_exif.c:218
        #7 0x4170b0 in main /home/lebedevri/src/viking/test/geotag_read.c:14
        #8 0x7fb076699b44 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21b44)
        #9 0x416fb8  (/home/lebedevri/src/viking/test/geotag_read+0x416fb8)
    
    https://bugzilla.gnome.org/show_bug.cgi?id=754241

 gexiv2/gexiv2-metadata-gps.cpp |   56 ++++++++++++++++++++++++---------------
 1 files changed, 34 insertions(+), 22 deletions(-)
---
diff --git a/gexiv2/gexiv2-metadata-gps.cpp b/gexiv2/gexiv2-metadata-gps.cpp
index 70d8677..3ee9b66 100644
--- a/gexiv2/gexiv2-metadata-gps.cpp
+++ b/gexiv2/gexiv2-metadata-gps.cpp
@@ -22,61 +22,73 @@ gboolean gexiv2_metadata_get_gps_longitude (GExiv2Metadata *self, gdouble *longi
     g_return_val_if_fail (GEXIV2_IS_METADATA (self), FALSE);
     g_return_val_if_fail (longitude != NULL, FALSE);
     g_return_val_if_fail(self->priv->image.get() != NULL, FALSE);
-    
+
     try {
         double num, den, min, sec;
         *longitude = 0.0;
-        
+
         gchar* longitude_ref = gexiv2_metadata_get_exif_tag_string (self, "Exif.GPSInfo.GPSLongitudeRef");
-        if (longitude_ref == NULL || longitude_ref[0] == '\0')
+        if (longitude_ref == NULL || longitude_ref[0] == '\0') {
+            g_free(longitude_ref);
             return FALSE;
-        
+        }
+
         Exiv2::ExifData& exif_data = self->priv->image->exifData();
         Exiv2::ExifKey key ("Exif.GPSInfo.GPSLongitude");
         Exiv2::ExifData::iterator it = exif_data.findKey (key);
-        
+
         if (it != exif_data.end () && (*it).count() == 3) {
             num = (double)((*it).toRational(0).first);
             den = (double)((*it).toRational(0).second);
-            
-            if (den == 0)
+
+            if (den == 0) {
+                g_free(longitude_ref);
                 return FALSE;
-            
+            }
+
             *longitude = num / den;
-            
+
             num = (double)((*it).toRational(1).first);
             den = (double)((*it).toRational(1).second);
-            
-            if (den == 0)
+
+            if (den == 0) {
+                g_free(longitude_ref);
                 return FALSE;
-            
+            }
+
             min = num/den;
-            
+
             if (min != -1.0)
                 *longitude = *longitude + min / 60.0;
-            
+
             num = (double)((*it).toRational(2).first);
             den = (double)((*it).toRational(2).second);
-            
-            if (den == 0)
+
+            if (den == 0) {
+                g_free(longitude_ref);
                 return FALSE;
-            
+            }
+
             sec = num/den;
-            
+
             if (sec != -1.0)
                 *longitude = *longitude + sec / 3600.0;
-        } else
+        } else {
+            g_free(longitude_ref);
             return FALSE;
-        
+        }
+
         // There's some weird stuff out there in the wild.
         if (longitude_ref[0] == 'S' || longitude_ref[0] == 'W')
             *longitude *= -1.0;
-        
+
+        g_free(longitude_ref);
+
         return TRUE;
     } catch (Exiv2::Error &e) {
         LOG_ERROR(e);
     }
-    
+
     return FALSE;
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]