summaryrefslogtreecommitdiff
path: root/libguile/bytevectors.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2016-06-20 17:11:59 +0200
committerAndy Wingo <wingo@pobox.com>2016-06-20 17:15:21 +0200
commitdc7bc06f69162517407606920b37bde7054fbf49 (patch)
treeb59bab2e23ec7d2b2db48a9f01a8c6fbabf53084 /libguile/bytevectors.c
parent687d393e2c9dbc57fa1d0290fbf3b2c93cbfcdf6 (diff)
downloadguile-dc7bc06f69162517407606920b37bde7054fbf49.tar.gz
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 <fleabyte@mail.com> for the bug report and fix.
Diffstat (limited to 'libguile/bytevectors.c')
-rw-r--r--libguile/bytevectors.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/libguile/bytevectors.c b/libguile/bytevectors.c
index 54eef8b8e..e426ae3a7 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;