[gexiv2/wip/45] Fix overflow in altitude to fraction conversion



commit 2654d3834d0df23eea99b9d31edca1be05d516f0
Author: Jens Georg <mail jensge org>
Date:   Tue Sep 10 08:21:17 2019 +0200

    Fix overflow in altitude to fraction conversion

 gexiv2/gexiv2-metadata-gps.cpp |  9 ++++-----
 test/gexiv2-regression.c       | 26 ++++++++++++++++++++++++++
 test/python/test_metadata.py   |  2 +-
 3 files changed, 31 insertions(+), 6 deletions(-)
---
diff --git a/gexiv2/gexiv2-metadata-gps.cpp b/gexiv2/gexiv2-metadata-gps.cpp
index 47592ec..2a9d82c 100644
--- a/gexiv2/gexiv2-metadata-gps.cpp
+++ b/gexiv2/gexiv2-metadata-gps.cpp
@@ -236,11 +236,10 @@ gboolean gexiv2_metadata_set_gps_info (GExiv2Metadata *self, gdouble longitude,
             exif_data ["Exif.GPSInfo.GPSAltitudeRef"] = "0";
         else
             exif_data ["Exif.GPSInfo.GPSAltitudeRef"] = "1";
-        
-        deg = (gint) floor (fabs (altitude) * denom);
-        
-        snprintf (buffer, 100, "%d/%d", deg, denom);
-        exif_data ["Exif.GPSInfo.GPSAltitude"] = buffer;
+
+        auto frac = Exiv2::floatToRationalCast(static_cast<float>(fabs(altitude)));
+
+        exif_data ["Exif.GPSInfo.GPSAltitude"] = frac;
         
         /* set latitude */
         if (latitude < 0)
diff --git a/test/gexiv2-regression.c b/test/gexiv2-regression.c
index fdde036..1c35519 100644
--- a/test/gexiv2-regression.c
+++ b/test/gexiv2-regression.c
@@ -270,6 +270,31 @@ static void test_ggo_27(void)
     gexiv2_metadata_register_xmp_namespace ("http://www.gnome.org/xmp";, "gnome");
 }
 
+static void test_ggo_45(void)
+{
+    GExiv2Metadata *meta = NULL;
+    gboolean result = FALSE;
+    gdouble lon = 0.0, lat = 0.0, alt = 0.0;
+    GError *error = NULL;
+
+    meta = gexiv2_metadata_new();
+    g_assert_nonnull(meta);
+    result = gexiv2_metadata_open_path(meta, SAMPLE_PATH "/no-metadata.jpg", &error);
+    g_assert_no_error(error);
+    g_assert_true(result);
+
+    alt = 2200.0;
+    result = gexiv2_metadata_set_gps_info(meta, lon, lat, alt);
+    g_assert_true(result);
+
+    result = gexiv2_metadata_get_gps_altitude(meta, &alt);
+    g_assert_true(result);
+    g_assert_cmpfloat_with_epsilon(alt, 2200.0, 1e-5);
+
+    g_clear_object(&meta);
+
+}
+
 int main(int argc, char *argv[static argc + 1])
 {
     g_test_init(&argc, &argv, NULL);
@@ -282,6 +307,7 @@ int main(int argc, char *argv[static argc + 1])
     g_test_add_func("/bugs/gnome/gitlab/33", test_ggo_33);
     g_test_add_func("/bugs/gnome/gitlab/27", test_ggo_27);
     g_test_add_func("/bugs/gnome/gitlab/xx", test_ggo_xx);
+    g_test_add_func("/bugs/gnome/gitlab/45", test_ggo_45);
 
     return g_test_run();
 }
diff --git a/test/python/test_metadata.py b/test/python/test_metadata.py
index e46c48b..2a98167 100644
--- a/test/python/test_metadata.py
+++ b/test/python/test_metadata.py
@@ -728,7 +728,7 @@ generated the image. When the field is left blank, it is treated as unknown.""")
             [(tag, self.metadata.get_tag_string(tag))
              for tag in self.metadata.get_exif_tags()
              if 'GPS' in tag],
-            [('Exif.GPSInfo.GPSAltitude', '10000000/1000000'),
+            [('Exif.GPSInfo.GPSAltitude', '10/1'),
              ('Exif.GPSInfo.GPSAltitudeRef', '0'),
              ('Exif.GPSInfo.GPSLatitude', '48/1 25/1 47999999/1000000'),
              ('Exif.GPSInfo.GPSLatitudeRef', 'N'),


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