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>
(cherry picked from commit 88d1e2b2b0)
Signed-off-by: Anton Khirnov <anton@khirnov.net>
This commit is contained in:
committed by
Reinhard Tartler
parent
1cc0b08635
commit
73ad066939
@@ -30,13 +30,13 @@
|
||||
#include "intfloat_readwrite.h"
|
||||
|
||||
double av_int2dbl(int64_t v){
|
||||
if(v+v > 0xFFEULL<<52)
|
||||
if((uint64_t)v+v > 0xFFEULL<<52)
|
||||
return NAN;
|
||||
return ldexp(((v&((1LL<<52)-1)) + (1LL<<52)) * (v>>63|1), (v>>52&0x7FF)-1075);
|
||||
}
|
||||
|
||||
float av_int2flt(int32_t v){
|
||||
if(v+v > 0xFF000000U)
|
||||
if((uint32_t)v+v > 0xFF000000U)
|
||||
return NAN;
|
||||
return ldexp(((v&0x7FFFFF) + (1<<23)) * (v>>31|1), (v>>23&0xFF)-150);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user