From fc11d180136a916f7f4f11a3db85567fb9b11717 Mon Sep 17 00:00:00 2001 From: Andreas Huggel Date: Sat, 10 Dec 2005 10:36:36 +0000 Subject: [PATCH] Make sure the str argument to sscanf() is a 0 terminated C-string. Fixes Bug #447. --- src/value.cpp | 27 +++++++++++++++------------ src/value.hpp | 22 ++++++++++++++++++++-- test/bugfixes-test.sh | 4 ++++ test/data/bugfixes-test.out | 4 ++++ test/data/exiv2-bug447.jpg | Bin 0 -> 10861 bytes 5 files changed, 43 insertions(+), 14 deletions(-) create mode 100644 test/data/exiv2-bug447.jpg diff --git a/src/value.cpp b/src/value.cpp index 1a43c222..f38c3cda 100644 --- a/src/value.cpp +++ b/src/value.cpp @@ -41,6 +41,7 @@ EXIV2_RCSID("@(#) $Id$"); #include #include #include +#include #include // ***************************************************************************** @@ -393,9 +394,11 @@ namespace Exiv2 { #endif return 1; } - int scanned = sscanf(reinterpret_cast(buf), - "%4d%2d%2d", - &date_.year, &date_.month, &date_.day); + // Make the buffer a 0 terminated C-string for sscanf + char b[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + memcpy(b, reinterpret_cast(buf), 8); + int scanned = sscanf(b, "%4d%2d%2d", + &date_.year, &date_.month, &date_.day); if (scanned != 3) { #ifndef SUPPRESS_WARNINGS std::cerr << Error(29) << "\n"; @@ -414,9 +417,8 @@ namespace Exiv2 { #endif return 1; } - int scanned = sscanf(buf.data(), - "%4d-%d-%d", - &date_.year, &date_.month, &date_.day); + int scanned = sscanf(buf.c_str(), "%4d-%d-%d", + &date_.year, &date_.month, &date_.day); if (scanned != 3) { #ifndef SUPPRESS_WARNINGS std::cerr << Error(29) << "\n"; @@ -496,16 +498,17 @@ namespace Exiv2 { int TimeValue::read(const byte* buf, long len, ByteOrder /*byteOrder*/) { + // Make the buffer a 0 terminated C-string for scanTime[36] + char b[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + memcpy(b, reinterpret_cast(buf), (len < 12 ? len : 11)); // Hard coded to read HHMMSS or Iptc style times int rc = 1; if (len == 6) { // Try to read (non-standard) HHMMSS format - rc = scanTime3(reinterpret_cast(buf), - "%2d%2d%2d"); + rc = scanTime3(b, "%2d%2d%2d"); } if (len == 11) { - rc = scanTime6(reinterpret_cast(buf), - "%2d%2d%2d%1c%2d%2d"); + rc = scanTime6(b, "%2d%2d%2d%1c%2d%2d"); } #ifndef SUPPRESS_WARNINGS if (rc) { @@ -521,10 +524,10 @@ namespace Exiv2 { int rc = 1; if (buf.length() < 9) { // Try to read (non-standard) H:M:S format - rc = scanTime3(buf.data(), "%d:%d:%d"); + rc = scanTime3(buf.c_str(), "%d:%d:%d"); } else { - rc = scanTime6(buf.data(), "%d:%d:%d%1c%d:%d"); + rc = scanTime6(buf.c_str(), "%d:%d:%d%1c%d:%d"); } #ifndef SUPPRESS_WARNINGS if (rc) { diff --git a/src/value.hpp b/src/value.hpp index fb94ee7e..80602082 100644 --- a/src/value.hpp +++ b/src/value.hpp @@ -807,9 +807,27 @@ namespace Exiv2 { private: //! @name Manipulators //@{ - //! Set time from \em buf if it conforms to \em format (3 input items) + /*! + @brief Set time from \em buf if it conforms to \em format + (3 input items). + + This function only sets the hour, minute and second parts of time_. + + @param buf A 0 terminated C-string containing the time to parse. + @param format Format string for sscanf(). + @return 0 if successful, else 1. + */ int scanTime3(const char* buf, const char* format); - //! Set time from \em buf if it conforms to \em format (6 input items) + /*! + @brief Set time from \em buf if it conforms to \em format + (6 input items). + + This function sets all parts of time_. + + @param buf A 0 terminated C-string containing the time to parse. + @param format Format string for sscanf(). + @return 0 if successful, else 1. + */ int scanTime6(const char* buf, const char* format); //@} diff --git a/test/bugfixes-test.sh b/test/bugfixes-test.sh index ac697e64..e5baecf0 100755 --- a/test/bugfixes-test.sh +++ b/test/bugfixes-test.sh @@ -46,6 +46,10 @@ filename=`prep_file $num` $binpath/exiv2 -v -M'set Exif.Photo.UserComment A comment' $filename $binpath/exiv2 -pt $filename +num=447 # Problem only visible in Valgrind +filename=`prep_file $num` +$binpath/exiv2 -pi $filename + ) > $results 2>&1 diff -q $diffargs $results $good diff --git a/test/data/bugfixes-test.out b/test/data/bugfixes-test.out index 8d681a33..098173a7 100644 --- a/test/data/bugfixes-test.out +++ b/test/data/bugfixes-test.out @@ -201,3 +201,7 @@ Exif.Thumbnail.YResolution Rational 1 180 Exif.Thumbnail.ResolutionUnit Short 1 inch Exif.Thumbnail.JPEGInterchangeFormat Long 1 0 Exif.Thumbnail.JPEGInterchangeFormatLength Long 1 5448 +------> Bug 447 <------- +Iptc.Application2.Caption String 0 +Iptc.Application2.DateCreated Date 8 2005-08-09 +Iptc.Application2.TimeCreated Time 11 01:28:31-07:00 diff --git a/test/data/exiv2-bug447.jpg b/test/data/exiv2-bug447.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0b8b61a58d5cadb607998fc9b5226fa7fd1b457c GIT binary patch literal 10861 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