Use valid xmp_data buffer in JpegTest.TooLargeXMP Actually allocate a too large xmp_data buffer. Make sure the avifJPEGParseGainMapXMP() call would succeed if the size > INT_MAX check were removed. The original JpegTest.TooLargeXMP test is renamed JpegTest.TooLargeXMPFake. A follow-up to PR https://github.com/AOMediaCodec/libavif/pull/3249.
diff --git a/tests/gtest/avifjpeggainmaptest.cc b/tests/gtest/avifjpeggainmaptest.cc index bb44231..12fa468 100644 --- a/tests/gtest/avifjpeggainmaptest.cc +++ b/tests/gtest/avifjpeggainmaptest.cc
@@ -1,9 +1,14 @@ // Copyright 2023 Google LLC // SPDX-License-Identifier: BSD-2-Clause +#include <limits.h> #include <math.h> +#include <stdint.h> +#include <string.h> #include <limits> +#include <memory> +#include <new> #include "avif/avif.h" #include "avifjpeg.h" @@ -215,8 +220,7 @@ </rdf:Description> </rdf:RDF> </x:xmpmeta> -<?xpacket end="w"?> - )"; +<?xpacket end="w"?>)"; GainMapPtr gain_map(avifGainMapCreate()); avifBool is_avif_gain_map; ASSERT_TRUE(avifJPEGParseGainMapXMP((const uint8_t*)xmp.data(), xmp.size(), @@ -335,7 +339,7 @@ gain_map.get(), &is_avif_gain_map)); } -TEST(JpegTest, TooLargeXMP) { +TEST(JpegTest, TooLargeXMPFake) { const uint8_t xmp = 0; GainMapPtr gain_map(avifGainMapCreate()); avifBool is_avif_gain_map; @@ -344,6 +348,34 @@ gain_map.get(), &is_avif_gain_map)); } +// This test requires a 64-bit size_t type. +#if SIZE_MAX > UINT_MAX +TEST(JpegTest, TooLargeXMP) { + const std::string xmp = R"( +<x:xmpmeta xmlns:x="adobe:ns:meta/"> + <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> + <rdf:Description rdf:about="stuff" + xmlns:hdrgm="http://ns.adobe.com/hdr-gain-map/1.0/" hdrgm:Version="1.0"> + </rdf:Description> + </rdf:RDF> +</x:xmpmeta> +<?xpacket end="w"?>)"; + // When xmp_size is cast to int, it is equal to xmp.size(). + const size_t xmp_size = size_t{UINT_MAX} + 1 + xmp.size(); + std::unique_ptr<uint8_t[]> xmp_data(new (std::nothrow) uint8_t[xmp_size]); + if (!xmp_data) { + GTEST_SKIP() << "Allocation of " << xmp_size << " bytes failed"; + } + memcpy(xmp_data.get(), xmp.data(), xmp.size()); + // Add junk after the xmp string. + memset(xmp_data.get() + xmp.size(), 'a', xmp_size - xmp.size()); + GainMapPtr gain_map(avifGainMapCreate()); + avifBool is_avif_gain_map; + EXPECT_FALSE(avifJPEGParseGainMapXMP(xmp_data.get(), xmp_size, gain_map.get(), + &is_avif_gain_map)); +} +#endif // SIZE_MAX > UINT_MAX + //------------------------------------------------------------------------------ } // namespace