diff options
author | Ludovic Courtès <ludo@gnu.org> | 2009-10-15 23:24:19 +0200 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2009-10-15 23:24:19 +0200 |
commit | 29553c54b597880d329013c6b4b435e2949a9872 (patch) | |
tree | ed986b9e5e7f229f14a0b4a64e9939e8846660be /libguile/bytevectors.c | |
parent | 0f3eacf74c634a3c40aa2f4abefe4d0e7d69f1bf (diff) | |
download | guile-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.c | 5 |
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); |