From b77642dff2127bfc258e31990f27be37800b8bf6 Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Mon, 20 Jun 2016 17:11:59 +0200 Subject: [PATCH] Fix size measurement in bytevector_large_set * libguile/bytevectors.c (bytevector_large_set): Fix computation of value size in words. * test-suite/tests/bytevectors.test: Add test. Thanks to Ben Rocer for the bug report and fix. --- libguile/bytevectors.c | 7 ++++--- test-suite/tests/bytevectors.test | 6 +++++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/libguile/bytevectors.c b/libguile/bytevectors.c index 8f698d5ba..cb7f2945e 100644 --- a/libguile/bytevectors.c +++ b/libguile/bytevectors.c @@ -857,10 +857,11 @@ bytevector_large_set (char *c_bv, size_t c_size, int signed_p, memset (c_bv, 0, c_size); else { - size_t word_count, value_size; + size_t word_count, value_words; - value_size = (mpz_sizeinbase (c_mpz, 2) + (8 * c_size)) / (8 * c_size); - if (SCM_UNLIKELY (value_size > c_size)) + value_words = ((mpz_sizeinbase (c_mpz, 2) + (8 * c_size) - 1) / + (8 * c_size)); + if (SCM_UNLIKELY (value_words > 1)) { err = -2; goto finish; diff --git a/test-suite/tests/bytevectors.test b/test-suite/tests/bytevectors.test index 5b5adb367..84ef907bc 100644 --- a/test-suite/tests/bytevectors.test +++ b/test-suite/tests/bytevectors.test @@ -345,7 +345,11 @@ (let ((b (make-bytevector 8))) (bytevector-s64-set! b 0 -1 (endianness big)) (bytevector-u64-set! b 0 0 (endianness big)) - (= 0 (bytevector-u64-ref b 0 (endianness big)))))) + (= 0 (bytevector-u64-ref b 0 (endianness big))))) + + (pass-if-exception "bignum out of range" + exception:out-of-range + (bytevector-u64-set! (make-bytevector 8) 0 (expt 2 64) (endianness big)))) (with-test-prefix/c&e "2.8 Operations on IEEE-754 Representations"