Skip to content

Commit d4c7e11

Browse files
authored
Merge pull request #2234 from Exiv2/fix_2233
Account for header bytes for Exif and XMP boxes
2 parents 1ff0950 + 4f9bed2 commit d4c7e11

File tree

6 files changed

+134
-21
lines changed

6 files changed

+134
-21
lines changed

src/bmffimage.cpp

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -437,10 +437,10 @@ long BmffImage::boxHandler(std::ostream& out /* = std::cout*/, Exiv2::PrintStruc
437437
parseTiff(Internal::Tag::cmt4, box_length);
438438
break;
439439
case TAG_exif:
440-
parseTiff(Internal::Tag::root, box_length, address + 8);
440+
parseTiff(Internal::Tag::root, buffer_size, io_->tell());
441441
break;
442442
case TAG_xml:
443-
parseXmp(box_length, io_->tell());
443+
parseXmp(buffer_size, io_->tell());
444444
break;
445445
case TAG_thmb:
446446
switch (version) {
@@ -521,28 +521,26 @@ void BmffImage::parseTiff(uint32_t root_tag, uint64_t length) {
521521
}
522522

523523
void BmffImage::parseXmp(uint64_t length, uint64_t start) {
524-
if (length > 8) {
525-
enforce(start <= io_->size(), ErrorCode::kerCorruptedMetadata);
526-
enforce(length <= io_->size() - start, ErrorCode::kerCorruptedMetadata);
527-
528-
long restore = io_->tell();
529-
io_->seek(static_cast<long>(start), BasicIo::beg);
524+
enforce(start <= io_->size(), ErrorCode::kerCorruptedMetadata);
525+
enforce(length <= io_->size() - start, ErrorCode::kerCorruptedMetadata);
530526

531-
auto lengthSizeT = static_cast<size_t>(length);
532-
DataBuf xmp(lengthSizeT + 1);
533-
xmp.write_uint8(lengthSizeT, 0); // ensure xmp is null terminated!
534-
if (io_->read(xmp.data(), lengthSizeT) != lengthSizeT)
535-
throw Error(ErrorCode::kerInputDataReadFailed);
536-
if (io_->error())
537-
throw Error(ErrorCode::kerFailedToReadImageData);
538-
try {
539-
Exiv2::XmpParser::decode(xmpData(), std::string(xmp.c_str()));
540-
} catch (...) {
541-
throw Error(ErrorCode::kerFailedToReadImageData);
542-
}
527+
long restore = io_->tell();
528+
io_->seek(static_cast<long>(start), BasicIo::beg);
543529

544-
io_->seek(restore, BasicIo::beg);
530+
auto lengthSizeT = static_cast<size_t>(length);
531+
DataBuf xmp(lengthSizeT + 1);
532+
xmp.write_uint8(lengthSizeT, 0); // ensure xmp is null terminated!
533+
if (io_->read(xmp.data(), lengthSizeT) != lengthSizeT)
534+
throw Error(ErrorCode::kerInputDataReadFailed);
535+
if (io_->error())
536+
throw Error(ErrorCode::kerFailedToReadImageData);
537+
try {
538+
Exiv2::XmpParser::decode(xmpData(), std::string(xmp.c_str()));
539+
} catch (...) {
540+
throw Error(ErrorCode::kerFailedToReadImageData);
545541
}
542+
543+
io_->seek(restore, BasicIo::beg);
546544
}
547545

548546
/// \todo instead of passing the last 4 parameters, pass just one and build the different offsets inside

test/data/issue_2233_poc1.jxl

18.6 KB
Binary file not shown.

test/data/issue_2233_poc2.jxl

18.6 KB
Binary file not shown.
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
Exif.Image.ImageWidth Long 1 160 160
2+
Exif.Image.ImageLength Long 1 97 97
3+
Exif.Image.BitsPerSample Short 3 8 8 8 8 8 8
4+
Exif.Image.Orientation Short 1 1 top, left
5+
Exif.Image.XResolution Rational 1 300/1 300
6+
Exif.Image.YResolution Rational 1 300/1 300
7+
Exif.Image.ResolutionUnit Short 1 2 inch
8+
Exif.Image.Software Ascii 13 GIMP 2.99.11 GIMP 2.99.11
9+
Exif.Image.DateTime Ascii 20 2022:05:10 17:10:08 2022:05:10 17:10:08
10+
Exif.Image.ExifTag Long 1 202 202
11+
Exif.Photo.ColorSpace Short 1 1 sRGB
12+
Exif.Image.GPSTag Long 1 220 220
13+
Exif.GPSInfo.GPSAltitude Rational 1 0/100 0.0 m
14+
Xmp.xmpMM.DocumentID XmpText 52 gimp:docid:gimp:044333cc-8cd4-44da-a3f7-b4d9ae9ee740 gimp:docid:gimp:044333cc-8cd4-44da-a3f7-b4d9ae9ee740
15+
Xmp.xmpMM.InstanceID XmpText 44 xmp.iid:b9cf7f00-cf00-4264-a8f8-bccde48e0f1a xmp.iid:b9cf7f00-cf00-4264-a8f8-bccde48e0f1a
16+
Xmp.xmpMM.OriginalDocumentID XmpText 44 xmp.did:6589fec5-f1c4-4e37-b7ba-f58bfcc61271 xmp.did:6589fec5-f1c4-4e37-b7ba-f58bfcc61271
17+
Xmp.xmpMM.History XmpText 0 type="Seq"
18+
Xmp.xmpMM.History[1] XmpText 0 type="Struct"
19+
Xmp.xmpMM.History[1]/stEvt:action XmpText 5 saved saved
20+
Xmp.xmpMM.History[1]/stEvt:changed XmpText 9 /metadata /metadata
21+
Xmp.xmpMM.History[1]/stEvt:instanceID XmpText 44 xmp.iid:d87c2c5a-77f8-4da9-b6ac-04ce223765a9 xmp.iid:d87c2c5a-77f8-4da9-b6ac-04ce223765a9
22+
Xmp.xmpMM.History[1]/stEvt:softwareAgent XmpText 20 GIMP 2.99.11 (Linux) GIMP 2.99.11 (Linux)
23+
Xmp.xmpMM.History[1]/stEvt:when XmpText 25 2022-05-10T17:09:05+02:00 2022-05-10T17:09:05+02:00
24+
Xmp.xmpMM.History[2] XmpText 0 type="Struct"
25+
Xmp.xmpMM.History[2]/stEvt:action XmpText 5 saved saved
26+
Xmp.xmpMM.History[2]/stEvt:changed XmpText 1 / /
27+
Xmp.xmpMM.History[2]/stEvt:instanceID XmpText 44 xmp.iid:f9384fe5-1151-433d-a148-49f9fe6cf112 xmp.iid:f9384fe5-1151-433d-a148-49f9fe6cf112
28+
Xmp.xmpMM.History[2]/stEvt:softwareAgent XmpText 20 GIMP 2.99.11 (Linux) GIMP 2.99.11 (Linux)
29+
Xmp.xmpMM.History[2]/stEvt:when XmpText 25 2022-05-10T17:10:08+02:00 2022-05-10T17:10:08+02:00
30+
Xmp.dc.Format XmpText 9 image/jxl image/jxl
31+
Xmp.dc.creator XmpSeq 1 exiv2.org exiv2.org
32+
Xmp.dc.description LangAlt 1 lang="x-default" Test image lang="x-default" Test image
33+
Xmp.dc.title LangAlt 1 lang="x-default" Logo lang="x-default" Logo
34+
Xmp.GIMP.API XmpText 3 3.0 3.0
35+
Xmp.GIMP.Platform XmpText 5 Linux Linux
36+
Xmp.GIMP.TimeStamp XmpText 16 1652195408540570 1652195408540570
37+
Xmp.GIMP.Version XmpText 7 2.99.11 2.99.11
38+
Xmp.tiff.Orientation XmpText 1 1 top, left
39+
Xmp.xmp.CreatorTool XmpText 4 GIMP GIMP
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
Exif.Image.ImageWidth Long 1 160 160
2+
Exif.Image.ImageLength Long 1 97 97
3+
Exif.Image.BitsPerSample Short 3 8 8 8 8 8 8
4+
Exif.Image.Orientation Short 1 1 top, left
5+
Exif.Image.XResolution Rational 1 300/1 300
6+
Exif.Image.YResolution Rational 1 300/1 300
7+
Exif.Image.ResolutionUnit Short 1 2 inch
8+
Exif.Image.Software Ascii 13 GIMP 2.99.11 GIMP 2.99.11
9+
Exif.Image.DateTime Ascii 20 2022:05:10 17:10:08 2022:05:10 17:10:08
10+
Exif.Image.ExifTag Long 1 202 202
11+
Exif.Photo.ColorSpace Short 1 1 sRGB
12+
Exif.Image.GPSTag Long 1 220 220
13+
Exif.GPSInfo.GPSAltitude Rational 1 0/100 0.0 m
14+
Xmp.xmpMM.DocumentID XmpText 52 gimp:docid:gimp:044333cc-8cd4-44da-a3f7-b4d9ae9ee740 gimp:docid:gimp:044333cc-8cd4-44da-a3f7-b4d9ae9ee740
15+
Xmp.xmpMM.InstanceID XmpText 44 xmp.iid:b9cf7f00-cf00-4264-a8f8-bccde48e0f1a xmp.iid:b9cf7f00-cf00-4264-a8f8-bccde48e0f1a
16+
Xmp.xmpMM.OriginalDocumentID XmpText 44 xmp.did:6589fec5-f1c4-4e37-b7ba-f58bfcc61271 xmp.did:6589fec5-f1c4-4e37-b7ba-f58bfcc61271
17+
Xmp.xmpMM.History XmpText 0 type="Seq"
18+
Xmp.xmpMM.History[1] XmpText 0 type="Struct"
19+
Xmp.xmpMM.History[1]/stEvt:action XmpText 5 saved saved
20+
Xmp.xmpMM.History[1]/stEvt:changed XmpText 9 /metadata /metadata
21+
Xmp.xmpMM.History[1]/stEvt:instanceID XmpText 44 xmp.iid:d87c2c5a-77f8-4da9-b6ac-04ce223765a9 xmp.iid:d87c2c5a-77f8-4da9-b6ac-04ce223765a9
22+
Xmp.xmpMM.History[1]/stEvt:softwareAgent XmpText 20 GIMP 2.99.11 (Linux) GIMP 2.99.11 (Linux)
23+
Xmp.xmpMM.History[1]/stEvt:when XmpText 25 2022-05-10T17:09:05+02:00 2022-05-10T17:09:05+02:00
24+
Xmp.xmpMM.History[2] XmpText 0 type="Struct"
25+
Xmp.xmpMM.History[2]/stEvt:action XmpText 5 saved saved
26+
Xmp.xmpMM.History[2]/stEvt:changed XmpText 1 / /
27+
Xmp.xmpMM.History[2]/stEvt:instanceID XmpText 44 xmp.iid:f9384fe5-1151-433d-a148-49f9fe6cf112 xmp.iid:f9384fe5-1151-433d-a148-49f9fe6cf112
28+
Xmp.xmpMM.History[2]/stEvt:softwareAgent XmpText 20 GIMP 2.99.11 (Linux) GIMP 2.99.11 (Linux)
29+
Xmp.xmpMM.History[2]/stEvt:when XmpText 25 2022-05-10T17:10:08+02:00 2022-05-10T17:10:08+02:00
30+
Xmp.dc.Format XmpText 9 image/jxl image/jxl
31+
Xmp.dc.creator XmpSeq 1 exiv2.org exiv2.org
32+
Xmp.dc.description LangAlt 1 lang="x-default" Test image lang="x-default" Test image
33+
Xmp.dc.title LangAlt 1 lang="x-default" Logo lang="x-default" Logo
34+
Xmp.GIMP.API XmpText 3 3.0 3.0
35+
Xmp.GIMP.Platform XmpText 5 Linux Linux
36+
Xmp.GIMP.TimeStamp XmpText 16 1652195408540570 1652195408540570
37+
Xmp.GIMP.Version XmpText 7 2.99.11 2.99.11
38+
Xmp.tiff.Orientation XmpText 1 1 top, left
39+
Xmp.xmp.CreatorTool XmpText 4 GIMP GIMP
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
from system_tests import CaseMeta, path
2+
3+
class TestJXLBoxEndXML(metaclass=CaseMeta):
4+
"""
5+
Regression test for the bug described in:
6+
https://github.com/Exiv2/exiv2/issues/2233
7+
"""
8+
url = "https://github.com/Exiv2/exiv2/issues/2233"
9+
10+
filename = path("$data_path/issue_2233_poc1.jxl")
11+
commands = ["$exiv2 -pS $filename"]
12+
stdout = ["""Exiv2::BmffImage::boxHandler: JXL 0->12
13+
Exiv2::BmffImage::boxHandler: ftyp 12->20 brand: jxl
14+
Exiv2::BmffImage::boxHandler: jxlc 32->15060
15+
Exiv2::BmffImage::boxHandler: Exif 15092->258
16+
Exiv2::BmffImage::boxHandler: xml 15350->3699
17+
"""]
18+
stderr = [""]
19+
retval = [0]
20+
21+
class TestJXLBoxEndExif(metaclass=CaseMeta):
22+
"""
23+
Regression test for the bug described in:
24+
https://github.com/Exiv2/exiv2/issues/2233
25+
"""
26+
url = "https://github.com/Exiv2/exiv2/issues/2233"
27+
28+
filename = path("$data_path/issue_2233_poc2.jxl")
29+
commands = ["$exiv2 -pS $filename"]
30+
stdout = ["""Exiv2::BmffImage::boxHandler: JXL 0->12
31+
Exiv2::BmffImage::boxHandler: ftyp 12->20 brand: jxl
32+
Exiv2::BmffImage::boxHandler: jxlc 32->15060
33+
Exiv2::BmffImage::boxHandler: xml 15092->3699
34+
Exiv2::BmffImage::boxHandler: Exif 18791->258
35+
"""]
36+
stderr = [""]
37+
retval = [0]

0 commit comments

Comments
 (0)