avutil/softfloat: Fix overflows in shifts in av_cmp_sf() and av_gt_sf()
authorMichael Niedermayer <michael@niedermayer.cc>
Sun, 8 Nov 2015 13:13:42 +0000 (14:13 +0100)
committerMichael Niedermayer <michael@niedermayer.cc>
Sun, 8 Nov 2015 13:54:51 +0000 (14:54 +0100)
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
libavutil/softfloat.h

index e5bfbbd..ae11bdb 100644 (file)
@@ -119,15 +119,19 @@ static inline av_const SoftFloat av_div_sf(SoftFloat a, SoftFloat b){
 
 static inline av_const int av_cmp_sf(SoftFloat a, SoftFloat b){
     int t= a.exp - b.exp;
-    if(t<0) return (a.mant >> (-t)) -  b.mant      ;
-    else    return  a.mant          - (b.mant >> t);
+    if      (t <-31) return                  -  b.mant      ;
+    else if (t <  0) return (a.mant >> (-t)) -  b.mant      ;
+    else if (t < 32) return  a.mant          - (b.mant >> t);
+    else             return  a.mant                         ;
 }
 
 static inline av_const int av_gt_sf(SoftFloat a, SoftFloat b)
 {
     int t= a.exp - b.exp;
-    if(t<0) return (a.mant >> (-t)) >  b.mant      ;
-    else    return  a.mant          > (b.mant >> t);
+    if      (t <-31) return 0;
+    else if (t <  0) return (a.mant >> (-t)) >  b.mant      ;
+    else if (t < 32) return  a.mant          > (b.mant >> t);
+    else             return 1;
 }
 
 static inline av_const SoftFloat av_add_sf(SoftFloat a, SoftFloat b){