diff --git a/.OpenEXR.metadata b/.OpenEXR.metadata deleted file mode 100644 index 72256b4..0000000 --- a/.OpenEXR.metadata +++ /dev/null @@ -1 +0,0 @@ -d09a68c4443b7a12a0484c073adaef348b44cb92 SOURCES/openexr-2.2.0.tar.gz diff --git a/.gitignore b/.gitignore index a1b2415..dd5d7c3 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -SOURCES/openexr-2.2.0.tar.gz +openexr-3.1.10.tar.gz diff --git a/SOURCES/openexr-2.1.0-bigendian.patch b/SOURCES/openexr-2.1.0-bigendian.patch deleted file mode 100644 index 45a99aa..0000000 --- a/SOURCES/openexr-2.1.0-bigendian.patch +++ /dev/null @@ -1,63 +0,0 @@ -diff -up openexr-2.1.0/IlmImfTest/testFutureProofing.cpp.bigendian openexr-2.1.0/IlmImfTest/testFutureProofing.cpp ---- openexr-2.1.0/IlmImfTest/testFutureProofing.cpp.bigendian 2013-11-11 17:09:51.000000000 -0600 -+++ openexr-2.1.0/IlmImfTest/testFutureProofing.cpp 2013-11-27 08:43:55.486026741 -0600 -@@ -40,6 +40,7 @@ - #include - #include - #include -+#include - - #include "tmpDir.h" - #include "testFutureProofing.h" -@@ -64,6 +65,7 @@ - #include - #include - #include -+#include - - namespace IMF = OPENEXR_IMF_NAMESPACE; - using namespace IMF; -@@ -1234,6 +1236,12 @@ modifyType (bool modify_version) - - //length of attribute - fread(&length,4,1,f); -+ if (!GLOBAL_SYSTEM_LITTLE_ENDIAN) -+ { -+ int tmp = bswap_32(length); -+ length = tmp; -+ } -+ - if(!modify_version && attrib_name=="type") - { - // modify the type of part 1 to be 'X' -diff -up openexr-2.1.0/IlmImfTest/testMultiPartFileMixingBasic.cpp.bigendian openexr-2.1.0/IlmImfTest/testMultiPartFileMixingBasic.cpp ---- openexr-2.1.0/IlmImfTest/testMultiPartFileMixingBasic.cpp.bigendian 2013-11-11 17:09:52.000000000 -0600 -+++ openexr-2.1.0/IlmImfTest/testMultiPartFileMixingBasic.cpp 2013-11-27 08:44:19.370775892 -0600 -@@ -40,6 +40,7 @@ - #include - #include - #include -+#include - - #include "tmpDir.h" - #include "testMultiPartFileMixingBasic.h" -@@ -59,6 +60,7 @@ - #include - #include - #include -+#include - - namespace IMF = OPENEXR_IMF_NAMESPACE; - using namespace IMF; -@@ -1383,6 +1385,11 @@ killOffsetTables (const std::string & fn - - //length of attribute - fread(&length,4,1,f); -+ if (!GLOBAL_SYSTEM_LITTLE_ENDIAN) -+ { -+ int tmp = bswap_32(length); -+ length = tmp; -+ } - - //value of attribute - for(int i=0;i= %{version} -BuildRequires: zlib-devel -BuildRequires: pkgconfig - -Requires: %{name}-libs%{?_isa} = %{version}-%{release} - -%description -OpenEXR is a high dynamic-range (HDR) image file format developed by Industrial -Light & Magic for use in computer imaging applications. This package contains -libraries and sample applications for handling the format. - -%package devel -Summary: Headers and libraries for building apps that use %{name} -Obsoletes: openexr-devel < %{version}-%{release} -Provides: openexr-devel = %{version}-%{release} -Requires: %{name}-libs%{?_isa} = %{version}-%{release} -Requires: ilmbase-devel%{?_isa} -%description devel -%{summary}. - -%package libs -Summary: %{name} runtime libraries -%description libs -%{summary}. - - -%prep -%setup -q -n openexr-%{version} -%patch0 -p1 -b .bigendian - - -%build -%configure --disable-static - -# hack to omit unused-direct-shlib-dependencies -#sed -i -e 's! -shared ! -Wl,--as-needed\0!g' libtool - -make %{?_smp_mflags} - - -%install -make install DESTDIR=%{buildroot} - -#unpackaged files -rm -fv %{buildroot}%{_libdir}/lib*.la -rm -rf %{buildroot}%{_docdir}/%{name}-%{version} - - -%check -export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:%{buildroot}%{_libdir}/pkgconfig -test "$(pkg-config --modversion OpenEXR)" = "%{version}" -make %{?_smp_mflags} check ||: - - -%files -%{_bindir}/exr* - -%post libs -p /sbin/ldconfig -%postun libs -p /sbin/ldconfig - -%files libs -%doc AUTHORS ChangeLog LICENSE NEWS README -%{_libdir}/libIlmImf-2_2.so.22* -%{_libdir}/libIlmImfUtil-2_2.so.22* - -%files devel -#omit for now, they're mostly useless, and include multilib conflicts (#342781) -#doc rpmdocs/examples -%{_datadir}/aclocal/openexr.m4 -%{_includedir}/OpenEXR/* -%{_libdir}/libIlmImf*.so -%{_libdir}/pkgconfig/OpenEXR.pc - - -%changelog -* Tue Dec 15 2020 Owen Taylor - 2.2.0-12 -- In check, don't override PKG_CONFIG_PATH from the environment (#1907528) - -* Wed Feb 07 2018 Fedora Release Engineering - 2.2.0-11 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild - -* Wed Aug 02 2017 Fedora Release Engineering - 2.2.0-10 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild - -* Wed Jul 26 2017 Fedora Release Engineering - 2.2.0-9 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild - -* Fri Feb 10 2017 Fedora Release Engineering - 2.2.0-8 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild - -* Wed Oct 12 2016 Björn Esser - 2.2.0-7 -- rebuild (GCC 6.2) -- whitespace clean-up - -* Tue Oct 11 2016 Rex Dieter - 2.2.0-6 -- -devel: make ilmbase-devel dep arch'd - -* Wed Feb 03 2016 Fedora Release Engineering - 2.2.0-5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild - -* Tue Jun 16 2015 Fedora Release Engineering - 2.2.0-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild - -* Thu Apr 16 2015 Rex Dieter 2.2.0-3 -- rebuild (gcc5) - -* Wed Feb 18 2015 Rex Dieter 2.2.0-2 -- rebuild (gcc5) - -* Thu Nov 20 2014 Rex Dieter 2.2.0-1 -- 2.2.0 - -* Fri Aug 15 2014 Fedora Release Engineering - 2.1.0-5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild - -* Fri Jun 06 2014 Fedora Release Engineering - 2.1.0-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild - -* Fri Jan 31 2014 Rex Dieter 2.1.0-3 -- respin headers patch (to match upstream fix) - -* Wed Nov 27 2013 Rex Dieter 2.1.0-2 -- install ImfDeepImageStateAttribute.h header too - -* Wed Nov 27 2013 Rex Dieter 2.1.0-1 -- 2.1.0 - -* Wed Nov 20 2013 Dan Horák 2.0.1-3 -- remove testing residue from optflags - -* Wed Nov 20 2013 Dan Horák 2.0.1-2 -- fix tests for big endian arches - -* Wed Aug 28 2013 Rex Dieter 2.0.1-1 -- openexr-2.0.1 - -* Fri Aug 02 2013 Fedora Release Engineering - 1.7.1-6 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild - -* Sun Mar 10 2013 Nicolas Chauvet - 1.7.1-5 -- Back to upstream ABI (f19+, el7+) - -* Wed Feb 13 2013 Fedora Release Engineering - 1.7.1-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild - -* Mon Oct 15 2012 Nicolas Chauvet - 1.7.1-3 -- Bump to hide revertion - -* Fri Aug 31 2012 Rex Dieter 1.7.1-2 -- rebuild - -* Thu Aug 02 2012 Nicolas Chauvet - 1.7.1-1 -- Update to 1.7.1 - --* Wed Jul 18 2012 Fedora Release Engineering - 1.7.0-5 --- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild - -* Tue Feb 28 2012 Fedora Release Engineering - 1.7.0-4 -- Rebuilt for c++ ABI breakage - -* Thu Jan 12 2012 Fedora Release Engineering - 1.7.0-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild - -* Mon Feb 07 2011 Fedora Release Engineering - 1.7.0-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild - -* Wed Aug 11 2010 Rex Dieter 1.7.0-1 -- openexr-1.7.0 - -* Wed Jul 29 2009 Rex Dieter 1.6.1-8 -- CVE-2009-1720 OpenEXR: Multiple integer overflows (#513995) -- CVE-2009-1721 OpenEXR: Invalid pointer free by image decompression (#514003) - -* Fri Jul 24 2009 Fedora Release Engineering - 1.6.1-7 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild - -* Mon Feb 23 2009 Fedora Release Engineering - 1.6.1-6 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild - -* Fri Dec 12 2008 Caolán McNamara 1.6.1-5 -- rebuild to get provides pkgconfig(OpenEXR) - -* Fri May 09 2008 Rex Dieter 1.6.1-4 -- drop: Obsoletes: OpenEXR-utils (see OpenEXR_Viewers review, bug #428228c3) - -* Fri Feb 01 2008 Rex Dieter 1.6.1-3 -- gcc43 patch -- purge rpaths - -* Wed Jan 09 2008 Rex Dieter 1.6.1-2 -- hack to omit unused-direct-shlib-dependencies -- conditionalize -libs (f8+) - -* Mon Jan 07 2008 Rex Dieter 1.6.1-1 -- openexr-1.6.1 - -* Tue Oct 30 2007 Rex Dieter 1.6.0-5 -- multiarch conflicts in OpenEXR (#342781) -- don't own %%_includedir/OpenEXR (leave that to ilmbase) - -* Mon Oct 15 2007 Rex Dieter 1.6.0-4 -- -libs: %%post/%%postun -p /sbin/ldconfig - -* Fri Oct 12 2007 Rex Dieter 1.6.0-2 -- openexr-1.6.0 - -* Mon Sep 17 2007 Rex Dieter 1.4.0a-6 -- libs: -Requires: %%name - -* Wed Aug 22 2007 Rex Dieter 1.4.0a-5 -- -libs: new subpkg to be multilib friendly -- -utils: package exrdisplay separately (separate fltk dep) - -* Sat Oct 28 2006 Rex Dieter 1.4.0a-4 -- Obsoletes/Provides: openexr(-devel) (rpmforge compatibility) - -* Thu Sep 14 2006 Rex Dieter 1.4.0a-3 -- pkgconfig patch to use Libs.private - -* Thu Sep 14 2006 Rex Dieter 1.4.0a-2 -- -devel: +Requires: pkgconfig - -* Tue Aug 29 2006 Rex Dieter 1.4.0a-1 -- openexr-1.4.0a - -* Sat Feb 18 2006 Ignacio Vazquez-Abrams 1.2.2-7 -- Further zlib fixes (#165729) - -* Mon Feb 13 2006 Ignacio Vazquez-Abrams 1.2.2-6 -- Rebuild for Fedora Extras 5 - -* Wed Aug 17 2005 Ignacio Vazquez-Abrams 1.2.2-5 -- Remove *.a from %%files devel - -* Tue Aug 16 2005 Ignacio Vazquez-Abrams 1.2.2-4 -- Removed -devel dep on zlib-devel (#165729) -- Added --disable-static to %%configure -- Fixed build with GCC 4.0.1 -- Added .so links to -devel - -* Wed May 18 2005 Ignacio Vazquez-Abrams 1.2.2-3 -- Add zlib-devel to BR -- Delete all .la files (#157652) - -* Mon May 9 2005 Ignacio Vazquez-Abrams 1.2.2-2 -- Add disttag - -* Sun May 8 2005 Ignacio Vazquez-Abrams 1.2.2-2 -- Fix BuildRequires -- Fix Requires on -devel -- Add %%post[un] scriptlets -- Fix ownership in -devel -- Don't have .deps files in %%doc - -* Wed Mar 30 2005 Ignacio Vazquez-Abrams 1.2.2-1 -- Initial RPM release diff --git a/gcc14.patch b/gcc14.patch new file mode 100644 index 0000000..8a95062 --- /dev/null +++ b/gcc14.patch @@ -0,0 +1,34 @@ +src/lib/OpenEXRCore/internal_zip.c: In function ‘apply_zip_impl’: +src/lib/OpenEXRCore/internal_zip.c:365:21: error: passing argument 2 of ‘compress2’ from incompatible pointer type [-Wincompatible-pointer-types] +/usr/include/zlib.h:1229:69: note: expected ‘long unsigned int *’ but argument is of type ‘size_t *’ {aka ‘unsigned int *’} + +src/lib/OpenEXRCore/internal_dwa_compressor.h: In function ‘exr_compress_buffer’: +src/lib/OpenEXRCore/internal_dwa_compressor.h:57:21: error: passing argument 2 of ‘compress2’ from incompatible pointer type [-Wincompatible-pointer-types] +/usr/include/zlib.h:1229:69: note: expected ‘long unsigned int *’ but argument is of type ‘size_t *’ {aka ‘unsigned int *’} + +diff --git a/src/lib/OpenEXRCore/internal_dwa_compressor.h b/src/lib/OpenEXRCore/internal_dwa_compressor.h +index e1d55336..0ee98d63 100644 +--- a/src/lib/OpenEXRCore/internal_dwa_compressor.h ++++ b/src/lib/OpenEXRCore/internal_dwa_compressor.h +@@ -54,7 +54,7 @@ static exr_result_t exr_compress_buffer ( + compbufsz = out_bytes_avail; + if (Z_OK != compress2 ( + (Bytef*) out, +- &compbufsz, ++ (uLongf *) &compbufsz, + (const Bytef*) in, + (uLong) in_bytes, + level)) +diff --git a/src/lib/OpenEXRCore/internal_zip.c b/src/lib/OpenEXRCore/internal_zip.c +index f3980aee..820fd673 100644 +--- a/src/lib/OpenEXRCore/internal_zip.c ++++ b/src/lib/OpenEXRCore/internal_zip.c +@@ -362,7 +362,7 @@ apply_zip_impl (exr_encode_pipeline_t* encode) + compbufsz = encode->compressed_alloc_size; + if (Z_OK != compress2 ( + (Bytef*) encode->compressed_buffer, +- &compbufsz, ++ (uLongf *) &compbufsz, + (const Bytef*) encode->scratch_buffer_1, + (uLong) encode->packed_bytes, + level)) diff --git a/march-x86-64-v3.patch b/march-x86-64-v3.patch new file mode 100644 index 0000000..3115c7f --- /dev/null +++ b/march-x86-64-v3.patch @@ -0,0 +1,26 @@ +Backport of https://github.com/AcademySoftwareFoundation/openexr/pull/1507 + +diff --git a/src/lib/OpenEXRCore/internal_cpuid.h b/src/lib/OpenEXRCore/internal_cpuid.h +index edfee0b8..8a2573b8 100644 +--- a/src/lib/OpenEXRCore/internal_cpuid.h ++++ b/src/lib/OpenEXRCore/internal_cpuid.h +@@ -39,14 +39,15 @@ check_for_x86_simd (int* f16c, int* avx, int* sse2) + *f16c = 0; + # endif + +-#elif OPENEXR_ENABLE_X86_SIMD_CHECK +- ++#elif defined(__AVX__) && defined(__F16C__) + // shortcut if everything is turned on / compiled in +-# if defined(__AVX__) && defined(__F16C__) + *f16c = 1; + *avx = 1; + *sse2 = 1; +-# elif defined(_MSC_VER) && defined(_WIN32) ++ ++#elif OPENEXR_ENABLE_X86_SIMD_CHECK ++ ++# if defined(_MSC_VER) && defined(_WIN32) + int regs[4], osxsave; + + __cpuid (regs, 0); diff --git a/openexr-3.1.10-CVE-2023-5841.patch b/openexr-3.1.10-CVE-2023-5841.patch new file mode 100644 index 0000000..5e37c10 --- /dev/null +++ b/openexr-3.1.10-CVE-2023-5841.patch @@ -0,0 +1,532 @@ +From 2f4e49b95baaecaae86f93c9ab803500db48c4cc Mon Sep 17 00:00:00 2001 +From: Kimball Thurston +Date: Sat, 3 Feb 2024 20:00:53 +1300 +Subject: [PATCH 1/4] enable deep file checks for core + +Signed-off-by: Kimball Thurston +--- + src/lib/OpenEXRUtil/ImfCheckFile.cpp | 181 ++++++++++++++++++++++----- + 1 file changed, 148 insertions(+), 33 deletions(-) + +diff --git a/src/lib/OpenEXRUtil/ImfCheckFile.cpp b/src/lib/OpenEXRUtil/ImfCheckFile.cpp +index 8c4fbe84..8946e88d 100644 +--- a/src/lib/OpenEXRUtil/ImfCheckFile.cpp ++++ b/src/lib/OpenEXRUtil/ImfCheckFile.cpp +@@ -1172,11 +1172,83 @@ runChecks(T& source,bool reduceMemory,bool reduceTime) + return threw; + } + ++static exr_result_t ++realloc_deepdata(exr_decode_pipeline_t* decode) ++{ ++ int32_t w = decode->chunk.width; ++ int32_t h = decode->chunk.height; ++ uint64_t totsamps = 0, bytes = 0; ++ const int32_t *sampbuffer = decode->sample_count_table; ++ std::vector* ud = static_cast*>( ++ decode->decoding_user_data); ++ ++ if ( ! ud ) ++ { ++ for (int c = 0; c < decode->channel_count; c++) ++ { ++ exr_coding_channel_info_t& outc = decode->channels[c]; ++ outc.decode_to_ptr = NULL; ++ outc.user_pixel_stride = outc.user_bytes_per_element; ++ outc.user_line_stride = 0; ++ } ++ return EXR_ERR_SUCCESS; ++ } ++ ++ if ((decode->decode_flags & ++ EXR_DECODE_SAMPLE_COUNTS_AS_INDIVIDUAL)) ++ { ++ for (int32_t y = 0; y < h; ++y) ++ { ++ for (int x = 0; x < w; ++x) ++ totsamps += sampbuffer[x]; ++ sampbuffer += w; ++ } ++ } ++ else ++ { ++ for (int32_t y = 0; y < h; ++y) ++ totsamps += sampbuffer[y*w + w - 1]; ++ } ++ ++ for (int c = 0; c < decode->channel_count; c++) ++ { ++ exr_coding_channel_info_t& outc = decode->channels[c]; ++ bytes += totsamps * outc.user_bytes_per_element; ++ } ++ ++ if (bytes >= gMaxBytesPerDeepScanline * h) ++ { ++ for (int c = 0; c < decode->channel_count; c++) ++ { ++ exr_coding_channel_info_t& outc = decode->channels[c]; ++ outc.decode_to_ptr = NULL; ++ outc.user_pixel_stride = outc.user_bytes_per_element; ++ outc.user_line_stride = 0; ++ } ++ return EXR_ERR_SUCCESS; ++ } ++ ++ if (ud->size () < bytes) ++ ud->resize (bytes); ++ ++ uint8_t* dptr = &((*ud)[0]); ++ for (int c = 0; c < decode->channel_count; c++) ++ { ++ exr_coding_channel_info_t& outc = decode->channels[c]; ++ outc.decode_to_ptr = dptr; ++ outc.user_pixel_stride = outc.user_bytes_per_element; ++ outc.user_line_stride = 0; ++ ++ dptr += totsamps * (uint64_t) outc.user_bytes_per_element; ++ } ++ return EXR_ERR_SUCCESS; ++} ++ + //////////////////////////////////////// + + bool readCoreScanlinePart(exr_context_t f, int part, bool reduceMemory, bool reduceTime) + { +- exr_result_t rv; ++ exr_result_t rv, frv; + exr_attr_box2i_t datawin; + rv = exr_get_data_window (f, part, &datawin); + if (rv != EXR_ERR_SUCCESS) +@@ -1194,6 +1266,8 @@ bool readCoreScanlinePart(exr_context_t f, int part, bool reduceMemory, bool red + if (rv != EXR_ERR_SUCCESS) + return true; + ++ frv = rv; ++ + for (uint64_t chunk = 0; chunk < height; chunk += lines_per_chunk) + { + exr_chunk_info_t cinfo = { 0 }; +@@ -1202,6 +1276,7 @@ bool readCoreScanlinePart(exr_context_t f, int part, bool reduceMemory, bool red + rv = exr_read_scanline_chunk_info (f, part, y, &cinfo); + if (rv != EXR_ERR_SUCCESS) + { ++ frv = rv; + if (reduceTime) + break; + continue; +@@ -1224,22 +1299,33 @@ bool readCoreScanlinePart(exr_context_t f, int part, bool reduceMemory, bool red + bytes += width * (uint64_t)outc.user_bytes_per_element * (uint64_t)lines_per_chunk; + } + +- // TODO: check we are supposed to multiple by lines per chunk above + doread = true; +- if (reduceMemory && bytes >= gMaxBytesPerScanline) +- doread = false; ++ if (cinfo.type == EXR_STORAGE_DEEP_SCANLINE) ++ { ++ decoder.decoding_user_data = &imgdata; ++ decoder.realloc_nonimage_data_fn = &realloc_deepdata; ++ } ++ else ++ { ++ if (reduceMemory && bytes >= gMaxBytesPerScanline) ++ doread = false; + +- if (doread) +- imgdata.resize( bytes ); ++ if (doread) ++ imgdata.resize (bytes); ++ } + rv = exr_decoding_choose_default_routines (f, part, &decoder); + if (rv != EXR_ERR_SUCCESS) ++ { ++ frv = rv; + break; ++ } + } + else + { + rv = exr_decoding_update (f, part, &cinfo, &decoder); + if (rv != EXR_ERR_SUCCESS) + { ++ frv = rv; + if (reduceTime) + break; + continue; +@@ -1248,19 +1334,25 @@ bool readCoreScanlinePart(exr_context_t f, int part, bool reduceMemory, bool red + + if (doread) + { +- uint8_t *dptr = &(imgdata[0]); +- for (int c = 0; c < decoder.channel_count; c++) ++ if (cinfo.type != EXR_STORAGE_DEEP_SCANLINE) + { +- exr_coding_channel_info_t & outc = decoder.channels[c]; +- outc.decode_to_ptr = dptr; +- outc.user_pixel_stride = outc.user_bytes_per_element; +- outc.user_line_stride = outc.user_pixel_stride * width; +- dptr += width * (uint64_t)outc.user_bytes_per_element * (uint64_t)lines_per_chunk; ++ uint8_t* dptr = &(imgdata[0]); ++ for (int c = 0; c < decoder.channel_count; c++) ++ { ++ exr_coding_channel_info_t& outc = decoder.channels[c]; ++ outc.decode_to_ptr = dptr; ++ outc.user_pixel_stride = outc.user_bytes_per_element; ++ outc.user_line_stride = outc.user_pixel_stride * width; ++ ++ dptr += width * (uint64_t) outc.user_bytes_per_element * ++ (uint64_t) lines_per_chunk; ++ } + } + + rv = exr_decoding_run (f, part, &decoder); + if (rv != EXR_ERR_SUCCESS) + { ++ frv = rv; + if (reduceTime) + break; + } +@@ -1269,14 +1361,14 @@ bool readCoreScanlinePart(exr_context_t f, int part, bool reduceMemory, bool red + + exr_decoding_destroy (f, &decoder); + +- return (rv != EXR_ERR_SUCCESS); ++ return (frv != EXR_ERR_SUCCESS); + } + + //////////////////////////////////////// + + bool readCoreTiledPart(exr_context_t f, int part, bool reduceMemory, bool reduceTime) + { +- exr_result_t rv; ++ exr_result_t rv, frv; + + exr_attr_box2i_t datawin; + rv = exr_get_data_window (f, part, &datawin); +@@ -1296,6 +1388,7 @@ bool readCoreTiledPart(exr_context_t f, int part, bool reduceMemory, bool reduce + if (rv != EXR_ERR_SUCCESS) + return true; + ++ frv = rv; + bool keepgoing = true; + for (int32_t ylevel = 0; keepgoing && ylevel < levelsy; ++ylevel ) + { +@@ -1305,6 +1398,7 @@ bool readCoreTiledPart(exr_context_t f, int part, bool reduceMemory, bool reduce + rv = exr_get_level_sizes (f, part, xlevel, ylevel, &levw, &levh); + if (rv != EXR_ERR_SUCCESS) + { ++ frv = rv; + if (reduceTime) + { + keepgoing = false; +@@ -1317,6 +1411,7 @@ bool readCoreTiledPart(exr_context_t f, int part, bool reduceMemory, bool reduce + rv = exr_get_tile_sizes (f, part, xlevel, ylevel, &curtw, &curth); + if (rv != EXR_ERR_SUCCESS) + { ++ frv = rv; + if (reduceTime) + { + keepgoing = false; +@@ -1343,6 +1438,7 @@ bool readCoreTiledPart(exr_context_t f, int part, bool reduceMemory, bool reduce + rv = exr_read_tile_chunk_info (f, part, tx, ty, xlevel, ylevel, &cinfo); + if (rv != EXR_ERR_SUCCESS) + { ++ frv = rv; + if (reduceTime) + { + keepgoing = false; +@@ -1356,6 +1452,7 @@ bool readCoreTiledPart(exr_context_t f, int part, bool reduceMemory, bool reduce + rv = exr_decoding_initialize (f, part, &cinfo, &decoder); + if (rv != EXR_ERR_SUCCESS) + { ++ frv = rv; + keepgoing = false; + break; + } +@@ -1372,14 +1469,24 @@ bool readCoreTiledPart(exr_context_t f, int part, bool reduceMemory, bool reduce + } + + doread = true; +- if (reduceMemory && bytes >= gMaxTileBytes) +- doread = false; ++ if (cinfo.type == EXR_STORAGE_DEEP_TILED) ++ { ++ decoder.decoding_user_data = &tiledata; ++ decoder.realloc_nonimage_data_fn = &realloc_deepdata; ++ } ++ else ++ { ++ if (reduceMemory && bytes >= gMaxTileBytes) ++ doread = false; + +- if (doread) +- tiledata.resize( bytes ); +- rv = exr_decoding_choose_default_routines (f, part, &decoder); ++ if (doread) ++ tiledata.resize (bytes); ++ } ++ rv = exr_decoding_choose_default_routines ( ++ f, part, &decoder); + if (rv != EXR_ERR_SUCCESS) + { ++ frv = rv; + keepgoing = false; + break; + } +@@ -1389,6 +1496,7 @@ bool readCoreTiledPart(exr_context_t f, int part, bool reduceMemory, bool reduce + rv = exr_decoding_update (f, part, &cinfo, &decoder); + if (rv != EXR_ERR_SUCCESS) + { ++ frv = rv; + if (reduceTime) + { + keepgoing = false; +@@ -1400,19 +1508,28 @@ bool readCoreTiledPart(exr_context_t f, int part, bool reduceMemory, bool reduce + + if (doread) + { +- uint8_t *dptr = &(tiledata[0]); +- for (int c = 0; c < decoder.channel_count; c++) ++ if (cinfo.type != EXR_STORAGE_DEEP_TILED) + { +- exr_coding_channel_info_t & outc = decoder.channels[c]; +- outc.decode_to_ptr = dptr; +- outc.user_pixel_stride = outc.user_bytes_per_element; +- outc.user_line_stride = outc.user_pixel_stride * curtw; +- dptr += (uint64_t)curtw * (uint64_t)outc.user_bytes_per_element * (uint64_t)curth; ++ uint8_t* dptr = &(tiledata[0]); ++ for (int c = 0; c < decoder.channel_count; c++) ++ { ++ exr_coding_channel_info_t& outc = ++ decoder.channels[c]; ++ outc.decode_to_ptr = dptr; ++ outc.user_pixel_stride = ++ outc.user_bytes_per_element; ++ outc.user_line_stride = ++ outc.user_pixel_stride * curtw; ++ dptr += (uint64_t) curtw * ++ (uint64_t) outc.user_bytes_per_element * ++ (uint64_t) curth; ++ } + } + + rv = exr_decoding_run (f, part, &decoder); + if (rv != EXR_ERR_SUCCESS) + { ++ frv = rv; + if (reduceTime) + { + keepgoing = false; +@@ -1448,16 +1565,14 @@ bool checkCoreFile(exr_context_t f, bool reduceMemory, bool reduceTime) + if (rv != EXR_ERR_SUCCESS) + return true; + +- // TODO: Need to fill this in +- if (store == EXR_STORAGE_DEEP_SCANLINE || store == EXR_STORAGE_DEEP_TILED) +- continue; +- +- if (store == EXR_STORAGE_SCANLINE) ++ if (store == EXR_STORAGE_SCANLINE || ++ store == EXR_STORAGE_DEEP_SCANLINE) + { + if ( readCoreScanlinePart (f, p, reduceMemory, reduceTime) ) + return true; + } +- else if (store == EXR_STORAGE_TILED) ++ else if (store == EXR_STORAGE_TILED || ++ store == EXR_STORAGE_DEEP_TILED) + { + if ( readCoreTiledPart (f, p, reduceMemory, reduceTime) ) + return true; +-- +2.43.0 + + +From 166ace3ef06a2a4fc16bb58f42204629c9273798 Mon Sep 17 00:00:00 2001 +From: Kimball Thurston +Date: Sat, 3 Feb 2024 20:01:33 +1300 +Subject: [PATCH 2/4] fix possible int overflow + +Signed-off-by: Kimball Thurston +--- + src/lib/OpenEXRCore/unpack.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +diff --git a/src/lib/OpenEXRCore/unpack.c b/src/lib/OpenEXRCore/unpack.c +index 9ecb729c..80990e0d 100644 +--- a/src/lib/OpenEXRCore/unpack.c ++++ b/src/lib/OpenEXRCore/unpack.c +@@ -1205,9 +1205,10 @@ generic_unpack_deep_pointers (exr_decode_pipeline_t* decode) + if (outpix) + { + uint8_t* cdata = outpix; ++ + UNPACK_SAMPLES (samps) + } +- srcbuffer += bpc * samps; ++ srcbuffer += ((size_t) bpc) * ((size_t) samps); + } + } + sampbuffer += w; +@@ -1251,12 +1252,14 @@ generic_unpack_deep (exr_decode_pipeline_t* decode) + } + else + prevsamps = sampbuffer[w - 1]; ++ + srcbuffer += ((size_t) bpc) * ((size_t) prevsamps); + + if (incr_tot) totsamps += (size_t) prevsamps; + + continue; + } ++ + cdata += totsamps * ((size_t) ubpc); + + for (int x = 0; x < w; ++x) +@@ -1272,7 +1275,7 @@ generic_unpack_deep (exr_decode_pipeline_t* decode) + + UNPACK_SAMPLES (samps) + +- srcbuffer += bpc * samps; ++ srcbuffer += ((size_t) bpc) * ((size_t) samps); + if (incr_tot) totsamps += (size_t) samps; + } + } +@@ -1310,7 +1313,7 @@ internal_exr_match_decode ( + + if (isdeep) + { +- if ((decode->decode_flags & EXR_DECODE_SAMPLE_COUNTS_AS_INDIVIDUAL)) ++ if ((decode->decode_flags & EXR_DECODE_NON_IMAGE_DATA_AS_POINTERS)) + return &generic_unpack_deep_pointers; + return &generic_unpack_deep; + } +-- +2.43.0 + + +From d1cea15375da4da642defa91f7f4b78e251af95d Mon Sep 17 00:00:00 2001 +From: Kimball Thurston +Date: Sat, 3 Feb 2024 20:04:16 +1300 +Subject: [PATCH 3/4] fix validation of deep sample counts + +Addresses CVE-2023-5841, fixing sample count check to not only check +against 0 but previous sample as well. + +Signed-off-by: Kimball Thurston +--- + src/lib/OpenEXRCore/decoding.c | 37 +++++++++++++++++++++------------- + 1 file changed, 23 insertions(+), 14 deletions(-) + +diff --git a/src/lib/OpenEXRCore/decoding.c b/src/lib/OpenEXRCore/decoding.c +index e9e8f7f9..65f0f2f8 100644 +--- a/src/lib/OpenEXRCore/decoding.c ++++ b/src/lib/OpenEXRCore/decoding.c +@@ -290,6 +290,9 @@ default_decompress_chunk (exr_decode_pipeline_t* decode) + { + uint64_t sampsize = + (((uint64_t) decode->chunk.width) * ((uint64_t) decode->chunk.height)); ++ ++ if ((decode->decode_flags & EXR_DECODE_SAMPLE_COUNTS_AS_INDIVIDUAL)) ++ sampsize += 1; + sampsize *= sizeof (int32_t); + + rv = decompress_data ( +@@ -342,7 +345,7 @@ unpack_sample_table ( + exr_result_t rv = EXR_ERR_SUCCESS; + int32_t w = decode->chunk.width; + int32_t h = decode->chunk.height; +- int32_t totsamp = 0; ++ uint64_t totsamp = 0; + int32_t* samptable = decode->sample_count_table; + size_t combSampSize = 0; + +@@ -353,38 +356,44 @@ unpack_sample_table ( + { + for (int32_t y = 0; y < h; ++y) + { ++ int32_t *cursampline = samptable + y * w; + int32_t prevsamp = 0; + for (int32_t x = 0; x < w; ++x) + { + int32_t nsamps = +- (int32_t) one_to_native32 ((uint32_t) samptable[y * w + x]); +- if (nsamps < 0) return EXR_ERR_INVALID_SAMPLE_DATA; +- samptable[y * w + x] = nsamps - prevsamp; +- prevsamp = nsamps; ++ (int32_t) one_to_native32 ((uint32_t) cursampline[x]); ++ if (nsamps < prevsamp) return EXR_ERR_INVALID_SAMPLE_DATA; ++ ++ cursampline[x] = nsamps - prevsamp; ++ prevsamp = nsamps; + } +- totsamp += prevsamp; ++ totsamp += (uint64_t)prevsamp; + } +- samptable[w * h] = totsamp; ++ if (totsamp >= (uint64_t)INT32_MAX) ++ return EXR_ERR_INVALID_SAMPLE_DATA; ++ samptable[w * h] = (int32_t)totsamp; + } + else + { + for (int32_t y = 0; y < h; ++y) + { ++ int32_t *cursampline = samptable + y * w; + int32_t prevsamp = 0; + for (int32_t x = 0; x < w; ++x) + { + int32_t nsamps = +- (int32_t) one_to_native32 ((uint32_t) samptable[y * w + x]); +- if (nsamps < 0) return EXR_ERR_INVALID_SAMPLE_DATA; +- samptable[y * w + x] = nsamps; +- prevsamp = nsamps; ++ (int32_t) one_to_native32 ((uint32_t) cursampline[x]); ++ if (nsamps < prevsamp) return EXR_ERR_INVALID_SAMPLE_DATA; ++ ++ cursampline[x] = nsamps; ++ prevsamp = nsamps; + } +- totsamp += prevsamp; ++ ++ totsamp += (uint64_t)prevsamp; + } + } + +- if (totsamp < 0 || +- (((uint64_t) totsamp) * combSampSize) > decode->chunk.unpacked_size) ++ if ((totsamp * combSampSize) > decode->chunk.unpacked_size) + { + rv = pctxt->report_error ( + pctxt, EXR_ERR_INVALID_SAMPLE_DATA, "Corrupt sample count table"); +-- +2.43.0 + + +From 9ad0e7c8a271df1d7a2ae4722fb5f0d48d191b62 Mon Sep 17 00:00:00 2001 +From: Kimball Thurston +Date: Sat, 3 Feb 2024 20:07:49 +1300 +Subject: [PATCH 4/4] add clarifying comment + +Signed-off-by: Kimball Thurston +--- + src/lib/OpenEXRUtil/ImfCheckFile.cpp | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/src/lib/OpenEXRUtil/ImfCheckFile.cpp b/src/lib/OpenEXRUtil/ImfCheckFile.cpp +index 8946e88d..0058f627 100644 +--- a/src/lib/OpenEXRUtil/ImfCheckFile.cpp ++++ b/src/lib/OpenEXRUtil/ImfCheckFile.cpp +@@ -1172,6 +1172,9 @@ runChecks(T& source,bool reduceMemory,bool reduceTime) + return threw; + } + ++// This is not entirely needed in that the chunk info has the ++// total unpacked_size field which can be used for allocation ++// but this adds an additional point to use when debugging issues. + static exr_result_t + realloc_deepdata(exr_decode_pipeline_t* decode) + { +-- +2.43.0 + diff --git a/openexr-cstdint.patch b/openexr-cstdint.patch new file mode 100644 index 0000000..924174c --- /dev/null +++ b/openexr-cstdint.patch @@ -0,0 +1,12 @@ +Index: openexr-3.1.5/src/bin/exrcheck/main.cpp +=================================================================== +--- openexr-3.1.5.orig/src/bin/exrcheck/main.cpp ++++ openexr-3.1.5/src/bin/exrcheck/main.cpp +@@ -13,6 +13,7 @@ + # include + #endif + #include ++#include + + using namespace OPENEXR_IMF_NAMESPACE; + using std::cout; diff --git a/openexr.spec b/openexr.spec new file mode 100644 index 0000000..64f8546 --- /dev/null +++ b/openexr.spec @@ -0,0 +1,262 @@ +%{?!python3_pkgversion:%global python3_pkgversion 3} +%global sover 30 + +Name: openexr +Version: 3.1.10 +Release: 8%{?dist} +Summary: Provides the specification and reference implementation of the EXR file format + +License: BSD-3-Clause +URL: https://www.openexr.com/ +Source0: https://github.com/AcademySoftwareFoundation/%{name}/archive/v%{version}/%{name}-%{version}.tar.gz + +Patch0: openexr-cstdint.patch +# https://github.com/AcademySoftwareFoundation/openexr/pull/1507 +Patch1: march-x86-64-v3.patch +# Fix incompatible pointer types with GCC 14 on i686 +Patch2: gcc14.patch +# Fix CVE 2023 5841 +# https://github.com/AcademySoftwareFoundation/openexr/pull/1627 +# Backported to 3.1.10 +Patch3: openexr-3.1.10-CVE-2023-5841.patch + +BuildRequires: cmake gcc gcc-c++ +BuildRequires: boost-devel +BuildRequires: imath-devel +BuildRequires: python%{python3_pkgversion}-devel +BuildRequires: zlib-devel + +Obsoletes: OpenEXR < 2.5.3 +Provides: OpenEXR = %{version}-%{release} + +%description +OpenEXR is an open-source high-dynamic-range floating-point image file format +for high-quality image processing and storage. This document presents a brief +overview of OpenEXR and explains concepts that are specific to this format. + +This package containes the binaries for OpenEXR. + + +%package libs +Summary: OpenEXR Libraries +Provides: OpenEXR-libs = %{version}-%{release} +Obsoletes: OpenEXR-libs < 2.5.3 + +%description libs +OpenEXR is an open-source high-dynamic-range floating-point image file format +for high-quality image processing and storage. This document presents a brief +overview of OpenEXR and explains concepts that are specific to this format. + +OpenEXR Features: + +* High dynamic range and color precision. Support for 16-bit floating-point, +* 32-bit floating-point, and 32-bit integer pixels. +* Multiple image compression algorithms, both lossless and lossy. Some of + the included codecs can achieve 2:1 lossless compression ratios on images + with film grain. The lossy codecs have been tuned for visual quality and + decoding performance. +* Extensibility. New compression codecs and image types can easily be added + by extending the C++ classes included in the OpenEXR software distribution. + New image attributes (strings, vectors, integers, etc.) can be added to + OpenEXR image headers without affecting backward compatibility with existing + OpenEXR applications. +* Support for stereoscopic image workflows and a generalization + to multi-views. +* Flexible support for deep data: pixels can store a variable-length list + of samples and, thus, it is possible to store multiple values at different + depths for each pixel. Hard surfaces and volumetric data representations are + accommodated. +* Multipart: ability to encode separate, but related, images in one file. + This allows for access to individual parts without the need to read other + parts in the file. +* Versioning: OpenEXR source allows for user configurable C++ + namespaces to provide protection when using multiple versions of the library + in the same process space. + +The IlmBase Library: + +Also a part of OpenEXR, the IlmBase library is a basic, light-weight, and +efficient representation of 2D and 3D vectors and matrices and other simple but +useful mathematical objects, functions, and data types common in computer +graphics applications, including the “half” 16-bit floating-point type. + + +%package devel +Requires: %{name}-libs%{?_isa} = %{version}-%{release} + +Provides: OpenEXR-devel = %{version}-%{release} +Provides: OpenEXR-devel%{?_isa} = %{version}-%{release} +Obsoletes: OpenEXR-devel < 2.5.3 + +Provides: ilmbase-devel = %{version}-%{release} +Provides: ilmbase-devel%{?_isa} = %{version}-%{release} +Obsoletes: ilmbase-devel < 2.5.3 + +Summary: Development files for %{name} + +%description devel +%{summary}. + + +%prep +%autosetup -p1 + + +%build +%cmake +%cmake_build + + +%install +%cmake_install + + +%check +# Some tests fail on particular architectures +%ifarch aarch64 +# https://github.com/AcademySoftwareFoundation/openexr/issues/1460 +EXCLUDE_REGEX='DWA[AB]Compression' +%endif +%ifarch s390x +# https://github.com/AcademySoftwareFoundation/openexr/issues/1175 +EXCLUDE_REGEX='ReadDeep|DWA[AB]Compression|testCompression|Rgba|SampleImages|SharedFrameBuffer' +%endif +%ctest --exclude-regex "$EXCLUDE_REGEX" + + +%files +%{_bindir}/exr2aces +%{_bindir}/exrenvmap +%{_bindir}/exrheader +%{_bindir}/exrinfo +%{_bindir}/exrmakepreview +%{_bindir}/exrmaketiled +%{_bindir}/exrmultipart +%{_bindir}/exrmultiview +%{_bindir}/exrstdattr + +%files libs +%doc CHANGES.md CONTRIBUTING.md GOVERNANCE.md SECURITY.md CODE_OF_CONDUCT.md CONTRIBUTORS.md README.md +%license LICENSE.md +%{_libdir}/libIex-3_1.so.%{sover}{,.*} +%{_libdir}/libIlmThread-3_1.so.%{sover}{,.*} +%{_libdir}/libOpenEXR-3_1.so.%{sover}{,.*} +%{_libdir}/libOpenEXRCore-3_1.so.%{sover}{,.*} +%{_libdir}/libOpenEXRUtil-3_1.so.%{sover}{,.*} + +%files devel +%{_docdir}/OpenEXR/ +%{_includedir}/OpenEXR/ +%{_libdir}/libIex{,-3_1}.so +%{_libdir}/libIlmThread{,-3_1}.so +%{_libdir}/libOpenEXR{,-3_1}.so +%{_libdir}/libOpenEXRCore{,-3_1}.so +%{_libdir}/libOpenEXRUtil{,-3_1}.so +%{_libdir}/cmake/OpenEXR/ +%{_libdir}/pkgconfig/OpenEXR.pc + + +%changelog +* Tue Oct 29 2024 Troy Dawson - 3.1.10-8 +- Bump release for October 2024 mass rebuild: + Resolves: RHEL-64018 + +* Wed Jun 26 2024 Josef Ridky - 3.1.10-7 +- Add gating.yaml file + +* Mon Jun 24 2024 Troy Dawson - 3.1.10-6 +- Bump release for June 2024 mass rebuild + +* Mon Feb 05 2024 Benjamin A. Beasley - 3.1.10-5 +- Backport proposed fix for CVE-2023-5841 to 3.1.10 (fix RHBZ#2262406) + +* Thu Jan 25 2024 Fedora Release Engineering - 3.1.10-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + +* Sun Jan 21 2024 Fedora Release Engineering - 3.1.10-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + +* Fri Aug 04 2023 Yaakov Selkowitz - 3.1.10-2 +- Fix build for x86-64-v3 +- Run all tests on i686, ppc64le, x86_64 + +* Fri Aug 04 2023 Richard Shaw - 3.1.10-1 +- Update to 3.1.10. + +* Thu Jul 20 2023 Fedora Release Engineering - 3.1.9-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild + +* Tue Jul 18 2023 Josef Ridky - 3.1.9-2 +- Migrate to SPDX license format + +* Mon Jun 26 2023 Richard Shaw - 3.1.9-1 +- Upgrade to 3.1.9. + +* Mon Jun 19 2023 Florian Weimer - 3.1.8-2 +- Disable F16C intrinsics on x86-64 (#2212579) + +* Wed Jun 07 2023 Richard Shaw - 3.1.8-1 +- Update to 3.1.8. + +* Tue May 16 2023 Richard Shaw - 3.1.7-1 +- Update to 3.1.7. + +* Mon Mar 20 2023 Richard Shaw - 3.1.6-1 +- Update to 3.1.6. + +* Thu Feb 23 2023 Benjamin A. Beasley - 3.1.5-4 +- Do not use broad globs in shared directories + +* Thu Jan 19 2023 Fedora Release Engineering - 3.1.5-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild + +* Fri Jul 22 2022 Fedora Release Engineering - 3.1.5-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild + +* Tue Apr 12 2022 Richard Shaw - 3.1.5-1 +- Update to 3.1.5. + +* Thu Mar 10 2022 Josef Ridky - 3.1.4-1 +- Update to 3.1.4 + +* Thu Jan 20 2022 Fedora Release Engineering - 3.1.3-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild + +* Wed Nov 03 2021 Richard Shaw - 3.1.3-1 +- Update to 3.1.3. + +* Wed Oct 06 2021 Richard Shaw - 3.1.2-1 +- Update to 3.1.2. + +* Wed Aug 11 2021 Richard Shaw - 3.1.1-1 +- Update to 3.1.1. + +* Thu Aug 05 2021 Richard Shaw - 3.0.5-3 +- Remove Threads::Threads from link libraries in f35+ + +* Thu Jul 22 2021 Fedora Release Engineering - 3.0.5-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild + +* Tue Jul 20 2021 Richard Shaw - 3.0.5-1 +- Update to 3.0.5. + +* Fri Jun 04 2021 Python Maint - 2.5.5-2 +- Rebuilt for Python 3.10 + +* Mon Mar 15 2021 Richard Shaw - 2.5.5-1 +- Update to 2.5.5. + +* Tue Jan 26 2021 Fedora Release Engineering - 2.5.4-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + +* Fri Jan 22 2021 Jonathan Wakely - 2.5.4-3 +- Rebuilt for Boost 1.75 + +* Mon Jan 18 2021 Richard Shaw - 2.5.4-2 +- Fix Provides/Obsoletes of OpenEXR package. + +* Wed Jan 06 2021 Richard Shaw - 2.5.4-1 +- Update to 2.5.4. + +* Wed Dec 9 2020 Richard Shaw - 2.5.3-1 +- Repackaged due to massive changes in build system and inclusion of IlmBase. diff --git a/sources b/sources new file mode 100644 index 0000000..deb0a28 --- /dev/null +++ b/sources @@ -0,0 +1 @@ +SHA512 (openexr-3.1.10.tar.gz) = 6c443940da1a3892b1bbf045898790c7544cf97bec84a416ccf664bff597664fb070e9ef4645d77144872e185f8b821d9cd8005d7b56c8e91ba57f53b8037365