Dear ports@,
I noticed that two unfixed heap overflow bugs in audio/libsndfile
exist for about a year now and there is still no new release available.
I attached the diffs from upstream.
mbuhl
Index: audio/libsndfile/Makefile
===================================================================
RCS file: /cvs/ports/audio/libsndfile/Makefile,v
retrieving revision 1.37
diff -u -p -r1.37 Makefile
--- audio/libsndfile/Makefile 24 Apr 2021 06:17:13 -0000 1.37
+++ audio/libsndfile/Makefile 9 Mar 2022 08:28:54 -0000
@@ -8,6 +8,7 @@ CATEGORIES= audio
GH_ACCOUNT= libsndfile
GH_PROJECT= libsndfile
GH_TAGNAME= ${VER}
+REVISION= 0
HOMEPAGE= https://github.com/libsndfile/libsndfile/
Index: audio/libsndfile/patches/patch-src_flac_c
===================================================================
RCS file: audio/libsndfile/patches/patch-src_flac_c
diff -N audio/libsndfile/patches/patch-src_flac_c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ audio/libsndfile/patches/patch-src_flac_c 9 Mar 2022 08:28:54 -0000
@@ -0,0 +1,21 @@
+$OpenBSD$
+
+Fix heap overflow:
+https://github.com/libsndfile/libsndfile/commit/ced91d7b971be6173b604154c39279ce90ad87cc
+https://github.com/libsndfile/libsndfile/issues/731
+
+Index: src/flac.c
+--- src/flac.c.orig
++++ src/flac.c
+@@ -948,7 +948,11 @@ flac_read_loop (SF_PRIVATE *psf, unsigned len)
+ /* Decode some more. */
+ while (pflac->pos < pflac->len)
+ { if (FLAC__stream_decoder_process_single (pflac->fsd) == 0)
++ { psf_log_printf (psf,
"FLAC__stream_decoder_process_single returned false\n") ;
++ /* Current frame is busted, so NULL the pointer. */
++ pflac->frame = NULL ;
+ break ;
++ } ;
+ state = FLAC__stream_decoder_get_state (pflac->fsd) ;
+ if (state >= FLAC__STREAM_DECODER_END_OF_STREAM)
+ { psf_log_printf (psf, "FLAC__stream_decoder_get_state
returned %s\n", FLAC__StreamDecoderStateString [state]) ;
Index: audio/libsndfile/patches/patch-src_ms_adpcm_c
===================================================================
RCS file: audio/libsndfile/patches/patch-src_ms_adpcm_c
diff -N audio/libsndfile/patches/patch-src_ms_adpcm_c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ audio/libsndfile/patches/patch-src_ms_adpcm_c 9 Mar 2022 08:28:54
-0000
@@ -0,0 +1,26 @@
+$OpenBSD$
+
+CVE-2021-3246:
+https://security-tracker.debian.org/tracker/CVE-2021-3246
+https://github.com/libsndfile/libsndfile/commit/deb669ee8be55a94565f6f8a6b60890c2e7c6f32
+
+Index: src/ms_adpcm.c
+--- src/ms_adpcm.c.orig
++++ src/ms_adpcm.c
+@@ -128,8 +128,14 @@ wavlike_msadpcm_init (SF_PRIVATE *psf, int
blockalign,
+ if (psf->file.mode == SFM_WRITE)
+ samplesperblock = 2 + 2 * (blockalign - 7 * psf->sf.channels) /
psf->sf.channels ;
+
+- if (blockalign < 7 * psf->sf.channels)
+- { psf_log_printf (psf, "*** Error blockalign (%d) should be >
%d.\n", blockalign, 7 * psf->sf.channels) ;
++ /* There's 7 samples per channel in the preamble of each block */
++ if (samplesperblock < 7 * psf->sf.channels)
++ { psf_log_printf (psf, "*** Error samplesperblock (%d) should be
>= %d.\n", samplesperblock, 7 * psf->sf.channels) ;
++ return SFE_INTERNAL ;
++ } ;
++
++ if (2 * blockalign < samplesperblock * psf->sf.channels)
++ { psf_log_printf (psf, "*** Error blockalign (%d) should be >=
%d.\n", blockalign, samplesperblock * psf->sf.channels / 2) ;
+ return SFE_INTERNAL ;
+ } ;
+
Index: audio/libsndfile/patches/patch-src_wavlike_c
===================================================================
RCS file: audio/libsndfile/patches/patch-src_wavlike_c
diff -N audio/libsndfile/patches/patch-src_wavlike_c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ audio/libsndfile/patches/patch-src_wavlike_c 9 Mar 2022 08:28:54
-0000
@@ -0,0 +1,22 @@
+$OpenBSD$
+
+CVE-2021-3246:
+https://security-tracker.debian.org/tracker/CVE-2021-3246
+https://github.com/libsndfile/libsndfile/commit/a9815b3f228df00086e0a40bcc43162fc19896a1
+
+Index: src/wavlike.c
+--- src/wavlike.c.orig
++++ src/wavlike.c
+@@ -830,7 +830,11 @@ wavlike_read_cart_chunk (SF_PRIVATE *psf, uint32_t chu
+ return 0 ;
+ } ;
+
+- if (chunksize >= sizeof (SF_CART_INFO_16K))
++ /*
++ ** SF_CART_INFO_16K has an extra field 'tag_text_size' that isn't
part
++ ** of the chunk, so don't include it in the size check.
++ */
++ if (chunksize >= sizeof (SF_CART_INFO_16K) - 4)
+ { psf_log_printf (psf, "cart : %u too big to be handled\n",
chunksize) ;
+ psf_binheader_readf (psf, "j", chunksize) ;
+ return 0 ;