Add asserts before memcpy during extent merge Validate write offsets and per-extent copy sizes before memcpy when merging item extents to avoid out-of-bounds writes. The original pull request is https://github.com/AOMediaCodec/libavif/pull/3004. Co-authored-by: Wan-Teh Chang <wtc@google.com>
diff --git a/src/read.c b/src/read.c index e96fc59..f343ed9 100644 --- a/src/read.c +++ b/src/read.c
@@ -1483,7 +1483,7 @@ // Set this until we manage to fill the entire mergedExtents buffer item->partialMergedExtents = AVIF_TRUE; - uint8_t * front = item->mergedExtents.data; + size_t writeOffset = 0; // Write offset for item->mergedExtents.data size_t remainingBytes = totalBytesToRead; for (uint32_t extentIter = 0; extentIter < item->extents.count; ++extentIter) { avifExtent * extent = &item->extents.extent[extentIter]; @@ -1534,9 +1534,10 @@ item->mergedExtents.size = bytesToRead; } else { AVIF_ASSERT_OR_RETURN(item->ownsMergedExtents); - AVIF_ASSERT_OR_RETURN(front); - memcpy(front, offsetBuffer.data, bytesToRead); - front += bytesToRead; + AVIF_ASSERT_OR_RETURN(writeOffset < item->mergedExtents.size); + AVIF_ASSERT_OR_RETURN(bytesToRead <= item->mergedExtents.size - writeOffset); + memcpy(item->mergedExtents.data + writeOffset, offsetBuffer.data, bytesToRead); + writeOffset += bytesToRead; } remainingBytes -= bytesToRead;