diff --git a/rtengine/imagedata.cc b/rtengine/imagedata.cc index cedf08ca0..16b6a4c91 100644 --- a/rtengine/imagedata.cc +++ b/rtengine/imagedata.cc @@ -69,6 +69,15 @@ T getFromFrame( return {}; } +const std::string& validateUft8(const std::string& str, const std::string& on_error = "???") +{ + if (Glib::ustring(str).validate()) { + return str; + } + + return on_error; +} + } FramesMetaData* FramesMetaData::fromFile(const Glib::ustring& fname, std::unique_ptr rml, bool firstFrameOnly) @@ -122,7 +131,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* } if (tag) { - make = tag->valueToString(); + make = validateUft8(tag->valueToString()); // Same dcraw treatment for (const auto& corp : { @@ -158,7 +167,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* tag = newFrameRootDir->findTagUpward("Model"); if (tag) { - model = tag->valueToString(); + model = validateUft8(tag->valueToString()); } if (!model.empty()) { @@ -193,14 +202,14 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* if (model == "Unknown") { tag = newFrameRootDir->findTag("UniqueCameraModel"); if (tag) { - model = tag->valueToString(); + model = validateUft8(tag->valueToString()); } } tag = newFrameRootDir->findTagUpward("Orientation"); if (tag) { - orientation = tag->valueToString(); + orientation = validateUft8(tag->valueToString()); } // Look for Rating metadata in the following order: @@ -310,7 +319,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* } if (tag) { - serial = tag->valueToString(); + serial = validateUft8(tag->valueToString()); } // guess lens... @@ -320,7 +329,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* if (!make.compare(0, 8, "FUJIFILM")) { if (exif->getTag("LensModel")) { - lens = exif->getTag("LensModel")->valueToString(); + lens = validateUft8(exif->getTag("LensModel")->valueToString()); } } else if (!make.compare(0, 4, "SONY")) { if (iso_speed == 65535 || iso_speed == 0) { @@ -347,9 +356,9 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* const rtexif::Tag* const lens_make = exif->getTag(0xA433); const std::string make = lens_make - ? lens_make->valueToString() + ? validateUft8(lens_make->valueToString()) : std::string(); - const std::string model = lens_model->valueToString(); + const std::string model = validateUft8(lens_model->valueToString()); if (!model.empty()) { lens = make; @@ -382,7 +391,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* bool lensOk = false; if (mnote->getTag("LensData")) { - std::string ldata = mnote->getTag("LensData")->valueToString(); + std::string ldata = validateUft8(mnote->getTag("LensData")->valueToString()); size_t pos; if (ldata.size() > 10 && (pos = ldata.find("Lens = ")) != Glib::ustring::npos) { @@ -394,10 +403,10 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* size_t pos = lens.find("$FL$"); // is there a placeholder for focallength? if (pos != Glib::ustring::npos) { // then fill in focallength - lens = lens.replace(pos, 4, exif->getTag("FocalLength")->valueToString()); + lens = lens.replace(pos, 4, validateUft8(exif->getTag("FocalLength")->valueToString())); if (mnote->getTag("LensType")) { - std::string ltype = mnote->getTag("LensType")->valueToString(); + const std::string ltype = validateUft8(mnote->getTag("LensType")->valueToString()); if (ltype.find("MF = Yes") != Glib::ustring::npos) { // check, whether it's a MF lens, should be always lens = lens.replace(0, 7, "MF"); @@ -416,7 +425,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* } if (!lensOk && mnote->getTag("Lens")) { - std::string ldata = mnote->getTag("Lens")->valueToString(); + const std::string ldata = validateUft8(mnote->getTag("Lens")->valueToString()); size_t i = 0, j = 0; double n[4] = {0.0}; @@ -453,7 +462,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* // Look whether it's MF or AF if (mnote->getTag("LensType")) { - std::string ltype = mnote->getTag("LensType")->valueToString(); + const std::string ltype = validateUft8(mnote->getTag("LensType")->valueToString()); if (ltype.find("MF = Yes") != Glib::ustring::npos) { // check, whether it's a MF lens lens = lens.replace(0, 7, "MF"); // replace 'Unknwon' with 'MF' @@ -478,7 +487,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* if (lt) { if (lt->toInt()) { - std::string ldata = lt->valueToString (); + const std::string ldata = validateUft8(lt->valueToString()); if (ldata.size() > 1) { found = true; @@ -499,7 +508,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* lt = mnote->findTag("LensID"); if (lt) { - std::string ldata = lt->valueToString(); + const std::string ldata = validateUft8(lt->valueToString()); if (ldata.size() > 1) { lens = ldata; @@ -521,7 +530,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* } if (mnote->getTag("LensType")) { - lens = mnote->getTag ("LensType")->valueToString(); + lens = validateUft8(mnote->getTag("LensType")->valueToString()); // If MakeNotes are vague, fall back to Exif LensMake and LensModel if set // https://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Pentax.html#LensType if (lens == "M-42 or No Lens" || lens == "K or M Lens" || lens == "A Series Lens" || lens == "Sigma") { @@ -548,7 +557,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* } } else if (!make.compare (0, 4, "SONY") || !make.compare (0, 6, "KONICA")) { if (mnote->getTag ("LensID")) { - lens = mnote->getTag ("LensID")->valueToString (); + lens = validateUft8(mnote->getTag("LensID")->valueToString()); if (lens == "Unknown") { lens_from_make_and_model(); } @@ -558,7 +567,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* rtexif::TagDirectory* eq = mnote->getTag("Equipment")->getDirectory(); if (eq->getTag("LensType")) { - lens = eq->getTag("LensType")->valueToString(); + lens = validateUft8(eq->getTag("LensType")->valueToString()); } } if (lens == "Unknown") { @@ -566,7 +575,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* } } else if (!make.compare (0, 9, "Panasonic")) { if (mnote->getTag ("LensType")) { - std::string panalens = mnote->getTag("LensType")->valueToString(); + const std::string panalens = validateUft8(mnote->getTag("LensType")->valueToString()); if (panalens.find("LUMIX") != Glib::ustring::npos) { lens = "Panasonic " + panalens; @@ -576,9 +585,9 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* } } } else if (exif->getTag("DNGLensInfo")) { - lens = exif->getTag("DNGLensInfo")->valueToString(); + lens = validateUft8(exif->getTag("DNGLensInfo")->valueToString()); } else if (!lens_from_make_and_model() && exif->getTag ("LensInfo")) { - lens = exif->getTag("LensInfo")->valueToString(); + lens = validateUft8(exif->getTag("LensInfo")->valueToString()); } } } diff --git a/rtgui/exifpanel.cc b/rtgui/exifpanel.cc index 341d0f303..3f6bbacb5 100644 --- a/rtgui/exifpanel.cc +++ b/rtgui/exifpanel.cc @@ -209,6 +209,9 @@ void ExifPanel::setImageData (const FramesMetaData* id) Gtk::TreeModel::Children ExifPanel::addTag (const Gtk::TreeModel::Children& root, Glib::ustring field, Glib::ustring value, rtexif::ActionCode action, bool editable) { + if (!value.validate()) { + value = "???"; + } Gtk::TreeModel::Row row = * (exifTreeModel->append (root)); row[exifColumns.action] = action;