~ chicken-core (chicken-5) 1d06ce7e21c7e903ca5dca11fda6fcf2cc52de5e
commit 1d06ce7e21c7e903ca5dca11fda6fcf2cc52de5e
Author: Evan Hanson <evhan@foldling.org>
AuthorDate: Sun May 18 14:16:31 2014 +1200
Commit: Christian Kellermann <ckeen@pestilenz.org>
CommitDate: Sun May 18 10:41:09 2014 +0200
Bound read-u8vector! to dest vector's size when no length is given
Fixes #1124.
Signed-off-by: Christian Kellermann <ckeen@pestilenz.org>
diff --git a/srfi-4.scm b/srfi-4.scm
index 07ef84b1..b1fea14a 100644
--- a/srfi-4.scm
+++ b/srfi-4.scm
@@ -653,12 +653,12 @@ EOF
(##sys#check-input-port port #t 'read-u8vector!)
(##sys#check-exact start 'read-u8vector!)
(##sys#check-structure dest 'u8vector 'read-u8vector!)
- (let ((dest (##sys#slot dest 1)))
- (when n
- (##sys#check-exact n 'read-u8vector!)
- (when (fx> (fx+ start n) (##sys#size dest))
- (set! n (fx- (##sys#size dest) start))))
- (##sys#read-string! n dest port start) ) )
+ (when n (##sys#check-exact n 'read-u8vector!))
+ (let* ((dest (##sys#slot dest 1))
+ (size (##sys#size dest)))
+ (unless (and n (fx<= (fx+ start n) size))
+ (set! n (fx- size start)))
+ (##sys#read-string! n dest port start)))
(define read-u8vector
(let ()
diff --git a/tests/srfi-4-tests.scm b/tests/srfi-4-tests.scm
index 4e87a759..1d0a1b57 100644
--- a/tests/srfi-4-tests.scm
+++ b/tests/srfi-4-tests.scm
@@ -42,3 +42,15 @@
(assert (equal? #s32(-1 2 3) '#s32(-1 2 3)))
(assert (equal? #f32(1 2 3) '#f32(1 2 3)))
(assert (equal? #f64(-1 2 3) '#f64(-1 2 3)))
+
+;; Ticket #1124: read-u8vector! w/o length, dest smaller than source.
+(let ((input (open-input-string "abcdefghijklmnopqrstuvwxyz"))
+ (u8vec (make-u8vector 10)))
+ (assert (= 10 (read-u8vector! #f u8vec input)))
+ (assert (equal? u8vec #u8(97 98 99 100 101 102 103 104 105 106)))
+ (assert (= 5 (read-u8vector! #f u8vec input 5)))
+ (assert (equal? u8vec #u8(97 98 99 100 101 107 108 109 110 111)))
+ (assert (= 5 (read-u8vector! 5 u8vec input)))
+ (assert (equal? u8vec #u8(112 113 114 115 116 107 108 109 110 111)))
+ (assert (= 6 (read-u8vector! 10 u8vec input)))
+ (assert (equal? u8vec #u8(117 118 119 120 121 122 108 109 110 111))))
Trap