summaryrefslogtreecommitdiffstats
path: root/media/libspeex_resampler/fix-overflow.patch
diff options
context:
space:
mode:
authorMatt A. Tobin <mattatobin@localhost.localdomain>2018-02-02 04:16:08 -0500
committerMatt A. Tobin <mattatobin@localhost.localdomain>2018-02-02 04:16:08 -0500
commit5f8de423f190bbb79a62f804151bc24824fa32d8 (patch)
tree10027f336435511475e392454359edea8e25895d /media/libspeex_resampler/fix-overflow.patch
parent49ee0794b5d912db1f95dce6eb52d781dc210db5 (diff)
downloadUXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.gz
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.lz
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.xz
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.zip
Add m-esr52 at 52.6.0
Diffstat (limited to 'media/libspeex_resampler/fix-overflow.patch')
-rw-r--r--media/libspeex_resampler/fix-overflow.patch87
1 files changed, 87 insertions, 0 deletions
diff --git a/media/libspeex_resampler/fix-overflow.patch b/media/libspeex_resampler/fix-overflow.patch
new file mode 100644
index 000000000..cee9a7edb
--- /dev/null
+++ b/media/libspeex_resampler/fix-overflow.patch
@@ -0,0 +1,87 @@
+diff --git a/media/libspeex_resampler/fix-overflow.patch b/media/libspeex_resampler/fix-overflow.patch
+new file mode 100644
+index 0000000..e69de29
+diff --git a/media/libspeex_resampler/src/resample.c b/media/libspeex_resampler/src/resample.c
+index a3859e3..d99595a 100644
+--- a/media/libspeex_resampler/src/resample.c
++++ b/media/libspeex_resampler/src/resample.c
+@@ -98,6 +98,10 @@ static void speex_free (void *ptr) {free(ptr);}
+ #define NULL 0
+ #endif
+
++#ifndef UINT32_MAX
++#define UINT32_MAX 4294967296U
++#endif
++
+ #include "simd_detect.h"
+
+ /* Numer of elements to allocate on the stack */
+@@ -603,6 +607,22 @@ static int resampler_basic_zero(SpeexResamplerState *st, spx_uint32_t channel_in
+ return out_sample;
+ }
+
++static int _muldiv_safe(spx_uint32_t value, spx_uint32_t mul, spx_uint32_t div)
++{
++ /* TODO: Could be simplified with 64 bits operation. */
++ spx_uint32_t major = value / div;
++ spx_uint32_t remainder = value % div;
++ return remainder <= UINT32_MAX / mul && major <= UINT32_MAX / mul &&
++ major * mul <= UINT32_MAX - remainder * mul / div;
++}
++
++static spx_uint32_t _muldiv(spx_uint32_t value, spx_uint32_t mul, spx_uint32_t div)
++{
++ spx_uint32_t major = value / div;
++ spx_uint32_t remainder = value % div;
++ return remainder * mul / div + major * mul;
++}
++
+ static int update_filter(SpeexResamplerState *st)
+ {
+ spx_uint32_t old_length = st->filt_len;
+@@ -620,8 +640,9 @@ static int update_filter(SpeexResamplerState *st)
+ {
+ /* down-sampling */
+ st->cutoff = quality_map[st->quality].downsample_bandwidth * st->den_rate / st->num_rate;
+- /* FIXME: divide the numerator and denominator by a certain amount if they're too large */
+- st->filt_len = st->filt_len*st->num_rate / st->den_rate;
++ if (!_muldiv_safe(st->filt_len,st->num_rate,st->den_rate))
++ goto fail;
++ st->filt_len = _muldiv(st->filt_len,st->num_rate,st->den_rate);
+ /* Round up to make sure we have a multiple of 8 for SSE */
+ st->filt_len = ((st->filt_len-1)&(~0x7))+8;
+ if (2*st->den_rate < st->num_rate)
+@@ -1129,7 +1150,9 @@ EXPORT int speex_resampler_set_rate_frac(SpeexResamplerState *st, spx_uint32_t r
+ {
+ for (i=0;i<st->nb_channels;i++)
+ {
+- st->samp_frac_num[i]=st->samp_frac_num[i]*st->den_rate/old_den;
++ if (!_muldiv_safe(st->samp_frac_num[i],st->den_rate,old_den))
++ return RESAMPLER_ERR_OVERFLOW;
++ st->samp_frac_num[i]= _muldiv(st->samp_frac_num[i],st->den_rate,old_den);
+ /* Safety net */
+ if (st->samp_frac_num[i] >= st->den_rate)
+ st->samp_frac_num[i] = st->den_rate-1;
+diff --git a/media/libspeex_resampler/src/speex_resampler.h b/media/libspeex_resampler/src/speex_resampler.h
+index 70abe52..1286872 100644
+--- a/media/libspeex_resampler/src/speex_resampler.h
++++ b/media/libspeex_resampler/src/speex_resampler.h
+@@ -106,7 +106,8 @@ enum {
+ RESAMPLER_ERR_BAD_STATE = 2,
+ RESAMPLER_ERR_INVALID_ARG = 3,
+ RESAMPLER_ERR_PTR_OVERLAP = 4,
+-
++ RESAMPLER_ERR_OVERFLOW = 5,
++
+ RESAMPLER_ERR_MAX_ERROR
+ };
+
+diff --git a/media/libspeex_resampler/update.sh b/media/libspeex_resampler/update.sh
+index d4a025b..6950bc6 100644
+--- a/media/libspeex_resampler/update.sh
++++ b/media/libspeex_resampler/update.sh
+@@ -26,3 +26,4 @@ patch -p3 < set-skip-frac.patch
+ patch -p3 < hugemem.patch
+ patch -p3 < remove-empty-asm-clobber.patch
+ patch -p3 < handle-memory-error.patch
++patch -p3 < fix-overflow.patch