commit:     8d48df85c8d347bbb01159a673b9b78cb6f2f44d
Author:     David Seifert <soap <AT> gentoo <DOT> org>
AuthorDate: Wed Sep  9 10:59:10 2020 +0000
Commit:     David Seifert <soap <AT> gentoo <DOT> org>
CommitDate: Wed Sep  9 10:59:10 2020 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=8d48df85

media-libs/libsndfile: Add patch for pointer aliasing

Bug: https://bugs.gentoo.org/719020
Fixes: erikd/libsndfile#581
Package-Manager: Portage-3.0.6, Repoman-3.0.1
Signed-off-by: David Seifert <soap <AT> gentoo.org>

 .../files/libsndfile-1.0.29-pointer-aliasing.patch | 128 +++++++++++++++++++++
 media-libs/libsndfile/libsndfile-1.0.29.ebuild     |   5 +
 2 files changed, 133 insertions(+)

diff --git 
a/media-libs/libsndfile/files/libsndfile-1.0.29-pointer-aliasing.patch 
b/media-libs/libsndfile/files/libsndfile-1.0.29-pointer-aliasing.patch
new file mode 100644
index 00000000000..644bf333413
--- /dev/null
+++ b/media-libs/libsndfile/files/libsndfile-1.0.29-pointer-aliasing.patch
@@ -0,0 +1,128 @@
+From e5f9469a824fc660494b52ec3edc0dda2509594c Mon Sep 17 00:00:00 2001
+From: Arthur Taylor <[email protected]>
+Date: Tue, 8 Sep 2020 09:31:37 -0700
+Subject: [PATCH] Opus: Fix integer bug in header parsing. Fixes issue #581.
+
+Fix errors in parsing an OggOpus header packet where aliased pointers of
+different type widths are used with psf_binheader_readf(), resulting in
+incorrect data or endian issues. Telling psf_binheader_readf() to read
+an integer of fixed width, but then passing a pointer to an integer
+of a different width is a bug.
+---
+ src/ogg_opus.c | 38 ++++++++++++++++++++++----------------
+ 1 file changed, 22 insertions(+), 16 deletions(-)
+
+diff --git a/src/ogg_opus.c b/src/ogg_opus.c
+index de66b061..b40a6fb1 100644
+--- a/src/ogg_opus.c
++++ b/src/ogg_opus.c
+@@ -183,32 +183,32 @@
+ #define OGG_OPUS_PREROLL (80 * 48) /* 80 milliseconds */
+ 
+ typedef struct
+-{     int version ;
++{     uint8_t version ;
+ 
+       /* Number of channels, 1...255 */
+-      int channels ;
++      uint8_t channels ;
+ 
+       /* Encoder latency, the amount to skip before valid data comes out. */
+-      int preskip ;
++      uint16_t preskip ;
+ 
+       /* The sample rate of a the encoded source, as it may have been 
converted. */
+-      int input_samplerate ;
++      int32_t input_samplerate ;
+ 
+       /* 'baked-in' gain to apply, dB S7.8 format. Should be zero when 
possible. */
+       int16_t gain ;
+ 
+       /* Channel mapping type. See OggOpus spec */
+-      int channel_mapping ;
++      uint8_t channel_mapping ;
+ 
+       /* The rest is only used if channel_mapping != 0 */
+       /* How many streams are there? */
+-      int nb_streams ;
++      uint8_t nb_streams ;
+ 
+       /* How man of those streams are coupled? (aka stereo) */
+-      int nb_coupled ;
++      uint8_t nb_coupled ;
+ 
+       /* Mapping of opus streams to output channels */
+-      unsigned char stream_map [255] ;
++      uint8_t stream_map [255] ;
+ } OpusHeader ;
+ 
+ typedef struct
+@@ -637,6 +637,9 @@ ogg_opus_setup_decoder (SF_PRIVATE *psf, int 
input_samplerate)
+ static int
+ ogg_opus_setup_encoder (SF_PRIVATE *psf, OGG_PRIVATE *odata, OPUS_PRIVATE 
*oopus)
+ {     int error ;
++      int lookahead ;
++      int nb_streams ;
++      int nb_coupled ;
+ 
+       /* default page latency value (1000ms) */
+       oopus->u.encode.latency = 1000 * 48 ;
+@@ -655,16 +658,16 @@ ogg_opus_setup_encoder (SF_PRIVATE *psf, OGG_PRIVATE 
*odata, OPUS_PRIVATE *oopus
+ 
+       if (psf->sf.channels <= 2)
+       {       oopus->header.channel_mapping = 0 ;
+-              oopus->header.nb_streams = 1 ;
+-              oopus->header.nb_coupled = psf->sf.channels - 1 ;
++              nb_streams = 1 ;
++              nb_coupled = psf->sf.channels - 1 ;
+               oopus->header.stream_map [0] = 0 ;
+               oopus->header.stream_map [1] = 1 ;
+ 
+               oopus->u.encode.state = opus_multistream_encoder_create (
+                       psf->sf.samplerate,
+                       psf->sf.channels,
+-                      oopus->header.nb_streams,
+-                      oopus->header.nb_coupled,
++                      nb_streams,
++                      nb_coupled,
+                       oopus->header.stream_map,
+                       OPUS_APPLICATION_AUDIO,
+                       &error) ;
+@@ -683,17 +686,20 @@ ogg_opus_setup_encoder (SF_PRIVATE *psf, OGG_PRIVATE 
*odata, OPUS_PRIVATE *oopus
+                       psf->sf.samplerate,
+                       psf->sf.channels,
+                       oopus->header.channel_mapping,
+-                      &oopus->header.nb_streams,
+-                      &oopus->header.nb_coupled,
++                      &nb_streams,
++                      &nb_coupled,
+                       oopus->header.stream_map,
+                       OPUS_APPLICATION_AUDIO,
+                       &error) ;
++
+               }
+ 
+       if (error != OPUS_OK)
+       {       psf_log_printf (psf, "Opus : Error, 
opus_multistream_encoder_create returned %s\n", opus_strerror (error)) ;
+               return SFE_BAD_OPEN_FORMAT ;
+               } ;
++      oopus->header.nb_streams = nb_streams ;
++      oopus->header.nb_coupled = nb_coupled ;
+ 
+       opus_multistream_encoder_ctl (oopus->u.encode.state, OPUS_GET_BITRATE 
(&oopus->u.encode.bitrate)) ;
+       psf_log_printf (psf, "Encoding at target bitrate of %dbps\n", 
oopus->u.encode.bitrate) ;
+@@ -711,12 +717,12 @@ ogg_opus_setup_encoder (SF_PRIVATE *psf, OGG_PRIVATE 
*odata, OPUS_PRIVATE *oopus
+       ** GOTCHA: This returns the preskip at the encoder samplerate, not the
+       ** granulepos rate of 48000Hz needed for header.preskip.
+       */
+-      error = opus_multistream_encoder_ctl (oopus->u.encode.state, 
OPUS_GET_LOOKAHEAD (&oopus->header.preskip)) ;
++      error = opus_multistream_encoder_ctl (oopus->u.encode.state, 
OPUS_GET_LOOKAHEAD (&lookahead)) ;
+       if (error != OPUS_OK)
+       {       psf_log_printf (psf, "Opus : OPUS_GET_LOOKAHEAD returned: 
%s\n", opus_strerror (error)) ;
+               return SFE_BAD_OPEN_FORMAT ;
+               } ;
+-      oopus->header.preskip *= oopus->sr_factor ;
++      oopus->header.preskip = lookahead * oopus->sr_factor ;
+ 
+       oopus->len = OGG_OPUS_ENCODE_PACKET_LEN (psf->sf.samplerate) ;
+       oopus->buffer = malloc (sizeof (float) * psf->sf.channels * oopus->len) 
;

diff --git a/media-libs/libsndfile/libsndfile-1.0.29.ebuild 
b/media-libs/libsndfile/libsndfile-1.0.29.ebuild
index d975b6e0270..37cae9590d1 100644
--- a/media-libs/libsndfile/libsndfile-1.0.29.ebuild
+++ b/media-libs/libsndfile/libsndfile-1.0.29.ebuild
@@ -42,6 +42,11 @@ if [[ ${PV} == *9999 ]]; then
        "
 fi
 
+PATCHES=(
+       # bug 719020: backported, remove on version bump
+       "${FILESDIR}"/${P}-pointer-aliasing.patch
+)
+
 pkg_setup() {
        if use test || [[ ${PV} == *9999 ]]; then
                python-any-r1_pkg_setup

Reply via email to