summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTomas Bzatek <tbzatek@users.sourceforge.net>2013-03-17 13:37:13 +0100
committerTomas Bzatek <tbzatek@users.sourceforge.net>2013-03-17 13:37:13 +0100
commitec98d1712dbaad2a1c995399f61843cd801a3063 (patch)
treec7de054cda89ed8854b426c80c66987dcf205514 /src
parente90b5572f0006b6c4913e31fd83024d2da3dd3a5 (diff)
downloadcataract-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.
Diffstat (limited to 'src')
-rw-r--r--src/jpeg-utils.cpp23
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 (...) { }