Validate EXIF UTF-8 strings (fixes #5923)

This commit is contained in:
Flössie
2020-10-03 10:18:23 +02:00
parent 0e1f623713
commit b311b5b6d2
2 changed files with 33 additions and 21 deletions

View File

@@ -69,6 +69,15 @@ T getFromFrame(
return {}; 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<RawMetaDataLocation> rml, bool firstFrameOnly) FramesMetaData* FramesMetaData::fromFile(const Glib::ustring& fname, std::unique_ptr<RawMetaDataLocation> rml, bool firstFrameOnly)
@@ -122,7 +131,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory*
} }
if (tag) { if (tag) {
make = tag->valueToString(); make = validateUft8(tag->valueToString());
// Same dcraw treatment // Same dcraw treatment
for (const auto& corp : { for (const auto& corp : {
@@ -158,7 +167,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory*
tag = newFrameRootDir->findTagUpward("Model"); tag = newFrameRootDir->findTagUpward("Model");
if (tag) { if (tag) {
model = tag->valueToString(); model = validateUft8(tag->valueToString());
} }
if (!model.empty()) { if (!model.empty()) {
@@ -193,14 +202,14 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory*
if (model == "Unknown") { if (model == "Unknown") {
tag = newFrameRootDir->findTag("UniqueCameraModel"); tag = newFrameRootDir->findTag("UniqueCameraModel");
if (tag) { if (tag) {
model = tag->valueToString(); model = validateUft8(tag->valueToString());
} }
} }
tag = newFrameRootDir->findTagUpward("Orientation"); tag = newFrameRootDir->findTagUpward("Orientation");
if (tag) { if (tag) {
orientation = tag->valueToString(); orientation = validateUft8(tag->valueToString());
} }
// Look for Rating metadata in the following order: // Look for Rating metadata in the following order:
@@ -310,7 +319,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory*
} }
if (tag) { if (tag) {
serial = tag->valueToString(); serial = validateUft8(tag->valueToString());
} }
// guess lens... // guess lens...
@@ -320,7 +329,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory*
if (!make.compare(0, 8, "FUJIFILM")) { if (!make.compare(0, 8, "FUJIFILM")) {
if (exif->getTag("LensModel")) { if (exif->getTag("LensModel")) {
lens = exif->getTag("LensModel")->valueToString(); lens = validateUft8(exif->getTag("LensModel")->valueToString());
} }
} else if (!make.compare(0, 4, "SONY")) { } else if (!make.compare(0, 4, "SONY")) {
if (iso_speed == 65535 || iso_speed == 0) { 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 rtexif::Tag* const lens_make = exif->getTag(0xA433);
const std::string make = const std::string make =
lens_make lens_make
? lens_make->valueToString() ? validateUft8(lens_make->valueToString())
: std::string(); : std::string();
const std::string model = lens_model->valueToString(); const std::string model = validateUft8(lens_model->valueToString());
if (!model.empty()) { if (!model.empty()) {
lens = make; lens = make;
@@ -382,7 +391,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory*
bool lensOk = false; bool lensOk = false;
if (mnote->getTag("LensData")) { if (mnote->getTag("LensData")) {
std::string ldata = mnote->getTag("LensData")->valueToString(); std::string ldata = validateUft8(mnote->getTag("LensData")->valueToString());
size_t pos; size_t pos;
if (ldata.size() > 10 && (pos = ldata.find("Lens = ")) != Glib::ustring::npos) { 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? size_t pos = lens.find("$FL$"); // is there a placeholder for focallength?
if (pos != Glib::ustring::npos) { // then fill in 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")) { 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 if (ltype.find("MF = Yes") != Glib::ustring::npos) { // check, whether it's a MF lens, should be always
lens = lens.replace(0, 7, "MF"); lens = lens.replace(0, 7, "MF");
@@ -416,7 +425,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory*
} }
if (!lensOk && mnote->getTag("Lens")) { 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; size_t i = 0, j = 0;
double n[4] = {0.0}; double n[4] = {0.0};
@@ -453,7 +462,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory*
// Look whether it's MF or AF // Look whether it's MF or AF
if (mnote->getTag("LensType")) { 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 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' 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) {
if (lt->toInt()) { if (lt->toInt()) {
std::string ldata = lt->valueToString (); const std::string ldata = validateUft8(lt->valueToString());
if (ldata.size() > 1) { if (ldata.size() > 1) {
found = true; found = true;
@@ -499,7 +508,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory*
lt = mnote->findTag("LensID"); lt = mnote->findTag("LensID");
if (lt) { if (lt) {
std::string ldata = lt->valueToString(); const std::string ldata = validateUft8(lt->valueToString());
if (ldata.size() > 1) { if (ldata.size() > 1) {
lens = ldata; lens = ldata;
@@ -521,7 +530,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory*
} }
if (mnote->getTag("LensType")) { 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 // 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 // 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") { 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")) { } else if (!make.compare (0, 4, "SONY") || !make.compare (0, 6, "KONICA")) {
if (mnote->getTag ("LensID")) { if (mnote->getTag ("LensID")) {
lens = mnote->getTag ("LensID")->valueToString (); lens = validateUft8(mnote->getTag("LensID")->valueToString());
if (lens == "Unknown") { if (lens == "Unknown") {
lens_from_make_and_model(); lens_from_make_and_model();
} }
@@ -558,7 +567,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory*
rtexif::TagDirectory* eq = mnote->getTag("Equipment")->getDirectory(); rtexif::TagDirectory* eq = mnote->getTag("Equipment")->getDirectory();
if (eq->getTag("LensType")) { if (eq->getTag("LensType")) {
lens = eq->getTag("LensType")->valueToString(); lens = validateUft8(eq->getTag("LensType")->valueToString());
} }
} }
if (lens == "Unknown") { if (lens == "Unknown") {
@@ -566,7 +575,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory*
} }
} else if (!make.compare (0, 9, "Panasonic")) { } else if (!make.compare (0, 9, "Panasonic")) {
if (mnote->getTag ("LensType")) { 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) { if (panalens.find("LUMIX") != Glib::ustring::npos) {
lens = "Panasonic " + panalens; lens = "Panasonic " + panalens;
@@ -576,9 +585,9 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory*
} }
} }
} else if (exif->getTag("DNGLensInfo")) { } 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")) { } else if (!lens_from_make_and_model() && exif->getTag ("LensInfo")) {
lens = exif->getTag("LensInfo")->valueToString(); lens = validateUft8(exif->getTag("LensInfo")->valueToString());
} }
} }
} }

View File

@@ -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) 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)); Gtk::TreeModel::Row row = * (exifTreeModel->append (root));
row[exifColumns.action] = action; row[exifColumns.action] = action;