@@ -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