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 {};
}
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)
@@ -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());
}
}
}

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)
{
if (!value.validate()) {
value = "???";
}
Gtk::TreeModel::Row row = * (exifTreeModel->append (root));
row[exifColumns.action] = action;