diff --git a/pkgs/racket-test-core/tests/racket/port.rktl b/pkgs/racket-test-core/tests/racket/port.rktl index f5d469174c..dc30033615 100644 --- a/pkgs/racket-test-core/tests/racket/port.rktl +++ b/pkgs/racket-test-core/tests/racket/port.rktl @@ -934,6 +934,35 @@ (check-all void) (check-all port-count-lines!)) +;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; attempting to read from or write to a closed byte-string port + +(let () + (define (check proc) + (define p (open-input-bytes #"x")) + (close-input-port p) + (err/rt-test (proc p) exn:fail:contract? #rx"closed")) + (check read-byte) + (check peek-byte) + (check (lambda (p) (peek-byte p 10))) + (check (lambda (p) (read-bytes 10 p))) + (check read-char) + (check read-char-or-special) + (check peek-char) + (check (lambda (p) (read-string 10 p))) + (check read) + (check (lambda (p) (read-syntax (object-name p) p)))) + +(let () + (define (check proc) + (define p (open-output-bytes)) + (close-output-port p) + (err/rt-test (proc p) exn:fail:contract? #rx"closed")) + (check (lambda (p) (write-byte 10 p))) + (check (lambda (p) (write-bytes #"hello" p))) + (check (lambda (p) (write-char #\x p))) + (check (lambda (p) (write-string "hello" p)))) + ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; port-closed events diff --git a/racket/src/cs/schemified/io.scm b/racket/src/cs/schemified/io.scm index 7382a1621c..9f3d786f2d 100644 --- a/racket/src/cs/schemified/io.scm +++ b/racket/src/cs/schemified/io.scm @@ -18500,9 +18500,11 @@ (set-bytes-input-port-bstr! this-id_0 #f) (let ((b_0 (core-port-buffer this-id_0))) (if (direct-bstr b_0) - (begin - (set-core-port-offset! this-id_0 (direct-pos b_0)) - (set-direct-bstr! b_0 #f)) + (let ((pos_0 (direct-pos b_0))) + (begin + (set-core-port-offset! this-id_0 pos_0) + (set-direct-end! b_0 pos_0) + (set-direct-bstr! b_0 #f))) (void))))))))) app_0 app_1 diff --git a/racket/src/io/port/bytes-port.rkt b/racket/src/io/port/bytes-port.rkt index a397981f26..7fa22bff62 100644 --- a/racket/src/io/port/bytes-port.rkt +++ b/racket/src/io/port/bytes-port.rkt @@ -45,7 +45,9 @@ (set! bstr #f) (define b buffer) (when (direct-bstr b) - (set! offset (direct-pos b)) + (define pos (direct-pos b)) + (set! offset pos) + (set-direct-end! b pos) (set-direct-bstr! b #f)))] [file-position (case-lambda