summaryrefslogtreecommitdiff
path: root/libguile/bytevectors.c
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2009-10-15 23:24:19 +0200
committerLudovic Courtès <ludo@gnu.org>2009-10-15 23:24:19 +0200
commit29553c54b597880d329013c6b4b435e2949a9872 (patch)
treeed986b9e5e7f229f14a0b4a64e9939e8846660be /libguile/bytevectors.c
parent0f3eacf74c634a3c40aa2f4abefe4d0e7d69f1bf (diff)
downloadguile-29553c54b597880d329013c6b4b435e2949a9872.tar.gz
Fix segfault for `(uniform-array->bytevector (bitvector))'.
* libguile/bytevectors.c (scm_uniform_array_to_bytevector): Fix BYTE_LEN computation for bitvectors. * test-suite/tests/bytevectors.test ("uniform-array->bytevector"): New test prefix.
Diffstat (limited to 'libguile/bytevectors.c')
-rw-r--r--libguile/bytevectors.c5
1 files changed, 2 insertions, 3 deletions
diff --git a/libguile/bytevectors.c b/libguile/bytevectors.c
index a3233eab1..e0998197c 100644
--- a/libguile/bytevectors.c
+++ b/libguile/bytevectors.c
@@ -605,9 +605,8 @@ SCM_DEFINE (scm_uniform_array_to_bytevector, "uniform-array->bytevector",
if (sz >= 8 && ((sz % 8) == 0))
byte_len = len * (sz / 8);
else
- /* uf. tricky, and i'm not sure i'm avoiding overflow. */
- byte_len = len * (sz / 8)
- + (((len * (sz % 8)) - 1) / 8) + 1;
+ /* byte_len = ceil (len * sz / 8) */
+ byte_len = (len * sz + 7) / 8;
ret = make_bytevector (byte_len, SCM_ARRAY_ELEMENT_TYPE_VU8);
memcpy (SCM_BYTEVECTOR_CONTENTS (ret), elts, byte_len);