diff options
| author | Tomas Bzatek <tbzatek@users.sourceforge.net> | 2013-03-17 13:37:13 +0100 |
|---|---|---|
| committer | Tomas Bzatek <tbzatek@users.sourceforge.net> | 2013-03-17 13:37:13 +0100 |
| commit | ec98d1712dbaad2a1c995399f61843cd801a3063 (patch) | |
| tree | c7de054cda89ed8854b426c80c66987dcf205514 | |
| parent | e90b5572f0006b6c4913e31fd83024d2da3dd3a5 (diff) | |
| download | cataract-ec98d1712dbaad2a1c995399f61843cd801a3063.tar.xz | |
Dup exiv2 strings immediately
Weird things happened to me in the past while debugging, it's like the
lifetime of returned const strings is unknown and we can't really rely
on them, so let's duplicate them immediately. This will not however fully
solve the issue but rather minimizes the risk.
Need to investigate what's going on, don't really want to start using
mutexes to ensure full thread safety. Moreover we have separate objects
in each thread.
| -rw-r--r-- | src/jpeg-utils.cpp | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/src/jpeg-utils.cpp b/src/jpeg-utils.cpp index ece40e4..d7382c8 100644 --- a/src/jpeg-utils.cpp +++ b/src/jpeg-utils.cpp @@ -154,6 +154,11 @@ get_real_key_name (const gchar *key) return key; } + +/* Returns newly allocated string */ +/* FIXME: for some reason exiv2 returns const strings with unknown lifetime, can't really trust the library */ +#define exiv2_str_val(data,key) g_strdup(data[key].toString().c_str()) + static gboolean iptc_has_key (Exiv2::IptcData iptcData, const char *key) { @@ -188,14 +193,14 @@ get_exif_data (ExifData *exif, const gchar *key) if (g_str_has_prefix (key, "Exif.")) { Exiv2::ExifData &exifData = exif->priv->image->exifData(); if (! exifData.empty()) { - return g_strdup (exifData[key].toString().c_str()); + return exiv2_str_val (exifData, key); } } if (g_str_has_prefix (key, "Iptc.")) { Exiv2::IptcData &iptcData = exif->priv->image->iptcData(); if (iptc_has_key (iptcData, key)) { - return g_strdup (iptcData[key].toString().c_str()); + return exiv2_str_val (iptcData, key); } } @@ -229,18 +234,18 @@ get_exif_data_fixed (ExifData *exif, const gchar *key) g_str_equal (key, "Exif.Photo.DateTimeOriginal") || g_str_equal (key, "Exif.Photo.DateTimeDigitized") || g_str_equal (key, "Exif.Image.DateTime")) { - const char *val = NULL; + gchar *val = NULL; try { - val = exifData["Exif.Photo.DateTimeOriginal"].toString().c_str(); + val = exiv2_str_val (exifData, "Exif.Photo.DateTimeOriginal"); } catch (...) { } if (! val || strlen (val) == 0) try { - val = exifData["Exif.Photo.DateTimeDigitized"].toString().c_str(); + val = exiv2_str_val (exifData, "Exif.Photo.DateTimeDigitized"); } catch (...) { } if (! val || strlen (val) == 0) try { /* usually a modification date */ - val = exifData["Exif.Image.DateTime"].toString().c_str(); + val = exiv2_str_val (exifData, "Exif.Image.DateTime"); } catch (...) { } if (val && strlen (val) > 0) { @@ -270,6 +275,7 @@ get_exif_data_fixed (ExifData *exif, const gchar *key) if (res) return res; } + g_free (val); } if (g_str_equal (key, EXIF_EXPOSURE)) { @@ -552,14 +558,14 @@ static gboolean shift_exif_time (Exiv2::ExifData& exifData, const char *key, int amount) { struct tm *tt; - const char *s; + gchar *s; gchar *st; gboolean res; res = FALSE; try { if (exifData[key].count() > 0) { - s = exifData[key].toString().c_str(); + s = exiv2_str_val (exifData, key); if (s && strlen (s) > 0) { tt = parse_exif_date (s); @@ -573,6 +579,7 @@ shift_exif_time (Exiv2::ExifData& exifData, const char *key, int amount) res = TRUE; } } + g_free (s); } } catch (...) { } |
