8847c70
--- trunk/src/exif.cpp	2007/09/24 14:30:10	1231
8847c70
+++ trunk/src/exif.cpp	2007/12/14 17:13:21	1346
8847c70
@@ -212,11 +212,13 @@
8847c70
         ExifData::const_iterator sizes;
8847c70
         ExifKey key("Exif.Thumbnail.StripByteCounts");
8847c70
         sizes = exifData.findKey(key);
8847c70
-        if (sizes == exifData.end()) return 2;
8847c70
+        if (sizes == exifData.end()) return 1;
8847c70
 
8847c70
-        long totalSize = 0;
8847c70
+        uint32_t totalSize = 0;
8847c70
         for (long i = 0; i < sizes->count(); ++i) {
8847c70
-            totalSize += sizes->toLong(i);
8847c70
+            uint32_t size = sizes->toLong(i);
8847c70
+            if (size > 0xffffffff - totalSize) return 1;
8847c70
+            totalSize += size;
8847c70
         }
8847c70
         DataBuf stripsBuf(totalSize);
8847c70
 
8847c70
@@ -225,21 +227,23 @@
8847c70
         ExifData::iterator stripOffsets;
8847c70
         key = ExifKey("Exif.Thumbnail.StripOffsets");
8847c70
         stripOffsets = exifData.findKey(key);
8847c70
-        if (stripOffsets == exifData.end()) return 2;
8847c70
-        if (stripOffsets->count() != sizes->count()) return 2;
8847c70
+        if (stripOffsets == exifData.end()) return 1;
8847c70
+        if (stripOffsets->count() != sizes->count()) return 1;
8847c70
 
8847c70
         std::ostringstream os; // for the strip offsets
8847c70
-        long currentOffset = 0;
8847c70
-        long firstOffset = stripOffsets->toLong(0);
8847c70
-        long lastOffset = 0;
8847c70
-        long lastSize = 0;
8847c70
+        uint32_t currentOffset = 0;
8847c70
+        uint32_t firstOffset = stripOffsets->toLong(0);
8847c70
+        uint32_t lastOffset = 0;
8847c70
+        uint32_t lastSize = 0;
8847c70
         for (long i = 0; i < stripOffsets->count(); ++i) {
8847c70
-            long offset = stripOffsets->toLong(i);
8847c70
+            uint32_t offset = stripOffsets->toLong(i);
8847c70
             lastOffset = offset;
8847c70
-            long size = sizes->toLong(i);
8847c70
+            uint32_t size = sizes->toLong(i);
8847c70
             lastSize = size;
8847c70
-            if (len < offset + size) return 1;
8847c70
-
8847c70
+            if (   size > 0xffffffff - offset
8847c70
+                || static_cast<uint32_t>(len) < offset + size) {
8847c70
+                return 2;
8847c70
+            }
8847c70
             std::memcpy(stripsBuf.pData_ + currentOffset, buf + offset, size);
8847c70
             os << currentOffset << " ";
8847c70
             currentOffset += size;
8847c70
@@ -300,12 +304,15 @@
8847c70
         ExifKey key("Exif.Thumbnail.JPEGInterchangeFormat");
8847c70
         ExifData::iterator format = exifData.findKey(key);
8847c70
         if (format == exifData.end()) return 1;
8847c70
-        long offset = format->toLong();
8847c70
+        uint32_t offset = format->toLong();
8847c70
         key = ExifKey("Exif.Thumbnail.JPEGInterchangeFormatLength");
8847c70
         ExifData::const_iterator length = exifData.findKey(key);
8847c70
         if (length == exifData.end()) return 1;
8847c70
-        long size = length->toLong();
8847c70
-        if (len < offset + size) return 2;
8847c70
+        uint32_t size = length->toLong();
8847c70
+        if (   size > 0xffffffff - offset
8847c70
+            || static_cast<uint32_t>(len) < offset + size) {
8847c70
+            return 2;
8847c70
+        }
8847c70
         format->setDataArea(buf + offset, size);
8847c70
         format->setValue("0");
8847c70
         if (pIfd1) {
8847c70
@@ -592,8 +599,14 @@
8847c70
         if (pIopIfd_) add(pIopIfd_->begin(), pIopIfd_->end(), byteOrder());
8847c70
         if (pGpsIfd_) add(pGpsIfd_->begin(), pGpsIfd_->end(), byteOrder());
8847c70
         if (pIfd1_)   add(pIfd1_->begin(),   pIfd1_->end(),   byteOrder());
8847c70
-        // Read the thumbnail (but don't worry whether it was successful or not)
8847c70
-        readThumbnail();
8847c70
+        // Finally, read the thumbnail
8847c70
+        rc = readThumbnail();
8847c70
+        if (0 < rc) {
8847c70
+#ifndef SUPPRESS_WARNINGS
8847c70
+            std::cerr << "Warning: Failed to read thumbnail, rc = "
8847c70
+                      << rc << "\n";
8847c70
+#endif
8847c70
+        }
8847c70
 
8847c70
         return 0;
8847c70
     } // ExifData::load