From bbdb3ffaf33cbeb8178457f4c2988aa6f960976c Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Thu, 31 Jan 2013 14:05:10 +0100 Subject: store: Don't expect build logs to be UTF-8-encoded. * guix/store.scm (read-latin1-string): New procedure. (process-stderr): Use it instead of `read-string'. Reported by Andreas Enge . --- guix/store.scm | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) (limited to 'guix') diff --git a/guix/store.scm b/guix/store.scm index 668bc9a019..560e5675ec 100644 --- a/guix/store.scm +++ b/guix/store.scm @@ -175,6 +175,14 @@ (get-bytevector-n p (- 8 m))) str)) +(define (read-latin1-string p) + (let* ((len (read-int p)) + (m (modulo len 8)) + (str (get-string-n p len))) + (or (zero? m) + (get-bytevector-n p (- 8 m))) + str)) + (define (write-string-list l p) (write-int (length l) p) (for-each (cut write-string <> p) l)) @@ -362,7 +370,11 @@ operate, should the disk become full. Return a server object." "Read standard output and standard error from SERVER, writing it to CURRENT-BUILD-OUTPUT-PORT. Return #t when SERVER is done sending data, and #f otherwise; in the latter case, the caller should call `process-stderr' -again until #t is returned or an error is raised." +again until #t is returned or an error is raised. + +Since the build process's output cannot be assumed to be UTF-8, we +conservatively consider it to be Latin-1, thereby avoiding possible +encoding conversion errors." (define p (nix-server-socket server)) @@ -375,18 +387,18 @@ again until #t is returned or an error is raised." (let ((k (read-int p))) (cond ((= k %stderr-write) - (read-string p) + (read-latin1-string p) #f) ((= k %stderr-read) (let ((len (read-int p))) - (read-string p) ; FIXME: what to do? + (read-latin1-string p) ; FIXME: what to do? #f)) ((= k %stderr-next) - (let ((s (read-string p))) + (let ((s (read-latin1-string p))) (display s (current-build-output-port)) #f)) ((= k %stderr-error) - (let ((error (read-string p)) + (let ((error (read-latin1-string p)) (status (if (>= (nix-server-minor-version server) 8) (read-int p) 1))) -- cgit v1.2.3