aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMark Harris <mark.hsj@gmail.com>2014-11-27 08:48:09 -0800
committerJean-Marc Valin <jmvalin@jmvalin.ca>2014-11-27 12:04:14 -0500
commit25b27a9c167302769db512a9e32c66323bc7904c (patch)
tree2c0df6c184b180fcf252f94a6389a23e42d04666 /src
parentd10755e95c49f5ec925e70598877c82ad865a189 (diff)
downloadlibopus-25b27a9c167302769db512a9e32c66323bc7904c.tar.gz
multistream: improve arg check
Avoid undefined behavior (signed arithmetic overflow) or implementation-defined behavior (malloc(0)) on out-of-range arguments, e.g. opus_multistream_encoder_create(48000, 2, 2147483647, 1, ...) or opus_multistream_surround_encoder_create(48000, 3, 0, ...). Signed-off-by: Jean-Marc Valin <jmvalin@jmvalin.ca>
Diffstat (limited to 'src')
-rw-r--r--src/opus_multistream_decoder.c4
-rw-r--r--src/opus_multistream_encoder.c14
2 files changed, 13 insertions, 5 deletions
diff --git a/src/opus_multistream_decoder.c b/src/opus_multistream_decoder.c
index a05fa1e7..b95eaa6e 100644
--- a/src/opus_multistream_decoder.c
+++ b/src/opus_multistream_decoder.c
@@ -75,7 +75,7 @@ int opus_multistream_decoder_init(
char *ptr;
if ((channels>255) || (channels<1) || (coupled_streams>streams) ||
- (coupled_streams+streams>255) || (streams<1) || (coupled_streams<0))
+ (streams<1) || (coupled_streams<0) || (streams>255-coupled_streams))
return OPUS_BAD_ARG;
st->layout.nb_channels = channels;
@@ -119,7 +119,7 @@ OpusMSDecoder *opus_multistream_decoder_create(
int ret;
OpusMSDecoder *st;
if ((channels>255) || (channels<1) || (coupled_streams>streams) ||
- (coupled_streams+streams>255) || (streams<1) || (coupled_streams<0))
+ (streams<1) || (coupled_streams<0) || (streams>255-coupled_streams))
{
if (error)
*error = OPUS_BAD_ARG;
diff --git a/src/opus_multistream_encoder.c b/src/opus_multistream_encoder.c
index 3787194a..6e87337d 100644
--- a/src/opus_multistream_encoder.c
+++ b/src/opus_multistream_encoder.c
@@ -408,7 +408,7 @@ static int opus_multistream_encoder_init_impl(
char *ptr;
if ((channels>255) || (channels<1) || (coupled_streams>streams) ||
- (coupled_streams+streams>255) || (streams<1) || (coupled_streams<0))
+ (streams<1) || (coupled_streams<0) || (streams>255-coupled_streams))
return OPUS_BAD_ARG;
st->layout.nb_channels = channels;
@@ -530,7 +530,7 @@ OpusMSEncoder *opus_multistream_encoder_create(
int ret;
OpusMSEncoder *st;
if ((channels>255) || (channels<1) || (coupled_streams>streams) ||
- (coupled_streams+streams>255) || (streams<1) || (coupled_streams<0))
+ (streams<1) || (coupled_streams<0) || (streams>255-coupled_streams))
{
if (error)
*error = OPUS_BAD_ARG;
@@ -566,6 +566,7 @@ OpusMSEncoder *opus_multistream_surround_encoder_create(
)
{
int ret;
+ opus_int32 size;
OpusMSEncoder *st;
if ((channels>255) || (channels<1))
{
@@ -573,7 +574,14 @@ OpusMSEncoder *opus_multistream_surround_encoder_create(
*error = OPUS_BAD_ARG;
return NULL;
}
- st = (OpusMSEncoder *)opus_alloc(opus_multistream_surround_encoder_get_size(channels, mapping_family));
+ size = opus_multistream_surround_encoder_get_size(channels, mapping_family);
+ if (!size)
+ {
+ if (error)
+ *error = OPUS_UNIMPLEMENTED;
+ return NULL;
+ }
+ st = (OpusMSEncoder *)opus_alloc(size);
if (st==NULL)
{
if (error)