diff --git a/src/image.cpp b/src/image.cpp index 89d9035d..8dfa7bb1 100644 --- a/src/image.cpp +++ b/src/image.cpp @@ -477,7 +477,11 @@ namespace Exiv2 { io.seekOrThrow(offset, BasicIo::beg, kerCorruptedMetadata); // position io.readOrThrow(bytes, jump, kerCorruptedMetadata) ; // read bytes[jump]=0 ; - if ( ::strcmp("Nikon",chars) == 0 ) { + + bool bNikon = ::strcmp("Nikon" ,chars) == 0; + bool bSony = ::strcmp("SONY DSC ",chars) == 0; + + if ( bNikon ) { // tag is an embedded tiff const long byteslen = count-jump; DataBuf bytes(byteslen); // allocate a buffer @@ -486,8 +490,9 @@ namespace Exiv2 { printTiffStructure(memIo,out,option,depth); } else { // tag is an IFD + uint32_t punt = bSony ? 12 : 0 ; io.seekOrThrow(0, BasicIo::beg, kerCorruptedMetadata); // position - printIFDStructure(io,out,option,offset,bSwap,c,depth); + printIFDStructure(io,out,option,offset+punt,bSwap,c,depth); } io.seekOrThrow(restore, BasicIo::beg, kerCorruptedMetadata); // restore diff --git a/tests/bugfixes/github/test_issue_1805.py b/tests/bugfixes/github/test_issue_1805.py new file mode 100644 index 00000000..12ac8301 --- /dev/null +++ b/tests/bugfixes/github/test_issue_1805.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- + +import unittest +import system_tests +from system_tests import CaseMeta, path, check_no_ASAN_UBSAN_errors + +# Check that `exiv2 -pr` works for different file types. +# ExifTool has a list of markers that appear in the headers: +# https://exiftool.org/makernote_types.html + +@unittest.skip("Skipping test using option -pR (only for Debug mode)") +class exiv2pRHeaderTest(metaclass=CaseMeta): + + url = "https://github.com/Exiv2/exiv2/issues/1805" + + filename = system_tests.path("$data_path/exiv2-SonyDSC-HX60V.exv") # Uses marker: "SONY DSC " + commands = ["$exiv2 -pR " + filename] + + stderr = [""] + retval = [0] + + compare_stdout = check_no_ASAN_UBSAN_errors \ No newline at end of file