diff --git a/collects/mzlib/deflate.rkt b/collects/mzlib/deflate.rkt index c8d443b504..37b615c4e4 100644 --- a/collects/mzlib/deflate.rkt +++ b/collects/mzlib/deflate.rkt @@ -469,7 +469,8 @@ (longest_match-loop))) (define (*++scan) (set! scanpos (add1 scanpos)) - (bytes-ref window-vec scanpos)) + (and (scanpos . < . window_size) ; the original C code can read past the end of the buffer + (bytes-ref window-vec scanpos))) (define (*++match) (set! matchpos (add1 matchpos)) (bytes-ref window-vec matchpos)) @@ -479,7 +480,7 @@ (eq? (*++scan) (*++match)) (eq? (*++scan) (*++match)) (eq? (*++scan) (*++match)) (eq? (*++scan) (*++match)) (eq? (*++scan) (*++match)) (eq? (*++scan) (*++match)) - (< scanpos strendpos)) + (< scanpos strendpos)) (match-eight))) (define (longest_match-loop) diff --git a/collects/tests/file/deflate-me.dat b/collects/tests/file/deflate-me.dat new file mode 100644 index 0000000000..8d7e374903 Binary files /dev/null and b/collects/tests/file/deflate-me.dat differ diff --git a/collects/tests/file/gzip.rkt b/collects/tests/file/gzip.rkt index 3348d2eba5..49047fe043 100644 --- a/collects/tests/file/gzip.rkt +++ b/collects/tests/file/gzip.rkt @@ -31,7 +31,15 @@ (define (rand-bytes) (list->bytes (for/list ([j (in-range (random 1000))]) (random 256)))) (test-big-file) - (for ([i (in-range 100)]) (id* (rand-bytes)))) + (for ([i (in-range 100)]) (id* (rand-bytes))) + (regression-test)) + +(define (regression-test) + ;; check for an out-of-range buffer access: + (call-with-input-file* + (collection-file-path "deflate-me.dat" "tests/file") + (lambda (in) + (gzip-through-ports in (open-output-bytes) "defalte-me.dat" (current-seconds))))) (provide tests) (define (tests) (test do (run-tests)))