guile-commits
[Top][All Lists]
Advanced

[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"



reply via email to

[Prev in Thread] Current Thread [Next in Thread]