mirror of
https://github.com/xiph/opus.git
synced 2025-05-15 16:08:30 +00:00
Only call isqrt32() with a positive argument
Fixes test_opus_projection failure under ubsan, due to clz(0).
This commit is contained in:
parent
287cb030ab
commit
697beca22d
3 changed files with 12 additions and 7 deletions
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue