From 8e785a1f47e49a411abadc8b690b175ff0e231e6 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Thu, 24 Jan 2019 07:14:19 -0800 Subject: ffi: fix range checks in be/le i64 put ops. * ffi.c (ffi_be_i64_put, ffi_le_i64_put): Fix incorrect range check, causing most negative two values to be rejected. The aim here is to accept the #x-80..00 most negative two's complement value. We can't express that directly using the C expression -0x8000000000000000 because it's not a simple constant; it's the unary minus applied an unsigned number. --- ffi.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'ffi.c') diff --git a/ffi.c b/ffi.c index 31150f82..12330d36 100644 --- a/ffi.c +++ b/ffi.c @@ -929,7 +929,7 @@ static void ffi_be_i64_put(struct txr_ffi_type *tft, val n, #if CHAR_BIT * SIZEOF_PTR >= 64 cnum v = c_num(n); - if (v < -convert(cnum, 0x7FFFFFFFFFFFFFFF - 1) || v > 0x7FFFFFFFFFFFFFFF) + if (v < -convert(cnum, 0x7FFFFFFFFFFFFFFF) - 1 || v > 0x7FFFFFFFFFFFFFFF) goto range; dst[0] = (v >> 56) & 0xff; @@ -944,7 +944,7 @@ static void ffi_be_i64_put(struct txr_ffi_type *tft, val n, cnum hi32 = c_num(ash(n, num_fast(-32))); ucnum lo32 = c_unum(logtrunc(n, num_fast(32))); - if (hi32 < -convert(cnum, 0x7FFFFFFF - 1) || hi32 > 0x7FFFFFFF) + if (hi32 < -convert(cnum, 0x7FFFFFFF) - 1 || hi32 > 0x7FFFFFFF) goto range; dst[0] = (hi32 >> 24) & 0xff; @@ -1043,7 +1043,7 @@ static void ffi_le_i64_put(struct txr_ffi_type *tft, val n, #if CHAR_BIT * SIZEOF_PTR >= 64 cnum v = c_num(n); - if (v < -convert(cnum, 0x7FFFFFFFFFFFFFFF - 1) || v > 0x7FFFFFFFFFFFFFFF) + if (v < -convert(cnum, 0x7FFFFFFFFFFFFFFF) - 1 || v > 0x7FFFFFFFFFFFFFFF) goto range; dst[7] = (v >> 56) & 0xff; @@ -1058,7 +1058,7 @@ static void ffi_le_i64_put(struct txr_ffi_type *tft, val n, cnum hi32 = c_num(ash(n, num_fast(-32))); ucnum lo32 = c_unum(logtrunc(n, num_fast(32))); - if (hi32 < -convert(cnum, 0x7FFFFFFF - 1) || hi32 > 0x7FFFFFFF) + if (hi32 < -convert(cnum, 0x7FFFFFFF) - 1 || hi32 > 0x7FFFFFFF) goto range; dst[7] = (hi32 >> 24) & 0xff; -- cgit v1.2.3