From fb7f3d48dcc6f91b96221cd2a85f64d5025e8f4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Milo=C5=A1=20Komar=C4=8Devi=C4=87?= Date: Thu, 2 Nov 2023 13:25:33 +0100 Subject: [PATCH 01/12] Add new Nikon Z lenses (cherry picked from commit 7ebeddd44e41dc602de40d5b4636e800b2e1a847) --- src/nikonmn_int.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/nikonmn_int.cpp b/src/nikonmn_int.cpp index f28731c1..bb6bbf9b 100644 --- a/src/nikonmn_int.cpp +++ b/src/nikonmn_int.cpp @@ -3954,6 +3954,9 @@ std::ostream& Nikon3MakerNote::printLensId4ZMount(std::ostream& os, const Value& {42, "Nikon", "Nikkor Z 180-600mm f/5.6-6.3 VR"}, {43, "Nikon", "Nikkor Z DX 24mm f/1.7"}, {44, "Nikon", "Nikkor Z 70-180mm f/2.8"}, + {45, "Nikon", "Nikkor Z 600mm f/6.3 VR S"}, + {46, "Nikon", "Nikkor Z 135mm f/1.8 S Plena"}, + {53251, "Sigma", "56mm F1.4 DC DN | C"}, }; auto lid = static_cast(value.toInt64()); From 9a068a37128d9f6a500619ddb9c8275661bc0f13 Mon Sep 17 00:00:00 2001 From: norbertwg Date: Wed, 1 Nov 2023 13:26:33 +0100 Subject: [PATCH 02/12] easy access: Tag sequence changed for serialNumber and lensName --- src/easyaccess.cpp | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/easyaccess.cpp b/src/easyaccess.cpp index 78a5fd88..d9e4ea56 100644 --- a/src/easyaccess.cpp +++ b/src/easyaccess.cpp @@ -272,15 +272,17 @@ ExifData::const_iterator whiteBalance(const ExifData& ed) { ExifData::const_iterator lensName(const ExifData& ed) { static constexpr const char* keys[] = { // Try Exif.CanonCs.LensType first. - "Exif.CanonCs.LensType", "Exif.Photo.LensModel", - "Exif.Canon.LensModel", "Exif.NikonLd1.LensIDNumber", - "Exif.NikonLd2.LensIDNumber", "Exif.NikonLd3.LensIDNumber", - "Exif.NikonLd4.LensID", "Exif.NikonLd4.LensIDNumber", + // Exif.OlympusEq.LensType and Exif.Pentax.LensType in most cases give better information than + // Exif.Photo.LensModel + "Exif.CanonCs.LensType", "Exif.OlympusEq.LensType", "Exif.Pentax.LensType", "Exif.PentaxDng.LensType", - "Exif.Minolta.LensID", "Exif.SonyMinolta.LensID", - "Exif.Sony1.LensID", "Exif.Sony2.LensID", - "Exif.Sony1.LensSpec", "Exif.Sony2.LensSpec", - "Exif.OlympusEq.LensType", "Exif.Panasonic.LensType", + "Exif.Photo.LensModel", "Exif.Canon.LensModel", + "Exif.NikonLd1.LensIDNumber", "Exif.NikonLd2.LensIDNumber", + "Exif.NikonLd3.LensIDNumber", "Exif.NikonLd4.LensID", + "Exif.NikonLd4.LensIDNumber", "Exif.Minolta.LensID", + "Exif.SonyMinolta.LensID", "Exif.Sony1.LensID", + "Exif.Sony2.LensID", "Exif.Sony1.LensSpec", + "Exif.Sony2.LensSpec", "Exif.Panasonic.LensType", "Exif.Samsung2.LensType", "Exif.Photo.LensSpecification", "Exif.Nikon3.Lens", }; @@ -457,10 +459,12 @@ ExifData::const_iterator flash(const ExifData& ed) { ExifData::const_iterator serialNumber(const ExifData& ed) { static constexpr const char* keys[] = { - "Exif.Image.CameraSerialNumber", "Exif.Photo.BodySerialNumber", "Exif.Canon.SerialNumber", - "Exif.Nikon3.SerialNumber", "Exif.Nikon3.SerialNO", "Exif.Fujifilm.SerialNumber", - "Exif.Olympus.SerialNumber2", "Exif.OlympusEq.SerialNumber", "Exif.Pentax.SerialNumber", - "Exif.PentaxDng.SerialNumber", "Exif.Sigma.SerialNumber", "Exif.Sony1.SerialNumber", + // first check Exif.Canon.SerialNumber, because some Canon images contain a wrong value in + // Exif.Photo.BodySerialNumber + "Exif.Canon.SerialNumber", "Exif.Image.CameraSerialNumber", "Exif.Photo.BodySerialNumber", + "Exif.Nikon3.SerialNumber", "Exif.Nikon3.SerialNO", "Exif.Fujifilm.SerialNumber", + "Exif.Olympus.SerialNumber2", "Exif.OlympusEq.SerialNumber", "Exif.Pentax.SerialNumber", + "Exif.PentaxDng.SerialNumber", "Exif.Sigma.SerialNumber", "Exif.Sony1.SerialNumber", "Exif.Sony2.SerialNumber", }; return findMetadatum(ed, keys, std::size(keys)); From 8512c4fd62793df32212eb2745ae62ba3d115404 Mon Sep 17 00:00:00 2001 From: Kevin Backhouse Date: Sat, 4 Nov 2023 20:30:41 +0000 Subject: [PATCH 03/12] Fix test failure on Mac. (cherry picked from commit ad8b80659ce8f4104a65833d408938ce2c322e0d) --- tests/bugfixes/github/test_issue_2427.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/bugfixes/github/test_issue_2427.py b/tests/bugfixes/github/test_issue_2427.py index 113aa0c5..ca7b2f11 100644 --- a/tests/bugfixes/github/test_issue_2427.py +++ b/tests/bugfixes/github/test_issue_2427.py @@ -7,7 +7,5 @@ class issue_2427_BmffImage_brotliUncompress_memleak(metaclass=CaseMeta): filename = "$data_path/issue_2427_poc.jpg" commands = ["$exiv2 $filename"] retval = [1] - stderr = ["""$exiv2_exception_message $filename: -CL_SPACE -"""] stdout = [""] + compare_stderr = check_no_ASAN_UBSAN_errors From 78642f786a35c79a4eeca695fc0f2b7c4e012ec1 Mon Sep 17 00:00:00 2001 From: Kevin Backhouse Date: Sat, 7 Oct 2023 21:18:58 +0100 Subject: [PATCH 04/12] Regression test for https://github.com/Exiv2/exiv2/security/advisories/GHSA-hrw9-ggg3-3r4r --- test/data/issue_ghsa_hrw9_ggg3_3r4r_poc.jpg | Bin 0 -> 65577 bytes .../github/test_issue_ghsa_hrw9_ggg3_3r4r.py | 19 ++++++++++++++++++ .../test_regression_allfiles.py | 1 + 3 files changed, 20 insertions(+) create mode 100644 test/data/issue_ghsa_hrw9_ggg3_3r4r_poc.jpg create mode 100644 tests/bugfixes/github/test_issue_ghsa_hrw9_ggg3_3r4r.py diff --git a/test/data/issue_ghsa_hrw9_ggg3_3r4r_poc.jpg b/test/data/issue_ghsa_hrw9_ggg3_3r4r_poc.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2fd8e6758b05306c3ec75d9aecf74bae53abcf5b GIT binary patch literal 65577 zcmeIuJx&5q7(mgF&W4(X!cY^iv6E1c7$=d0*jO{>0TX`SWSjyv;f5?&f^j7-K}pz! zId=iKI1$lbwWqpz&%@ci9QS*V&&5kb+{ABmqFXk(EUJg;v0lDyQ+r#cb#<5wem>8G z;?SmMmUp>XG3%FGCR^K!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 N2oNAZfWW^H_yc1`AN&9S literal 0 HcmV?d00001 diff --git a/tests/bugfixes/github/test_issue_ghsa_hrw9_ggg3_3r4r.py b/tests/bugfixes/github/test_issue_ghsa_hrw9_ggg3_3r4r.py new file mode 100644 index 00000000..a054ba28 --- /dev/null +++ b/tests/bugfixes/github/test_issue_ghsa_hrw9_ggg3_3r4r.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- + +from system_tests import CaseMeta, path + +class BrotliUncompressOutOfBoundsWrite(metaclass=CaseMeta): + """ + Regression test for the bug described in: + https://github.com/Exiv2/exiv2/security/advisories/GHSA-hrw9-ggg3-3r4r + """ + url = "https://github.com/Exiv2/exiv2/security/advisories/GHSA-hrw9-ggg3-3r4r" + + filename = path("$data_path/issue_ghsa_hrw9_ggg3_3r4r_poc.jpg") + commands = ["$exiv2 $filename"] + stdout = [""] + stderr = [ +"""Exiv2 exception in print action for file $filename: +$kerFailedToReadImageData +"""] + retval = [1] diff --git a/tests/regression_tests/test_regression_allfiles.py b/tests/regression_tests/test_regression_allfiles.py index 8ffce39c..426a0c36 100644 --- a/tests/regression_tests/test_regression_allfiles.py +++ b/tests/regression_tests/test_regression_allfiles.py @@ -116,6 +116,7 @@ def get_valid_files(data_dir): "issue_ghsa_583f_w9pm_99r2_poc.jp2", "issue_ghsa_7569_phvm_vwc2_poc.jp2", "issue_ghsa_mxw9_qx4c_6m8v_poc.jp2", + "issue_ghsa_hrw9_ggg3_3r4r_poc.jpg", "pocIssue283.jpg", "poc_1522.jp2", "xmpsdk.xmp", From a1f254358de167af9a619523ca7ba6492bd89959 Mon Sep 17 00:00:00 2001 From: Kevin Backhouse Date: Sat, 7 Oct 2023 21:38:30 +0100 Subject: [PATCH 05/12] Credit to OSS-Fuzz: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=61675 Avoid integer overflow in the calculation of available_out. --- src/bmffimage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bmffimage.cpp b/src/bmffimage.cpp index 4eb2b123..ad084ea2 100644 --- a/src/bmffimage.cpp +++ b/src/bmffimage.cpp @@ -216,7 +216,7 @@ void BmffImage::brotliUncompress(const byte* compressedBuf, size_t compressedBuf uncompressedLen *= 2; // DoS protection - can't be bigger than 128k if (uncompressedLen > 131072) { - if (++dos > 1) + if (++dos > 1 || total_out > 131072) break; uncompressedLen = 131072; } From 3e977c5cf014750fa850fcbfb2715115c75e4610 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20K=C5=82oczko?= Date: Mon, 6 Nov 2023 13:07:33 +0000 Subject: [PATCH 06/12] install exiv2 cmake module in LIBDIR MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit installed cmake module contains arch dependent library description. It should be installed not in DATADIR but in LIBDIR. Signed-off-by: Tomasz Kłoczko --- src/CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 4d86f679..4c92f3df 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -310,17 +310,17 @@ install(TARGETS exiv2lib EXPORT exiv2Export) include(CMakePackageConfigHelpers) configure_package_config_file( - ../cmake/exiv2Config.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/exiv2Config.cmake INSTALL_DESTINATION "${CMAKE_INSTALL_DATADIR}/cmake/exiv2" + ../cmake/exiv2Config.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/exiv2Config.cmake INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/exiv2" ) install(FILES ${PUBLIC_HEADERS} ${CMAKE_BINARY_DIR}/exv_conf.h ${CMAKE_BINARY_DIR}/exiv2lib_export.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/exiv2) install( EXPORT exiv2Export - DESTINATION "${CMAKE_INSTALL_DATADIR}/cmake/exiv2" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/exiv2" NAMESPACE Exiv2:: ) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/exiv2ConfigVersion.cmake ${CMAKE_CURRENT_BINARY_DIR}/exiv2Config.cmake - DESTINATION "${CMAKE_INSTALL_DATADIR}/cmake/exiv2" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/exiv2" ) From 9002797011d3880fa1e4cd41b824883622359b1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Milo=C5=A1=20Komar=C4=8Devi=C4=87?= Date: Thu, 9 Nov 2023 14:26:40 +0100 Subject: [PATCH 07/12] Add Sony 9M3 ID --- src/sonymn_int.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/sonymn_int.cpp b/src/sonymn_int.cpp index 30c4e756..0d732ea4 100644 --- a/src/sonymn_int.cpp +++ b/src/sonymn_int.cpp @@ -512,6 +512,7 @@ constexpr TagDetails sonyModelId[] = { {389, "ZV-1F"}, {390, "ILCE-7RM5"}, {391, "ILME-FX30"}, + {392, "ILCE-9M3"}, {393, "ZV-E1"}, {394, "ILCE-6700"}, {395, "ZV-1M2"}, @@ -547,7 +548,7 @@ constexpr StringTagDetails sonyFileFormat[] = { {"0 0 0 2", "JPEG"}, {"1 0 0 0", "SR2 1.0"}, {"2 0 0 0", "ARW 1.0"}, {"3 0 0 0", "ARW 2.0"}, {"3 1 0 0", "ARW 2.1"}, {"3 2 0 0", "ARW 2.2"}, {"3 3 0 0", "ARW 2.3"}, {"3 3 1 0", "ARW 2.3.1"}, {"3 3 2 0", "ARW 2.3.2"}, {"3 3 3 0", "ARW 2.3.3"}, {"3 3 5 0", "ARW 2.3.5"}, {"4 0 0 0", "ARW 4.0"}, - {"4 0 1 0", "ARW 4.0.1"}, + {"4 0 1 0", "ARW 4.0.1"}, {"5 0 0 0", "ARW 5.0.0"}, }; //! Lookup table to translate Sony dynamic range optimizer values to readable labels From 5f4ffdd4830838fec582c4693e7ee74d8ece541a Mon Sep 17 00:00:00 2001 From: Pino Toscano Date: Sun, 12 Nov 2023 01:04:48 +0100 Subject: [PATCH 08/12] tests: fix parsing w/ path containing "-pa" or "-pS" The OutputTagExtract test case for tiff_test runs exiv2 two times, with "-pa" and "-pS", and parses their outputs. To know which output to parse, it checks for "-pa" and "-pS" in the string of the command being run; considering that the command string contains the full path to the test data, which is a subdirectory of the sources, this means that a wrong parser will be used in case the full source path contains any of "-pa" or "-pS" (e.g. "/build/some-path/exiv2/..."). Cheap fix for this: since "-pa"/"-pS" are options in the command string, check for them using spaces around. --- tests/tiff_test/test_tag_compare.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/tiff_test/test_tag_compare.py b/tests/tiff_test/test_tag_compare.py index 974d1a9a..4bf44431 100644 --- a/tests/tiff_test/test_tag_compare.py +++ b/tests/tiff_test/test_tag_compare.py @@ -98,9 +98,9 @@ class OutputTagExtract(metaclass=system_tests.CaseMeta): def compare_stdout(self, i, command, got_stdout, expected_stdout): super().compare_stdout(i, command, got_stdout, expected_stdout) - if '-pa' in command: + if ' -pa ' in command: self.pa_data = self.parse_pa(got_stdout.splitlines()) - if '-pS' in command: + if ' -pS ' in command: self.pS_data = self.parse_pS(got_stdout.splitlines()) if i == 1: From 10d233dad2a1c2c9217ac4e7c3e7e6e3bdee13b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Milo=C5=A1=20Komar=C4=8Devi=C4=87?= Date: Thu, 9 Nov 2023 15:37:15 +0100 Subject: [PATCH 09/12] RAF: extract more details when printing structure --- src/rafimage.cpp | 159 ++++++++++++++++++++++++++++++----------------- 1 file changed, 101 insertions(+), 58 deletions(-) diff --git a/src/rafimage.cpp b/src/rafimage.cpp index 495e9692..954ec728 100644 --- a/src/rafimage.cpp +++ b/src/rafimage.cpp @@ -71,11 +71,11 @@ void RafImage::printStructure(std::ostream& out, PrintStructureOption option, si if (bPrint) { io_->seek(0, BasicIo::beg); // rewind size_t address = io_->tell(); - constexpr auto format = " %8zu | %8ld | "; + constexpr auto format = " %9zu | %9ld | "; { out << Internal::indent(depth) << "STRUCTURE OF RAF FILE: " << io().path() << std::endl; - out << Internal::indent(depth) << " Address | Length | Payload" << std::endl; + out << Internal::indent(depth) << " Address | Length | Payload" << std::endl; } byte magicdata[17]; @@ -83,7 +83,7 @@ void RafImage::printStructure(std::ostream& out, PrintStructureOption option, si magicdata[16] = 0; { out << Internal::indent(depth) << Internal::stringFormat(format, address, 16L) // 0 - << " magic : " << reinterpret_cast(magicdata) << std::endl; + << " magic : " << reinterpret_cast(magicdata) << std::endl; } address = io_->tell(); @@ -92,7 +92,7 @@ void RafImage::printStructure(std::ostream& out, PrintStructureOption option, si data1[4] = 0; { out << Internal::indent(depth) << Internal::stringFormat(format, address, 4L) // 16 - << " data1 : " << std::string(reinterpret_cast(&data1)) << std::endl; + << " data1 : " << std::string(reinterpret_cast(&data1)) << std::endl; } address = io_->tell(); @@ -101,7 +101,7 @@ void RafImage::printStructure(std::ostream& out, PrintStructureOption option, si data2[8] = 0; { out << Internal::indent(depth) << Internal::stringFormat(format, address, 8L) // 20 - << " data2 : " << std::string(reinterpret_cast(&data2)) << std::endl; + << " data2 : " << std::string(reinterpret_cast(&data2)) << std::endl; } address = io_->tell(); @@ -110,7 +110,7 @@ void RafImage::printStructure(std::ostream& out, PrintStructureOption option, si camdata[32] = 0; { out << Internal::indent(depth) << Internal::stringFormat(format, address, 32L) // 28 - << " camera : " << std::string(reinterpret_cast(&camdata)) << std::endl; + << " camera : " << std::string(reinterpret_cast(&camdata)) << std::endl; } address = io_->tell(); @@ -119,7 +119,7 @@ void RafImage::printStructure(std::ostream& out, PrintStructureOption option, si dir_version[4] = 0; { out << Internal::indent(depth) << Internal::stringFormat(format, address, 4L) // 60 - << " version : " << std::string(reinterpret_cast(&dir_version)) << std::endl; + << " version : " << std::string(reinterpret_cast(&dir_version)) << std::endl; } address = io_->tell(); @@ -127,7 +127,7 @@ void RafImage::printStructure(std::ostream& out, PrintStructureOption option, si io_->read(unknown.data(), unknown.size()); { out << Internal::indent(depth) << Internal::stringFormat(format, address, 20L) - << " unknown : " << Internal::binaryToString(makeSlice(unknown, 0, unknown.size())) << std::endl; + << " unknown : " << Internal::binaryToString(makeSlice(unknown, 0, unknown.size())) << std::endl; } address = io_->tell(); @@ -139,53 +139,76 @@ void RafImage::printStructure(std::ostream& out, PrintStructureOption option, si long jpg_img_off = Exiv2::getULong(jpg_img_offset, bigEndian); long jpg_img_len = Exiv2::getULong(jpg_img_length, bigEndian); - std::stringstream j_off; - std::stringstream j_len; - j_off << jpg_img_off; - j_len << jpg_img_len; { - out << Internal::indent(depth) << Internal::stringFormat(format, address, 4L) << "JPEG Offset : " << j_off.str() + std::stringstream j_off; + std::stringstream j_len; + j_off << jpg_img_off; + j_len << jpg_img_len; + out << Internal::indent(depth) << Internal::stringFormat(format, address, 4L) << " JPEG offset : " << j_off.str() << std::endl; - out << Internal::indent(depth) << Internal::stringFormat(format, address2, 4L) << "JPEG Length : " << j_len.str() + out << Internal::indent(depth) << Internal::stringFormat(format, address2, 4L) << " JPEG length : " << j_len.str() << std::endl; } - address = io_->tell(); - byte cfa_header_offset[4]; - io_->read(cfa_header_offset, 4); - byte cfa_header_length[4]; - address2 = io_->tell(); - io_->read(cfa_header_length, 4); - long cfa_hdr_off = Exiv2::getULong(cfa_header_offset, bigEndian); - long cfa_hdr_len = Exiv2::getULong(cfa_header_length, bigEndian); - std::stringstream ch_off; - std::stringstream ch_len; - ch_off << cfa_hdr_off; - ch_len << cfa_hdr_len; - { - out << Internal::indent(depth) << Internal::stringFormat(format, address, 4L) << " CFA Offset : " << ch_off.str() - << std::endl; - out << Internal::indent(depth) << Internal::stringFormat(format, address2, 4L) << " CFA Length : " << ch_len.str() - << std::endl; - } - - byte cfa_offset[4]; - address = io_->tell(); - io_->read(cfa_offset, 4); - byte cfa_length[4]; - address2 = io_->tell(); - io_->read(cfa_length, 4); - long cfa_off = Exiv2::getULong(cfa_offset, bigEndian); - long cfa_len = Exiv2::getULong(cfa_length, bigEndian); - std::stringstream c_off; - std::stringstream c_len; - c_off << cfa_off; - c_len << cfa_len; - { - out << Internal::indent(depth) << Internal::stringFormat(format, address, 4L) << "TIFF Offset : " << c_off.str() - << std::endl; - out << Internal::indent(depth) << Internal::stringFormat(format, address2, 4L) << "TIFF Length : " << c_len.str() - << std::endl; + // RAFs can carry the payload in one or two parts + long meta_off[2], meta_len[2]; + long cfa_off[2], cfa_len[2], cfa_skip[2], cfa_size[2], cfa_stride[2]; + for (size_t i = 0; i < 2; i++) { + address = io_->tell(); + byte data[4]; + io_->read(data, 4); + meta_off[i] = Exiv2::getULong(data, bigEndian); + address2 = io_->tell(); + io_->read(data, 4); + meta_len[i] = Exiv2::getULong(data, bigEndian); + { + std::stringstream c_off; + std::stringstream c_len; + c_off << meta_off[i]; + c_len << meta_len[i]; + out << Internal::indent(depth) << Internal::stringFormat(format, address, 4L) << "meta offset" << i + 1 << " : " + << c_off.str() << std::endl; + out << Internal::indent(depth) << Internal::stringFormat(format, address2, 4L) << "meta length" << i + 1 + << " : " << c_len.str() << std::endl; + } + + address = io_->tell(); + io_->read(data, 4); + cfa_off[i] = Exiv2::getULong(data, bigEndian); + address2 = io_->tell(); + io_->read(data, 4); + cfa_len[i] = Exiv2::getULong(data, bigEndian); + size_t address3 = io_->tell(); + io_->read(data, 4); + cfa_skip[i] = Exiv2::getULong(data, bigEndian); + size_t address4 = io_->tell(); + io_->read(data, 4); + cfa_size[i] = Exiv2::getULong(data, bigEndian); + size_t address5 = io_->tell(); + io_->read(data, 4); + cfa_stride[i] = Exiv2::getULong(data, bigEndian); + { + std::stringstream c_off; + std::stringstream c_len; + std::stringstream c_skip; + std::stringstream c_size; + std::stringstream c_stride; + c_off << cfa_off[i]; + c_len << cfa_len[i]; + c_skip << cfa_skip[i]; + c_size << cfa_size[i]; + c_stride << cfa_stride[i]; + out << Internal::indent(depth) << Internal::stringFormat(format, address, 4L) << " CFA offset" << i + 1 << " : " + << c_off.str() << std::endl; + out << Internal::indent(depth) << Internal::stringFormat(format, address2, 4L) << " CFA length" << i + 1 + << " : " << c_len.str() << std::endl; + out << Internal::indent(depth) << Internal::stringFormat(format, address3, 4L) << " CFA skip" << i + 1 + << " : " << c_skip.str() << std::endl; + out << Internal::indent(depth) << Internal::stringFormat(format, address4, 4L) << " CFA chunk" << i + 1 + << " : " << c_size.str() << std::endl; + out << Internal::indent(depth) << Internal::stringFormat(format, address5, 4L) << " CFA stride" << i + 1 + << " : " << c_stride.str() << std::endl; + } } io_->seek(jpg_img_off, BasicIo::beg); // rewind @@ -193,24 +216,44 @@ void RafImage::printStructure(std::ostream& out, PrintStructureOption option, si DataBuf payload(16); // header is different from chunks io_->read(payload.data(), payload.size()); { - out << Internal::indent(depth) << Internal::stringFormat(format, address, jpg_img_len) // , jpg_img_off) - << " JPEG : " << Internal::binaryToString(makeSlice(payload, 0, payload.size())) << std::endl; + out << Internal::indent(depth) << Internal::stringFormat(format, address, jpg_img_len) + << " JPEG data : " << Internal::binaryToString(makeSlice(payload, 0, payload.size())) << std::endl; } - io_->seek(cfa_hdr_off, BasicIo::beg); // rewind + io_->seek(meta_off[0], BasicIo::beg); // rewind address = io_->tell(); io_->read(payload.data(), payload.size()); { - out << Internal::indent(depth) << Internal::stringFormat(format, address, cfa_hdr_len) // cfa_hdr_off - << " CFA : " << Internal::binaryToString(makeSlice(payload, 0, payload.size())) << std::endl; + out << Internal::indent(depth) << Internal::stringFormat(format, address, meta_len[0]) + << " meta data1 : " << Internal::binaryToString(makeSlice(payload, 0, payload.size())) << std::endl; } - io_->seek(cfa_off, BasicIo::beg); // rewind + if (meta_off[1] && meta_len[1]) { + io_->seek(meta_off[1], BasicIo::beg); // rewind + address = io_->tell(); + io_->read(payload.data(), payload.size()); + { + out << Internal::indent(depth) << Internal::stringFormat(format, address, meta_len[1]) + << " meta data2 : " << Internal::binaryToString(makeSlice(payload, 0, payload.size())) << std::endl; + } + } + + io_->seek(cfa_off[0], BasicIo::beg); // rewind address = io_->tell(); io_->read(payload.data(), payload.size()); { - out << Internal::indent(depth) << Internal::stringFormat(format, address, cfa_len) // cfa_off - << " TIFF : " << Internal::binaryToString(makeSlice(payload, 0, payload.size())) << std::endl; + out << Internal::indent(depth) << Internal::stringFormat(format, address, cfa_len[0]) + << " CFA data1 : " << Internal::binaryToString(makeSlice(payload, 0, payload.size())) << std::endl; + } + + if (cfa_off[1] && cfa_len[1]) { + io_->seek(cfa_off[1], BasicIo::beg); // rewind + address = io_->tell(); + io_->read(payload.data(), payload.size()); + { + out << Internal::indent(depth) << Internal::stringFormat(format, address, cfa_len[1]) // cfa_off + << " CFA data2 : " << Internal::binaryToString(makeSlice(payload, 0, payload.size())) << std::endl; + } } } } // RafImage::printStructure From de8f1bd849813bb934c75bf8931a640a97dcb170 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Milo=C5=A1=20Komar=C4=8Devi=C4=87?= <4973094+kmilos@users.noreply.github.com> Date: Mon, 13 Nov 2023 14:15:19 +0100 Subject: [PATCH 10/12] Apply suggestions from code review Co-authored-by: Kevin Backhouse --- src/rafimage.cpp | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/rafimage.cpp b/src/rafimage.cpp index 954ec728..34164e34 100644 --- a/src/rafimage.cpp +++ b/src/rafimage.cpp @@ -79,7 +79,7 @@ void RafImage::printStructure(std::ostream& out, PrintStructureOption option, si } byte magicdata[17]; - io_->read(magicdata, 16); + io_->readOrThrow(magicdata, 16); magicdata[16] = 0; { out << Internal::indent(depth) << Internal::stringFormat(format, address, 16L) // 0 @@ -124,7 +124,7 @@ void RafImage::printStructure(std::ostream& out, PrintStructureOption option, si address = io_->tell(); DataBuf unknown(20); - io_->read(unknown.data(), unknown.size()); + io_->readOrThrow(unknown.data(), unknown.size()); { out << Internal::indent(depth) << Internal::stringFormat(format, address, 20L) << " unknown : " << Internal::binaryToString(makeSlice(unknown, 0, unknown.size())) << std::endl; @@ -137,8 +137,8 @@ void RafImage::printStructure(std::ostream& out, PrintStructureOption option, si size_t address2 = io_->tell(); io_->read(jpg_img_length, 4); - long jpg_img_off = Exiv2::getULong(jpg_img_offset, bigEndian); - long jpg_img_len = Exiv2::getULong(jpg_img_length, bigEndian); + uint32_t jpg_img_off = Exiv2::getULong(jpg_img_offset, bigEndian); + uint32_t jpg_img_len = Exiv2::getULong(jpg_img_length, bigEndian); { std::stringstream j_off; std::stringstream j_len; @@ -151,15 +151,15 @@ void RafImage::printStructure(std::ostream& out, PrintStructureOption option, si } // RAFs can carry the payload in one or two parts - long meta_off[2], meta_len[2]; - long cfa_off[2], cfa_len[2], cfa_skip[2], cfa_size[2], cfa_stride[2]; + uint32_t meta_off[2], meta_len[2]; + uint32_t cfa_off[2], cfa_len[2], cfa_skip[2], cfa_size[2], cfa_stride[2]; for (size_t i = 0; i < 2; i++) { address = io_->tell(); byte data[4]; - io_->read(data, 4); + io_->readOrThrow(data, 4); meta_off[i] = Exiv2::getULong(data, bigEndian); address2 = io_->tell(); - io_->read(data, 4); + io_->readOrThrow(data, 4); meta_len[i] = Exiv2::getULong(data, bigEndian); { std::stringstream c_off; @@ -173,19 +173,19 @@ void RafImage::printStructure(std::ostream& out, PrintStructureOption option, si } address = io_->tell(); - io_->read(data, 4); + io_->readOrThrow(data, 4); cfa_off[i] = Exiv2::getULong(data, bigEndian); address2 = io_->tell(); - io_->read(data, 4); + io_->readOrThrow(data, 4); cfa_len[i] = Exiv2::getULong(data, bigEndian); size_t address3 = io_->tell(); - io_->read(data, 4); + io_->readOrThrow(data, 4); cfa_skip[i] = Exiv2::getULong(data, bigEndian); size_t address4 = io_->tell(); - io_->read(data, 4); + io_->readOrThrow(data, 4); cfa_size[i] = Exiv2::getULong(data, bigEndian); size_t address5 = io_->tell(); - io_->read(data, 4); + io_->readOrThrow(data, 4); cfa_stride[i] = Exiv2::getULong(data, bigEndian); { std::stringstream c_off; @@ -214,7 +214,7 @@ void RafImage::printStructure(std::ostream& out, PrintStructureOption option, si io_->seek(jpg_img_off, BasicIo::beg); // rewind address = io_->tell(); DataBuf payload(16); // header is different from chunks - io_->read(payload.data(), payload.size()); + io_->readOrThrow(payload.data(), payload.size()); { out << Internal::indent(depth) << Internal::stringFormat(format, address, jpg_img_len) << " JPEG data : " << Internal::binaryToString(makeSlice(payload, 0, payload.size())) << std::endl; @@ -222,7 +222,7 @@ void RafImage::printStructure(std::ostream& out, PrintStructureOption option, si io_->seek(meta_off[0], BasicIo::beg); // rewind address = io_->tell(); - io_->read(payload.data(), payload.size()); + io_->readOrThrow(payload.data(), payload.size()); { out << Internal::indent(depth) << Internal::stringFormat(format, address, meta_len[0]) << " meta data1 : " << Internal::binaryToString(makeSlice(payload, 0, payload.size())) << std::endl; @@ -231,7 +231,7 @@ void RafImage::printStructure(std::ostream& out, PrintStructureOption option, si if (meta_off[1] && meta_len[1]) { io_->seek(meta_off[1], BasicIo::beg); // rewind address = io_->tell(); - io_->read(payload.data(), payload.size()); + io_->readOrThrow(payload.data(), payload.size()); { out << Internal::indent(depth) << Internal::stringFormat(format, address, meta_len[1]) << " meta data2 : " << Internal::binaryToString(makeSlice(payload, 0, payload.size())) << std::endl; @@ -240,7 +240,7 @@ void RafImage::printStructure(std::ostream& out, PrintStructureOption option, si io_->seek(cfa_off[0], BasicIo::beg); // rewind address = io_->tell(); - io_->read(payload.data(), payload.size()); + io_->readOrThrow(payload.data(), payload.size()); { out << Internal::indent(depth) << Internal::stringFormat(format, address, cfa_len[0]) << " CFA data1 : " << Internal::binaryToString(makeSlice(payload, 0, payload.size())) << std::endl; @@ -249,7 +249,7 @@ void RafImage::printStructure(std::ostream& out, PrintStructureOption option, si if (cfa_off[1] && cfa_len[1]) { io_->seek(cfa_off[1], BasicIo::beg); // rewind address = io_->tell(); - io_->read(payload.data(), payload.size()); + io_->readOrThrow(payload.data(), payload.size()); { out << Internal::indent(depth) << Internal::stringFormat(format, address, cfa_len[1]) // cfa_off << " CFA data2 : " << Internal::binaryToString(makeSlice(payload, 0, payload.size())) << std::endl; From e9ba89411bf82a21a6925414936929d2ae369fad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Milo=C5=A1=20Komar=C4=8Devi=C4=87?= Date: Mon, 13 Nov 2023 14:39:37 +0100 Subject: [PATCH 11/12] Use appropriate print format specifiers and constants --- src/rafimage.cpp | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/src/rafimage.cpp b/src/rafimage.cpp index 34164e34..3ad906a6 100644 --- a/src/rafimage.cpp +++ b/src/rafimage.cpp @@ -14,6 +14,7 @@ #include "safe_op.hpp" #include "tiffimage.hpp" +#include #include // ***************************************************************************** @@ -71,7 +72,7 @@ void RafImage::printStructure(std::ostream& out, PrintStructureOption option, si if (bPrint) { io_->seek(0, BasicIo::beg); // rewind size_t address = io_->tell(); - constexpr auto format = " %9zu | %9ld | "; + constexpr auto format = " %9zu | %9" PRIu32 " | "; { out << Internal::indent(depth) << "STRUCTURE OF RAF FILE: " << io().path() << std::endl; @@ -82,7 +83,7 @@ void RafImage::printStructure(std::ostream& out, PrintStructureOption option, si io_->readOrThrow(magicdata, 16); magicdata[16] = 0; { - out << Internal::indent(depth) << Internal::stringFormat(format, address, 16L) // 0 + out << Internal::indent(depth) << Internal::stringFormat(format, address, 16U) // 0 << " magic : " << reinterpret_cast(magicdata) << std::endl; } @@ -91,7 +92,7 @@ void RafImage::printStructure(std::ostream& out, PrintStructureOption option, si io_->read(data1, 4); data1[4] = 0; { - out << Internal::indent(depth) << Internal::stringFormat(format, address, 4L) // 16 + out << Internal::indent(depth) << Internal::stringFormat(format, address, 4U) // 16 << " data1 : " << std::string(reinterpret_cast(&data1)) << std::endl; } @@ -100,7 +101,7 @@ void RafImage::printStructure(std::ostream& out, PrintStructureOption option, si io_->read(data2, 8); data2[8] = 0; { - out << Internal::indent(depth) << Internal::stringFormat(format, address, 8L) // 20 + out << Internal::indent(depth) << Internal::stringFormat(format, address, 8U) // 20 << " data2 : " << std::string(reinterpret_cast(&data2)) << std::endl; } @@ -109,7 +110,7 @@ void RafImage::printStructure(std::ostream& out, PrintStructureOption option, si io_->read(camdata, 32); camdata[32] = 0; { - out << Internal::indent(depth) << Internal::stringFormat(format, address, 32L) // 28 + out << Internal::indent(depth) << Internal::stringFormat(format, address, 32U) // 28 << " camera : " << std::string(reinterpret_cast(&camdata)) << std::endl; } @@ -118,7 +119,7 @@ void RafImage::printStructure(std::ostream& out, PrintStructureOption option, si io_->read(dir_version, 4); dir_version[4] = 0; { - out << Internal::indent(depth) << Internal::stringFormat(format, address, 4L) // 60 + out << Internal::indent(depth) << Internal::stringFormat(format, address, 4U) // 60 << " version : " << std::string(reinterpret_cast(&dir_version)) << std::endl; } @@ -126,7 +127,7 @@ void RafImage::printStructure(std::ostream& out, PrintStructureOption option, si DataBuf unknown(20); io_->readOrThrow(unknown.data(), unknown.size()); { - out << Internal::indent(depth) << Internal::stringFormat(format, address, 20L) + out << Internal::indent(depth) << Internal::stringFormat(format, address, 20U) << " unknown : " << Internal::binaryToString(makeSlice(unknown, 0, unknown.size())) << std::endl; } @@ -144,9 +145,9 @@ void RafImage::printStructure(std::ostream& out, PrintStructureOption option, si std::stringstream j_len; j_off << jpg_img_off; j_len << jpg_img_len; - out << Internal::indent(depth) << Internal::stringFormat(format, address, 4L) << " JPEG offset : " << j_off.str() + out << Internal::indent(depth) << Internal::stringFormat(format, address, 4U) << " JPEG offset : " << j_off.str() << std::endl; - out << Internal::indent(depth) << Internal::stringFormat(format, address2, 4L) << " JPEG length : " << j_len.str() + out << Internal::indent(depth) << Internal::stringFormat(format, address2, 4U) << " JPEG length : " << j_len.str() << std::endl; } @@ -166,9 +167,9 @@ void RafImage::printStructure(std::ostream& out, PrintStructureOption option, si std::stringstream c_len; c_off << meta_off[i]; c_len << meta_len[i]; - out << Internal::indent(depth) << Internal::stringFormat(format, address, 4L) << "meta offset" << i + 1 << " : " + out << Internal::indent(depth) << Internal::stringFormat(format, address, 4U) << "meta offset" << i + 1 << " : " << c_off.str() << std::endl; - out << Internal::indent(depth) << Internal::stringFormat(format, address2, 4L) << "meta length" << i + 1 + out << Internal::indent(depth) << Internal::stringFormat(format, address2, 4U) << "meta length" << i + 1 << " : " << c_len.str() << std::endl; } @@ -198,15 +199,15 @@ void RafImage::printStructure(std::ostream& out, PrintStructureOption option, si c_skip << cfa_skip[i]; c_size << cfa_size[i]; c_stride << cfa_stride[i]; - out << Internal::indent(depth) << Internal::stringFormat(format, address, 4L) << " CFA offset" << i + 1 << " : " + out << Internal::indent(depth) << Internal::stringFormat(format, address, 4U) << " CFA offset" << i + 1 << " : " << c_off.str() << std::endl; - out << Internal::indent(depth) << Internal::stringFormat(format, address2, 4L) << " CFA length" << i + 1 + out << Internal::indent(depth) << Internal::stringFormat(format, address2, 4U) << " CFA length" << i + 1 << " : " << c_len.str() << std::endl; - out << Internal::indent(depth) << Internal::stringFormat(format, address3, 4L) << " CFA skip" << i + 1 + out << Internal::indent(depth) << Internal::stringFormat(format, address3, 4U) << " CFA skip" << i + 1 << " : " << c_skip.str() << std::endl; - out << Internal::indent(depth) << Internal::stringFormat(format, address4, 4L) << " CFA chunk" << i + 1 + out << Internal::indent(depth) << Internal::stringFormat(format, address4, 4U) << " CFA chunk" << i + 1 << " : " << c_size.str() << std::endl; - out << Internal::indent(depth) << Internal::stringFormat(format, address5, 4L) << " CFA stride" << i + 1 + out << Internal::indent(depth) << Internal::stringFormat(format, address5, 4U) << " CFA stride" << i + 1 << " : " << c_stride.str() << std::endl; } } From f6c8e7630fcd46ef63b8c4b8c27dc804454faa59 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Nov 2023 18:07:16 +0000 Subject: [PATCH 12/12] Bump actions/github-script from 6 to 7 Bumps [actions/github-script](https://github.com/actions/github-script) from 6 to 7. - [Release notes](https://github.com/actions/github-script/releases) - [Commits](https://github.com/actions/github-script/compare/v6...v7) --- updated-dependencies: - dependency-name: actions/github-script dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6bd673d1..e12b0e2c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -175,7 +175,7 @@ jobs: - name: Cleanup old nightly if: env.TAG_NAME == 'nightly' - uses: actions/github-script@v6 + uses: actions/github-script@v7 with: script: | try{