[gexiv2] gexiv2_metadata_get_gps_latitude(): Fix leak
- From: Jens Georg <jensgeorg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gexiv2] gexiv2_metadata_get_gps_latitude(): Fix leak
- Date: Sat, 30 Apr 2016 06:17:55 +0000 (UTC)
commit 47dfc2fc69a174e1a6d1e00feea0d540dcfbc81f
Author: Roman Lebedev <lebedev ri gmail com>
Date: Fri Aug 28 17:00:54 2015 +0300
gexiv2_metadata_get_gps_latitude(): 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 0x7fdc4db6c37a in malloc (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x9437a)
#1 0x7fdc4b45f799 in g_malloc (/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x4f799)
#2 0x7fdc4b47812e in g_strdup (/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x6812e)
#3 0x7fdc4ec0f7ce in gexiv2_metadata_get_exif_tag_string gexiv2/gexiv2-metadata-exif.cpp:113
#4 0x7fdc4ec12844 in gexiv2_metadata_get_gps_latitude gexiv2/gexiv2-metadata-gps.cpp:104
#5 0x7fdc4ec12ef1 in gexiv2_metadata_get_gps_info gexiv2/gexiv2-metadata-gps.cpp:201
#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 0x7fdc47c71b44 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 | 54 ++++++++++++++++++++++++---------------
1 files changed, 33 insertions(+), 21 deletions(-)
---
diff --git a/gexiv2/gexiv2-metadata-gps.cpp b/gexiv2/gexiv2-metadata-gps.cpp
index 3ee9b66..3c81255 100644
--- a/gexiv2/gexiv2-metadata-gps.cpp
+++ b/gexiv2/gexiv2-metadata-gps.cpp
@@ -96,56 +96,68 @@ gboolean gexiv2_metadata_get_gps_latitude (GExiv2Metadata *self, gdouble *latitu
g_return_val_if_fail(GEXIV2_IS_METADATA (self), FALSE);
g_return_val_if_fail(latitude != NULL, FALSE);
g_return_val_if_fail(self->priv->image.get() != NULL, FALSE);
-
+
try {
double num, den, min, sec;
*latitude = 0.0;
-
+
gchar* latitude_ref = gexiv2_metadata_get_exif_tag_string (self, "Exif.GPSInfo.GPSLatitudeRef");
- if (latitude_ref == NULL || latitude_ref[0] == '\0')
+ if (latitude_ref == NULL || latitude_ref[0] == '\0') {
+ g_free(latitude_ref);
return FALSE;
-
+ }
+
Exiv2::ExifData& exif_data = self->priv->image->exifData();
Exiv2::ExifKey key ("Exif.GPSInfo.GPSLatitude");
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(latitude_ref);
return FALSE;
-
+ }
+
*latitude = num / den;
-
+
num = (double)((*it).toRational(1).first);
den = (double)((*it).toRational(1).second);
-
- if (den == 0)
+
+ if (den == 0) {
+ g_free(latitude_ref);
return FALSE;
-
+ }
+
min = num/den;
-
+
if (min != -1.0)
*latitude = *latitude + min / 60.0;
-
+
num = (double)((*it).toRational(2).first);
den = (double)((*it).toRational(2).second);
-
- if (den == 0)
+
+ if (den == 0) {
+ g_free(latitude_ref);
return FALSE;
-
+ }
+
sec = num/den;
-
+
if (sec != -1.0)
*latitude = *latitude + sec / 3600.0;
- } else
+ } else {
+ g_free(latitude_ref);
return FALSE;
-
+ }
+
// There's some weird stuff out there in the wild.
if (latitude_ref[0] == 'S' || latitude_ref[0] == 'W')
*latitude *= -1.0;
-
+
+ g_free(latitude_ref);
+
return TRUE;
} catch (Exiv2::Error &e) {
LOG_ERROR(e);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]