diff options
author | Andy Wingo <wingo@pobox.com> | 2016-06-20 17:11:59 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2016-06-20 17:15:21 +0200 |
commit | dc7bc06f69162517407606920b37bde7054fbf49 (patch) | |
tree | b59bab2e23ec7d2b2db48a9f01a8c6fbabf53084 /libguile/bytevectors.c | |
parent | 687d393e2c9dbc57fa1d0290fbf3b2c93cbfcdf6 (diff) | |
download | guile-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.c | 7 |
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; |