[gexiv2/wip/45: 3/3] Fix overflow in altitude to fraction conversion
- From: Jens Georg <jensgeorg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gexiv2/wip/45: 3/3] Fix overflow in altitude to fraction conversion
- Date: Tue, 10 Sep 2019 09:06:26 +0000 (UTC)
commit 99c8a55435b5eb3aa706f56c663f11c9d042c433
Author: Jens Georg <mail jensge org>
Date: Tue Sep 10 08:21:17 2019 +0200
Fix overflow in altitude to fraction conversion
The fixed denominator of 1000000 in the conversion causes an integer
overflow for altitudes > INT_MAX/1000000 meters. Use exiv2's float
conversion function to to the conversion to a fraction instead of doing
it ourselves.
Fixes #45
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 8d612df..4fb99a7 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 04606f6..a10240e 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]