forked from FFmpeg/FFmpeg
intfloat_readwrite: fix signed addition overflows
These additions might overflow the signed range for large input values. Converting to unsigned before the addition rather than after avoids such undefined behaviour. The result under normal two's complement wraparound remains unchanged. Signed-off-by: Mans Rullgard <mans@mansr.com>
This commit is contained in:
parent
30c3d976f1
commit
88d1e2b2b0
1 changed files with 2 additions and 2 deletions
|
@ -30,13 +30,13 @@
|
||||||
#include "intfloat_readwrite.h"
|
#include "intfloat_readwrite.h"
|
||||||
|
|
||||||
double av_int2dbl(int64_t v){
|
double av_int2dbl(int64_t v){
|
||||||
if(v+v > 0xFFEULL<<52)
|
if((uint64_t)v+v > 0xFFEULL<<52)
|
||||||
return NAN;
|
return NAN;
|
||||||
return ldexp(((v&((1LL<<52)-1)) + (1LL<<52)) * (v>>63|1), (v>>52&0x7FF)-1075);
|
return ldexp(((v&((1LL<<52)-1)) + (1LL<<52)) * (v>>63|1), (v>>52&0x7FF)-1075);
|
||||||
}
|
}
|
||||||
|
|
||||||
float av_int2flt(int32_t v){
|
float av_int2flt(int32_t v){
|
||||||
if(v+v > 0xFF000000U)
|
if((uint32_t)v+v > 0xFF000000U)
|
||||||
return NAN;
|
return NAN;
|
||||||
return ldexp(((v&0x7FFFFF) + (1<<23)) * (v>>31|1), (v>>23&0xFF)-150);
|
return ldexp(((v&0x7FFFFF) + (1<<23)) * (v>>31|1), (v>>23&0xFF)-150);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue