[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Guile-commits] 01/01: Fix size measurement in bytevector_large_set
From: |
Andy Wingo |
Subject: |
[Guile-commits] 01/01: Fix size measurement in bytevector_large_set |
Date: |
Mon, 20 Jun 2016 15:15:32 +0000 (UTC) |
wingo pushed a commit to branch master
in repository guile.
commit dc7bc06f69162517407606920b37bde7054fbf49
Author: Andy Wingo <address@hidden>
Date: Mon Jun 20 17:11:59 2016 +0200
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 <address@hidden> 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 54eef8b..e426ae3 100644
--- a/libguile/bytevectors.c
+++ b/libguile/bytevectors.c
@@ -875,10 +875,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 f8f020a..f0d9f19 100644
--- a/test-suite/tests/bytevectors.test
+++ b/test-suite/tests/bytevectors.test
@@ -343,7 +343,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"