altos: ao_distance was overflowing when checking for longitude wrap
authorKeith Packard <keithp@keithp.com>
Fri, 6 Jun 2014 01:31:06 +0000 (18:31 -0700)
committerKeith Packard <keithp@keithp.com>
Fri, 6 Jun 2014 01:31:06 +0000 (18:31 -0700)
Need to shift everyone right one bit to fit in 32 bits

Signed-off-by: Keith Packard <keithp@keithp.com>
src/kernel/ao_distance.c

index ba7d59fea6c1ea44c2afc1a75e3ec090a7ac4515..5654182aa733e71a4005090e86c352974f2abe7a 100644 (file)
@@ -24,6 +24,7 @@ ao_dist(int32_t a, int32_t b)
        int32_t d = a - b;
        if (d < 0)
                d = -d;
+
        return (uint32_t) ((int64_t) d * 111198 / 10000000);
 }
 
@@ -98,7 +99,7 @@ ao_lon_dist(int32_t lon_a, int32_t lon_b)
        uint32_t        lon_dist;
 
        /* check if it's shorter to go the other way around */
-       if (lon_a < lon_b - 1800000000)
+       if ((lon_a >> 1) < (lon_b >> 1) - (1800000000 >> 1))
                lon_a += 3600000000;
        lon_dist = ao_dist(lon_a, lon_b);
        if (c) {