From 3c81b1851d236981050359dc7f815736e1cc70cc Mon Sep 17 00:00:00 2001 From: Kevin Backhouse Date: Sat, 26 Jun 2021 22:26:31 +0100 Subject: [PATCH] fix: use vector::at() rather than operator[] (#1735) * Regression test for https://github.com/Exiv2/exiv2/issues/1706 * Use vector::at() rather than operator[]. * Print to stderr when exception is caught and EXIV2_DEBUG_MESSAGES is enabled. * Check that it prints "Bad value" for the date. (cherry picked from commit f4d3adbf91e6dc4e34aee5bac7b7fd9e127a5c00) # Conflicts: # src/value.cpp --- include/exiv2/value.hpp | 34 +++++++++++------------ src/crwimage_int.cpp | 2 +- src/exif.cpp | 17 +++++++++++- src/value.cpp | 32 ++++++++++++++------- test/data/issue_1706_poc.exv | Bin 0 -> 57869 bytes tests/bugfixes/github/test_issue_1706.py | 24 ++++++++++++++++ 6 files changed, 80 insertions(+), 29 deletions(-) create mode 100644 test/data/issue_1706_poc.exv create mode 100644 tests/bugfixes/github/test_issue_1706.py diff --git a/include/exiv2/value.hpp b/include/exiv2/value.hpp index 9a7d2dba95..a754b75384 100644 --- a/include/exiv2/value.hpp +++ b/include/exiv2/value.hpp @@ -1616,7 +1616,7 @@ namespace Exiv2 { std::string ValueType::toString(long n) const { ok_ = true; - return Exiv2::toString(value_[n]); + return Exiv2::toString(value_.at(n)); } // Default implementation @@ -1624,69 +1624,69 @@ namespace Exiv2 { long ValueType::toLong(long n) const { ok_ = true; - return static_cast(value_[n]); + return static_cast(value_.at(n)); } -// #55 crash when value_[n].first == LONG_MIN +// #55 crash when value_.at(n).first == LONG_MIN #define LARGE_INT 1000000 // Specialization for rational template<> inline long ValueType::toLong(long n) const { - ok_ = (value_[n].second != 0 && INT_MIN < value_[n].first && value_[n].first < INT_MAX ); + ok_ = (value_.at(n).second != 0 && INT_MIN < value_.at(n).first && value_.at(n).first < INT_MAX ); if (!ok_) return 0; - return value_[n].first / value_[n].second; + return value_.at(n).first / value_.at(n).second; } // Specialization for unsigned rational template<> inline long ValueType::toLong(long n) const { - ok_ = (value_[n].second != 0 && value_[n].first < LARGE_INT); + ok_ = (value_.at(n).second != 0 && value_.at(n).first < LARGE_INT); if (!ok_) return 0; - return value_[n].first / value_[n].second; + return value_.at(n).first / value_.at(n).second; } // Default implementation template float ValueType::toFloat(long n) const { ok_ = true; - return static_cast(value_[n]); + return static_cast(value_.at(n)); } // Specialization for rational template<> inline float ValueType::toFloat(long n) const { - ok_ = (value_[n].second != 0); + ok_ = (value_.at(n).second != 0); if (!ok_) return 0.0f; - return static_cast(value_[n].first) / value_[n].second; + return static_cast(value_.at(n).first) / value_.at(n).second; } // Specialization for unsigned rational template<> inline float ValueType::toFloat(long n) const { - ok_ = (value_[n].second != 0); + ok_ = (value_.at(n).second != 0); if (!ok_) return 0.0f; - return static_cast(value_[n].first) / value_[n].second; + return static_cast(value_.at(n).first) / value_.at(n).second; } // Default implementation template Rational ValueType::toRational(long n) const { ok_ = true; - return Rational(value_[n], 1); + return Rational(value_.at(n), 1); } // Specialization for rational template<> inline Rational ValueType::toRational(long n) const { ok_ = true; - return Rational(value_[n].first, value_[n].second); + return Rational(value_.at(n).first, value_.at(n).second); } // Specialization for unsigned rational template<> inline Rational ValueType::toRational(long n) const { ok_ = true; - return Rational(value_[n].first, value_[n].second); + return Rational(value_.at(n).first, value_.at(n).second); } // Specialization for float. template<> @@ -1694,7 +1694,7 @@ namespace Exiv2 { { ok_ = true; // Warning: This is a very simple conversion, see floatToRationalCast() - return floatToRationalCast(value_[n]); + return floatToRationalCast(value_.at(n)); } // Specialization for double. template<> @@ -1702,7 +1702,7 @@ namespace Exiv2 { { ok_ = true; // Warning: This is a very simple conversion, see floatToRationalCast() - return floatToRationalCast(static_cast(value_[n])); + return floatToRationalCast(static_cast(value_.at(n))); } template diff --git a/src/crwimage_int.cpp b/src/crwimage_int.cpp index 7a1003201e..2ce2ff1402 100644 --- a/src/crwimage_int.cpp +++ b/src/crwimage_int.cpp @@ -908,7 +908,7 @@ namespace Exiv2 { assert(pCrwMapping != 0); ULongValue v; v.read(ciffComponent.pData(), 8, byteOrder); - time_t t = v.value_[0]; + time_t t = v.value_.at(0); struct tm* tm = std::localtime(&t); if (tm) { const size_t m = 20; diff --git a/src/exif.cpp b/src/exif.cpp index 2eda4904b8..bb7b69db47 100644 --- a/src/exif.cpp +++ b/src/exif.cpp @@ -229,7 +229,22 @@ namespace Exiv2 { fct = nullptr; } } - if ( fct ) fct(os, value(), pMetadata); + if ( fct ) { + // https://github.com/Exiv2/exiv2/issues/1706 + // Sometimes the type of the value doesn't match what the + // print function expects. (The expected types are stored + // in the TagInfo tables, but they are not enforced when the + // metadata is parsed.) These type mismatches can sometimes + // cause a std::out_of_range exception to be thrown. + try { + fct(os, value(), pMetadata); + } catch (std::out_of_range&) { + os << "Bad value"; +#ifdef EXIV2_DEBUG_MESSAGES + std::cerr << "Caught std::out_of_range exception in Exifdatum::write().\n"; +#endif + } + } return os; } diff --git a/src/value.cpp b/src/value.cpp index eedc20327b..cccaa508a8 100644 --- a/src/value.cpp +++ b/src/value.cpp @@ -203,7 +203,7 @@ namespace Exiv2 { { std::vector::size_type end = value_.size(); for (std::vector::size_type i = 0; i != end; ++i) { - os << static_cast(value_[i]); + os << static_cast(value_.at(i)); if (i < end - 1) os << " "; } return os; @@ -212,7 +212,7 @@ namespace Exiv2 { std::string DataValue::toString(long n) const { std::ostringstream os; - os << static_cast(value_[n]); + os << static_cast(value_.at(n)); ok_ = !os.fail(); return os.str(); } @@ -220,19 +220,23 @@ namespace Exiv2 { long DataValue::toLong(long n) const { ok_ = true; - return value_[n]; + return value_.at(n); } float DataValue::toFloat(long n) const { ok_ = true; - return value_[n]; + return value_.at(n); } Rational DataValue::toRational(long n) const { ok_ = true; +<<<<<<< HEAD return {value_[n], 1}; +======= + return Rational(value_.at(n), 1); +>>>>>>> f4d3adbf (fix: use vector::at() rather than operator[] (#1735)) } StringValueBase::StringValueBase(TypeId typeId) @@ -296,19 +300,23 @@ namespace Exiv2 { long StringValueBase::toLong(long n) const { ok_ = true; - return value_[n]; + return value_.at(n); } float StringValueBase::toFloat(long n) const { ok_ = true; - return value_[n]; + return value_.at(n); } Rational StringValueBase::toRational(long n) const { ok_ = true; +<<<<<<< HEAD return {value_[n], 1}; +======= + return Rational(value_.at(n), 1); +>>>>>>> f4d3adbf (fix: use vector::at() rather than operator[] (#1735)) } StringValue::StringValue() @@ -340,8 +348,12 @@ namespace Exiv2 { { value_ = buf; // ensure count>0 and nul terminated # https://github.com/Exiv2/exiv2/issues/1484 +<<<<<<< HEAD if (value_.empty() || value_[value_.size() - 1] != '\0') value_ += '\0'; +======= + if (value_.size() == 0 || value_.at(value_.size()-1) != '\0') value_ += '\0'; +>>>>>>> f4d3adbf (fix: use vector::at() rather than operator[] (#1735)) return 0; } @@ -740,22 +752,22 @@ namespace Exiv2 { std::string XmpArrayValue::toString(long n) const { ok_ = true; - return value_[n]; + return value_.at(n); } long XmpArrayValue::toLong(long n) const { - return parseLong(value_[n], ok_); + return parseLong(value_.at(n), ok_); } float XmpArrayValue::toFloat(long n) const { - return parseFloat(value_[n], ok_); + return parseFloat(value_.at(n), ok_); } Rational XmpArrayValue::toRational(long n) const { - return parseRational(value_[n], ok_); + return parseRational(value_.at(n), ok_); } XmpArrayValue* XmpArrayValue::clone_() const diff --git a/test/data/issue_1706_poc.exv b/test/data/issue_1706_poc.exv new file mode 100644 index 0000000000000000000000000000000000000000..375e4fa7ccf9b13fbdabf6456cee47c922d1fccc GIT binary patch literal 57869 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 literal 0 HcmV?d00001 diff --git a/tests/bugfixes/github/test_issue_1706.py b/tests/bugfixes/github/test_issue_1706.py new file mode 100644 index 0000000000..ef31c9bcd8 --- /dev/null +++ b/tests/bugfixes/github/test_issue_1706.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- + +from system_tests import CaseMeta, path + + +class InvalidDateXMP(metaclass=CaseMeta): + """ + Regression test for the bug described in: + https://github.com/Exiv2/exiv2/issues/1706 + """ + url = "https://github.com/Exiv2/exiv2/issues/1706" + + filename = path("$data_path/issue_1706_poc.exv") + commands = ["$exiv2 -PE $filename"] + + stderr = [ +"""Error: Directory Photo with 65280 entries considered invalid; not read. +""" +] + retval = [0] + + def compare_stdout(self, i, command, got_stdout, expected_stdout): + # Check that it printed "Bad value" for the date. + self.assertRegex(got_stdout, "Exif.PentaxDng.Date\\s+Long\\s+1\\s+Bad value")