Only call isqrt32() with a positive argument

Fixes test_opus_projection failure under ubsan, due to clz(0).
This commit is contained in:
Mark Harris 2018-05-27 17:47:28 -07:00
parent 287cb030ab
commit 697beca22d
No known key found for this signature in database
GPG key ID: 92293B4D0118BDB0
3 changed files with 12 additions and 7 deletions

View file

@ -38,7 +38,8 @@
#include "mathops.h"
/*Compute floor(sqrt(_val)) with exact arithmetic.
This has been tested on all possible 32-bit inputs.*/
_val must be greater than 0.
This has been tested on all possible 32-bit inputs greater than 0.*/
unsigned isqrt32(opus_uint32 _val){
unsigned b;
unsigned g;

View file

@ -108,12 +108,14 @@ static int validate_ambisonics(int nb_channels, int *nb_streams, int *nb_coupled
int acn_channels;
int nondiegetic_channels;
if (nb_channels < 1 || nb_channels > 227)
return 0;
order_plus_one = isqrt32(nb_channels);
acn_channels = order_plus_one * order_plus_one;
nondiegetic_channels = nb_channels - acn_channels;
if (order_plus_one < 1 || order_plus_one > 15 ||
(nondiegetic_channels != 0 && nondiegetic_channels != 2))
if (nondiegetic_channels != 0 && nondiegetic_channels != 2)
return 0;
if (nb_streams)

View file

@ -86,15 +86,17 @@ static int get_order_plus_one_from_channels(int channels, int *order_plus_one)
/* Allowed numbers of channels:
* (1 + n)^2 + 2j, for n = 0...14 and j = 0 or 1.
*/
if (channels < 1 || channels > 227)
return OPUS_BAD_ARG;
order_plus_one_ = isqrt32(channels);
acn_channels = order_plus_one_ * order_plus_one_;
nondiegetic_channels = channels - acn_channels;
if (nondiegetic_channels != 0 && nondiegetic_channels != 2)
return OPUS_BAD_ARG;
if (order_plus_one)
*order_plus_one = order_plus_one_;
if (order_plus_one_ < 1 || order_plus_one_ > 15 ||
(nondiegetic_channels != 0 && nondiegetic_channels != 2))
return OPUS_BAD_ARG;
return OPUS_OK;
}