Skip to content

Commit 847a5e8

Browse files
committed
Account for header bytes for Exif and XMP boxes (backport #2234)
1 parent 237d26b commit 847a5e8

File tree

1 file changed

+20
-22
lines changed

1 file changed

+20
-22
lines changed

src/bmffimage.cpp

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -482,10 +482,10 @@ namespace Exiv2
482482
parseTiff(Internal::Tag::cmt4, box_length);
483483
break;
484484
case TAG_exif:
485-
parseTiff(Internal::Tag::root, box_length,address+8);
485+
parseTiff(Internal::Tag::root, buffer_size, io_->tell());
486486
break;
487487
case TAG_xml:
488-
parseXmp(box_length,io_->tell());
488+
parseXmp(buffer_size, io_->tell());
489489
break;
490490
case TAG_thmb:
491491
switch (version) {
@@ -568,29 +568,27 @@ namespace Exiv2
568568

569569
void BmffImage::parseXmp(uint64_t length,uint64_t start)
570570
{
571-
if (length > 8) {
572-
enforce(start <= io_->size(), kerCorruptedMetadata);
573-
enforce(length <= io_->size() - start, kerCorruptedMetadata);
574-
575-
long restore = io_->tell() ;
576-
enforce(start <= static_cast<unsigned long>(std::numeric_limits<long>::max()), kerCorruptedMetadata);
577-
io_->seek(static_cast<long>(start),BasicIo::beg);
571+
enforce(start <= io_->size(), kerCorruptedMetadata);
572+
enforce(length <= io_->size() - start, kerCorruptedMetadata);
578573

579-
enforce(length < static_cast<unsigned long>(std::numeric_limits<long>::max()), kerCorruptedMetadata);
580-
DataBuf xmp(static_cast<long>(length+1));
581-
xmp.pData_[length]=0 ; // ensure xmp is null terminated!
582-
if ( io_->read(xmp.pData_, static_cast<long>(length)) != static_cast<long>(length) )
583-
throw Error(kerInputDataReadFailed);
584-
if ( io_->error() )
585-
throw Error(kerFailedToReadImageData);
586-
try {
587-
Exiv2::XmpParser::decode(xmpData(), std::string(reinterpret_cast<char*>(xmp.pData_)));
588-
} catch (...) {
589-
throw Error(kerFailedToReadImageData);
590-
}
574+
long restore = io_->tell() ;
575+
enforce(start <= static_cast<unsigned long>(std::numeric_limits<long>::max()), kerCorruptedMetadata);
576+
io_->seek(static_cast<long>(start),BasicIo::beg);
591577

592-
io_->seek(restore,BasicIo::beg);
578+
enforce(length < static_cast<unsigned long>(std::numeric_limits<long>::max()), kerCorruptedMetadata);
579+
DataBuf xmp(static_cast<long>(length+1));
580+
xmp.pData_[length]=0 ; // ensure xmp is null terminated!
581+
if ( io_->read(xmp.pData_, static_cast<long>(length)) != static_cast<long>(length) )
582+
throw Error(kerInputDataReadFailed);
583+
if ( io_->error() )
584+
throw Error(kerFailedToReadImageData);
585+
try {
586+
Exiv2::XmpParser::decode(xmpData(), std::string(reinterpret_cast<char*>(xmp.pData_)));
587+
} catch (...) {
588+
throw Error(kerFailedToReadImageData);
593589
}
590+
591+
io_->seek(restore,BasicIo::beg);
594592
}
595593

596594
void BmffImage::parseCr3Preview(DataBuf &data,

0 commit comments

Comments
 (0)