~ 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