Ticket #653: 0001-Change-port-procedures-which-try-to-read-or-write-or.patch
File 0001-Change-port-procedures-which-try-to-read-or-write-or.patch, 9.9 KB (added by , 13 years ago) |
---|
-
extras.scm
From 184782873e4160d7715e57b352e398bf0e1916c0 Mon Sep 17 00:00:00 2001 From: Peter Bex <peter.bex@xs4all.nl> Date: Sun, 17 Jul 2011 15:56:55 +0200 Subject: [PATCH] Change port procedures which try to read or write (or access the underlying descriptor) to not just check their arguments for being a port, but also check that the port is still open. --- extras.scm | 14 ++++---- library.scm | 4 ++- posixunix.scm | 2 +- posixwin.scm | 2 +- srfi-4.scm | 6 ++-- tcp.scm | 6 ++-- tests/port-tests.scm | 83 +++++++++++++++++++++++++++++++++++++++++++++++++- 7 files changed, 100 insertions(+), 17 deletions(-) diff --git a/extras.scm b/extras.scm index 31309c2..e790fff 100644
a b 84 84 (let* ([parg (pair? args)] 85 85 [p (if parg (car args) ##sys#standard-input)] 86 86 [limit (and parg (pair? (cdr args)) (cadr args))]) 87 (##sys#check-port p 'read-line)87 (##sys#check-port* p 'read-line) 88 88 (cond ((##sys#slot (##sys#slot p 2) 8) => (lambda (rl) (rl p limit))) 89 89 (else 90 90 (let* ((buffer-len (if limit limit 256)) … … 175 175 (else (fx+ n2 m))) ))))))) 176 176 177 177 (define (read-string! n dest #!optional (port ##sys#standard-input) (start 0)) 178 (##sys#check-port port 'read-string!)178 (##sys#check-port* port 'read-string!) 179 179 (##sys#check-string dest 'read-string!) 180 180 (when n 181 181 (##sys#check-exact n 'read-string!) … … 188 188 189 189 (define ##sys#read-string/port 190 190 (lambda (n p) 191 (##sys#check-port p 'read-string)191 (##sys#check-port* p 'read-string) 192 192 (cond (n (##sys#check-exact n 'read-string) 193 193 (let* ((str (##sys#make-string n)) 194 194 (n2 (##sys#read-string! n str p 0)) ) … … 230 230 (define read-token 231 231 (lambda (pred . port) 232 232 (let ([port (optional port ##sys#standard-input)]) 233 (##sys#check-port port 'read-token)233 (##sys#check-port* port 'read-token) 234 234 (let ([out (open-output-string)]) 235 235 (let loop () 236 236 (let ([c (##sys#peek-char-0 port)]) … … 256 256 ;;; Binary I/O 257 257 258 258 (define (read-byte #!optional (port ##sys#standard-input)) 259 (##sys#check-port port 'read-byte)259 (##sys#check-port* port 'read-byte) 260 260 (let ((x (##sys#read-char-0 port))) 261 261 (if (eof-object? x) 262 262 x … … 264 264 265 265 (define (write-byte byte #!optional (port ##sys#standard-output)) 266 266 (##sys#check-exact byte 'write-byte) 267 (##sys#check-port port 'write-byte)267 (##sys#check-port* port 'write-byte) 268 268 (##sys#write-char-0 (integer->char byte) port) ) 269 269 270 270 … … 575 575 576 576 (define fprintf0 577 577 (lambda (loc port msg args) 578 (when port (##sys#check-port port loc))578 (when port (##sys#check-port* port loc)) 579 579 (let ((out (if (and port (##sys#tty-port? port)) 580 580 port 581 581 (open-output-string)))) -
library.scm
diff --git a/library.scm b/library.scm index 63c6c96..c08a43a 100644
a b EOF 3009 3009 (for-each (cut ##sys#print <> #f ##sys#standard-output) lst) ) 3010 3010 3011 3011 (define (print . args) 3012 (##sys#check-port* ##sys#standard-output 'print) 3012 3013 (*print-each args) 3013 3014 (##sys#write-char-0 #\newline ##sys#standard-output) 3014 3015 (void) ) 3015 3016 3016 3017 (define (print* . args) 3018 (##sys#check-port* ##sys#standard-output 'print) 3017 3019 (*print-each args) 3018 3020 (##sys#flush-output ##sys#standard-output) 3019 3021 (void) ) … … EOF 3689 3691 (define (print-call-chain #!optional (port ##sys#standard-output) (start 0) 3690 3692 (thread ##sys#current-thread) 3691 3693 (header "\n\tCall history:\n") ) 3692 (##sys#check-port port 'print-call-chain)3694 (##sys#check-port* port 'print-call-chain) 3693 3695 (##sys#check-exact start 'print-call-chain) 3694 3696 (##sys#check-string header 'print-call-chain) 3695 3697 (let ((ct (##sys#get-call-chain start thread))) -
posixunix.scm
diff --git a/posixunix.scm b/posixunix.scm index 82adbbb..3e578d9 100644
a b EOF 1757 1757 (##sys#error 'set-buffering-mode! "cannot set buffering mode" port mode size) ) ) ) ) 1758 1758 1759 1759 (define (terminal-port? port) 1760 (##sys#check-port port 'terminal-port?)1760 (##sys#check-port* port 'terminal-port?) 1761 1761 (let ([fp (##sys#peek-unsigned-integer port 0)]) 1762 1762 (and (not (eq? 0 fp)) (##core#inline "C_tty_portp" port) ) ) ) 1763 1763 -
posixwin.scm
diff --git a/posixwin.scm b/posixwin.scm index a1e976a..28f8c5f 100644
a b EOF 1461 1461 (ex0 (if (pair? code) (car code) 0)) ) ) ) 1462 1462 1463 1463 (define (terminal-port? port) 1464 (##sys#check-port port 'terminal-port?)1464 (##sys#check-port* port 'terminal-port?) 1465 1465 (let ([fp (##sys#peek-unsigned-integer port 0)]) 1466 1466 (and (not (eq? 0 fp)) (##core#inline "C_tty_portp" port) ) ) ) 1467 1467 -
srfi-4.scm
diff --git a/srfi-4.scm b/srfi-4.scm index 83df671..c41a261 100644
a b EOF 642 642 (define (write-u8vector v #!optional (port ##sys#standard-output) (from 0) 643 643 (to (u8vector-length v))) 644 644 (##sys#check-structure v 'u8vector 'write-u8vector) 645 (##sys#check-port port 'write-u8vector)645 (##sys#check-port* port 'write-u8vector) 646 646 (do ((i from (fx+ i 1))) 647 647 ((fx>= i to)) 648 648 (##sys#write-char-0 … … EOF 650 650 port) ) ) 651 651 652 652 (define (read-u8vector! n dest #!optional (port ##sys#standard-input) (start 0)) 653 (##sys#check-port port 'read-u8vector!)653 (##sys#check-port* port 'read-u8vector!) 654 654 (##sys#check-exact start 'read-u8vector!) 655 655 (##sys#check-structure dest 'u8vector 'read-u8vector!) 656 656 (let ((dest (##sys#slot dest 1))) … … EOF 670 670 (##core#inline "C_substring_copy" str str2 0 n 0) 671 671 str2) ) ) 672 672 (lambda (#!optional n (p ##sys#standard-input)) 673 (##sys#check-port p 'read-u8vector)673 (##sys#check-port* p 'read-u8vector) 674 674 (cond (n (##sys#check-exact n 'read-u8vector) 675 675 (let* ((str (##sys#allocate-vector n #t #f #t)) 676 676 (n2 (##sys#read-string! n str p 0)) ) -
tcp.scm
diff --git a/tcp.scm b/tcp.scm index c8e1bd7..1853092 100644
a b EOF 629 629 (error '##sys#tcp-port->fileno "argument does not appear to be a TCP port" p)))) 630 630 631 631 (define (tcp-addresses p) 632 (##sys#check-port p 'tcp-addresses)632 (##sys#check-port* p 'tcp-addresses) 633 633 (let ((fd (##sys#tcp-port->fileno p))) 634 634 (values 635 635 (or (##net#getsockname fd) … … EOF 642 642 (##sys#string-append "cannot compute remote address - " strerror) p) ) ) ) ) 643 643 644 644 (define (tcp-port-numbers p) 645 (##sys#check-port p 'tcp-port-numbers)645 (##sys#check-port* p 'tcp-port-numbers) 646 646 (let ((fd (##sys#tcp-port->fileno p))) 647 647 (values 648 648 (or (##net#getsockport fd) … … EOF 665 665 port) ) 666 666 667 667 (define (tcp-abandon-port p) 668 (##sys#check-port p 'tcp-abandon-port)668 (##sys#check-port* p 'tcp-abandon-port) 669 669 (##sys#setislot 670 670 (##sys#port-data p) 671 671 (if (##sys#slot p 1) 1 2) -
tests/port-tests.scm
diff --git a/tests/port-tests.scm b/tests/port-tests.scm index 7279541..ee562c2 100644
a b 1 (require-extension srfi-1 ports utils )1 (require-extension srfi-1 ports utils srfi-4 extras tcp posix) 2 2 3 3 (define *text* #<<EOF 4 4 this is a test … … EOF 99 99 (copy-port (current-input-port) (current-output-port))))))) 100 100 101 101 (delete-file "compiler.scm.2") 102 103 (define-syntax check 104 (syntax-rules () 105 ((_ (expr-head expr-rest ...)) 106 (check 'expr-head (expr-head expr-rest ...))) 107 ((_ name expr) 108 (let ((okay (list 'okay))) 109 (assert 110 (eq? okay 111 (condition-case 112 (begin (print* name "...") 113 (flush-output) 114 (let ((output expr)) 115 (printf "FAIL [ ~S ]\n" output))) 116 ((exn i/o file) (printf "OK\n") okay)))))))) 117 118 (define proc (process-fork (lambda () (tcp-accept (tcp-listen 8080))))) 119 120 (on-exit (lambda () (handle-exceptions exn #f (process-signal proc)))) 121 122 (print "\n\nProcedures check on TCP ports being closed\n") 123 124 (receive (in out) 125 (let lp () 126 (condition-case (tcp-connect "localhost" 8080) 127 ((exn i/o net) (lp)))) 128 (close-output-port out) 129 (close-input-port in) 130 (check (tcp-addresses in)) 131 (check (tcp-port-numbers in)) 132 (check (tcp-abandon-port in))) ; Not sure about abandon-port 133 134 (print "\n\nProcedures check on output ports being closed\n") 135 136 (call-with-output-file "/dev/null" 137 (lambda (out) 138 (close-output-port out) 139 (check (write '(foo) out)) 140 (check (fprintf out "blabla")) 141 (check "print-call-chain" (begin (print-call-chain out) (void))) 142 (check (print-error-message (make-property-condition 'exn 'message "foo") out)) 143 (check "print" (with-output-to-port out 144 (lambda () (print "foo")))) 145 (check "print*" (with-output-to-port out 146 (lambda () (print* "foo")))) 147 (check (display "foo" out)) 148 (check (terminal-port? out)) ; Calls isatty() on C_SCHEME_FALSE? 149 (check (newline out)) 150 (check (write-char #\x out)) 151 (check (write-line "foo" out)) 152 (check (write-u8vector '#u8(1 2 3) out)) 153 (check (port->fileno out)) 154 (check (flush-output out)) 155 (check (file-test-lock out)) 156 (check (file-lock out)) 157 (check (file-lock/blocking out)) 158 (check (write-byte 120 out)) 159 (check (write-string "foo" #f out)))) 160 161 (print "\n\nProcedures check on input ports being closed\n") 162 (call-with-input-file "/dev/zero" 163 (lambda (in) 164 (close-input-port in) 165 (check (read in)) 166 (check (read-char in)) 167 (check (char-ready? in)) 168 (check (peek-char in)) 169 (check (port->fileno in)) 170 (check (terminal-port? in)) ; Calls isatty() on C_SCHEME_FALSE? 171 (check (read-line in 5)) 172 (check (read-u8vector 5 in)) 173 (check "read-u8vector!" (let ((dest (make-u8vector 5))) 174 (read-u8vector! 5 dest in))) 175 (check (file-test-lock in)) 176 (check (file-lock in)) 177 (check (file-lock/blocking in)) 178 (check (read-byte in)) 179 (check (read-token (constantly #t) in)) 180 (check (read-string 10 in)) 181 (check "read-string!" (let ((buf (make-string 10))) 182 (read-string! 10 buf in) buf)))) 183 No newline at end of file