diff --git a/gnu/local.mk b/gnu/local.mk index 2c303b0575..f7d6d5db95 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -1833,6 +1833,7 @@ dist_patch_DATA = \ %D%/packages/patches/libutils-remove-damaging-includes.patch \ %D%/packages/patches/libvdpau-va-gl-unbundle.patch \ %D%/packages/patches/libvpx-CVE-2016-2818.patch \ + %D%/packages/patches/libvpx-CVE-2026-2447.patch \ %D%/packages/patches/libxcb-path-max.patch \ %D%/packages/patches/libxml2-xpath0-Add-option-xpath0.patch \ %D%/packages/patches/libwpd-gcc-compat.patch \ diff --git a/gnu/packages/patches/libvpx-CVE-2026-2447.patch b/gnu/packages/patches/libvpx-CVE-2026-2447.patch new file mode 100644 index 0000000000..bec51a7dd4 --- /dev/null +++ b/gnu/packages/patches/libvpx-CVE-2026-2447.patch @@ -0,0 +1,96 @@ +Copied from +See also: + and: + + +From d5f35ac8d93cba7f7a3f7ddb8f9dc8bd28f785e1 Mon Sep 17 00:00:00 2001 +From: Wan-Teh Chang +Date: Wed, 21 Jan 2026 18:03:55 -0800 +Subject: [PATCH] write_superframe_index: return 0 if buffer is full + +write_superframe_index() should return the number of bytes written to +ctx->pending_cx_data. If ctx->pending_cx_data is full, +write_superframe_index() doesn't write the optional superframe index, so +it should return 0 in this case. Add an assertion that would have +detected this bug. Add and clarify comments for code related to this +bug. + +Also fix the buffer full check. The check should not assume that +ctx->pending_cx_data is equal to ctx->cx_data, and the check had an +off-by-one error. + +The bug was introduced when write_superframe_index() was added in the +following CLs: +https://chromium-review.googlesource.com/c/webm/libvpx/+/44659 +https://chromium-review.googlesource.com/c/webm/libvpx/+/45268 + +Bug: oss-fuzz:476466137 +Change-Id: Ie113568cf25acc73f8af640a3c51cfdb5b900613 +--- + vp9/vp9_cx_iface.c | 20 ++++++++++++++++---- + 1 file changed, 16 insertions(+), 4 deletions(-) + +diff --git a/vp9/vp9_cx_iface.c b/vp9/vp9_cx_iface.c +index 83f45b01b..ab9c582db 100644 +--- a/vp9/vp9_cx_iface.c ++++ b/vp9/vp9_cx_iface.c +@@ -8,7 +8,9 @@ + * be found in the AUTHORS file in the root of the source tree. + */ + ++#include + #include ++#include + #include + #include + #include +@@ -122,6 +124,7 @@ struct vpx_codec_alg_priv { + VP9_COMP *cpi; + unsigned char *cx_data; + size_t cx_data_sz; ++ // pending_cx_data either is a null pointer or points into the cx_data buffer. + unsigned char *pending_cx_data; + size_t pending_cx_data_sz; + int pending_frame_count; +@@ -1253,8 +1256,12 @@ static int write_superframe_index(vpx_codec_alg_priv_t *ctx) { + + // Write the index + index_sz = 2 + (mag + 1) * ctx->pending_frame_count; +- if (ctx->pending_cx_data_sz + index_sz < ctx->cx_data_sz) { +- uint8_t *x = ctx->pending_cx_data + ctx->pending_cx_data_sz; ++ unsigned char *cx_data_end = ctx->cx_data + ctx->cx_data_sz; ++ unsigned char *pending_cx_data_end = ++ ctx->pending_cx_data + ctx->pending_cx_data_sz; ++ ptrdiff_t space_remaining = cx_data_end - pending_cx_data_end; ++ if (index_sz <= space_remaining) { ++ uint8_t *x = pending_cx_data_end; + int i, j; + #ifdef TEST_SUPPLEMENTAL_SUPERFRAME_DATA + uint8_t marker_test = 0xc0; +@@ -1285,6 +1292,8 @@ static int write_superframe_index(vpx_codec_alg_priv_t *ctx) { + #ifdef TEST_SUPPLEMENTAL_SUPERFRAME_DATA + index_sz += index_sz_test; + #endif ++ } else { ++ index_sz = 0; + } + return index_sz; + } +@@ -1613,9 +1622,12 @@ static vpx_codec_err_t encoder_encode(vpx_codec_alg_priv_t *ctx, + ctx->pending_frame_sizes[ctx->pending_frame_count++] = size; + ctx->pending_frame_magnitude |= size; + ctx->pending_cx_data_sz += size; +- // write the superframe only for the case when +- if (!ctx->output_cx_pkt_cb.output_cx_pkt) ++ // write the superframe only for the case when the callback function ++ // for getting per-layer packets is not registered. ++ if (!ctx->output_cx_pkt_cb.output_cx_pkt) { + size += write_superframe_index(ctx); ++ assert(size <= cx_data_sz); ++ } + pkt.data.frame.buf = ctx->pending_cx_data; + pkt.data.frame.sz = ctx->pending_cx_data_sz; + ctx->pending_cx_data = NULL; +-- +2.52.0 + diff --git a/gnu/packages/video.scm b/gnu/packages/video.scm index 2ee75b95a7..c06a5f0448 100644 --- a/gnu/packages/video.scm +++ b/gnu/packages/video.scm @@ -3132,6 +3132,7 @@ wallpaper using mpv.") (package (name "libvpx") (version "1.15.2") + (replacement libvpx/fixed) (source (origin (method git-fetch) (uri (git-reference @@ -3170,6 +3171,11 @@ wallpaper using mpv.") (license license:bsd-3) (home-page "https://www.webmproject.org/"))) +(define-public libvpx/fixed + (hidden-package + (package-with-extra-patches libvpx + (search-patches "libvpx-CVE-2026-2447.patch")))) + (define-public orfondl (package (name "orfondl")