Commit 88d1e2b2 authored by Mans Rullgard's avatar Mans Rullgard

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: 's avatarMans Rullgard <mans@mansr.com>
parent 30c3d976
...@@ -30,13 +30,13 @@ ...@@ -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);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment