1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-02 13:00:26 +02:00

web: Gracefully handle premature EOF when reading chunk header.

* module/web/http.scm (read-chunk-header): Return 0 when 'read-line'
  returns EOF.
This commit is contained in:
Ludovic Courtès 2015-09-26 11:04:23 +02:00 committed by Andy Wingo
parent d975a8dec6
commit 0bcf5d78ec
2 changed files with 26 additions and 9 deletions

View file

@ -34,6 +34,7 @@
#:use-module (srfi srfi-9) #:use-module (srfi srfi-9)
#:use-module (srfi srfi-19) #:use-module (srfi srfi-19)
#:use-module (ice-9 rdelim) #:use-module (ice-9 rdelim)
#:use-module (ice-9 match)
#:use-module (ice-9 q) #:use-module (ice-9 q)
#:use-module (ice-9 binary-ports) #:use-module (ice-9 binary-ports)
#:use-module (rnrs bytevectors) #:use-module (rnrs bytevectors)
@ -1914,15 +1915,21 @@ treated specially, and is just returned as a plain string."
;; Chunked Responses ;; Chunked Responses
(define (read-chunk-header port) (define (read-chunk-header port)
"Read a chunk header and return the chunk size." "Read a chunk header from PORT and return the size in bytes of the
(let* ((str (read-line port)) upcoming chunk."
(extension-start (string-index str (lambda (c) (or (char=? c #\;) (match (read-line port)
(char=? c #\return))))) ((? eof-object?)
(size (string->number (if extension-start ; unnecessary? ;; Connection closed prematurely: there's nothing left to read.
(substring str 0 extension-start) 0)
str) (str
16))) (let ((extension-start (string-index str
size)) (lambda (c)
(or (char=? c #\;)
(char=? c #\return))))))
(string->number (if extension-start ; unnecessary?
(substring str 0 extension-start)
str)
16)))))
(define* (make-chunked-input-port port #:key (keep-alive? #f)) (define* (make-chunked-input-port port #:key (keep-alive? #f))
"Returns a new port which translates HTTP chunked transfer encoded "Returns a new port which translates HTTP chunked transfer encoded

View file

@ -423,6 +423,16 @@
(utf8->string (get-bytevector-n port 6)) (utf8->string (get-bytevector-n port 6))
(reverse requests))))) (reverse requests)))))
(pass-if-equal "EOF instead of chunk header"
"Only chunk."
;; Omit the second chunk header, leading to a premature EOF. This
;; used to cause 'read-chunk-header' to throw to wrong-type-arg.
;; See the backtrace at
;; <http://debbugs.gnu.org/cgi/bugreport.cgi?bug=19976#5>.
(let* ((str "B\r\nOnly chunk.")
(port (make-chunked-input-port (open-input-string str))))
(get-string-all port)))
(pass-if-equal (pass-if-equal
(call-with-output-string (call-with-output-string
(lambda (out-raw) (lambda (out-raw)