serialization: 'restore-file' errors out upon non-convertible file names.
Fixes <https://bugs.gnu.org/33603>. Reported by Maxim Cournoyer <maxim.cournoyer@gmail.com>. * guix/serialization.scm (port-conversion-strategy): New variable. (restore-file): Parameterize it. * tests/nar.scm ("restore-file with non-UTF8 locale"): New test.
This commit is contained in:
parent
7bf1dc7570
commit
9fe3f11398
|
@ -1,5 +1,5 @@
|
||||||
;;; GNU Guix --- Functional package management for GNU
|
;;; GNU Guix --- Functional package management for GNU
|
||||||
;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018 Ludovic Courtès <ludo@gnu.org>
|
;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Ludovic Courtès <ludo@gnu.org>
|
||||||
;;;
|
;;;
|
||||||
;;; This file is part of GNU Guix.
|
;;; This file is part of GNU Guix.
|
||||||
;;;
|
;;;
|
||||||
|
@ -380,10 +380,19 @@ which case you can use 'identity'."
|
||||||
(&nar-error (file f) (port port))))))
|
(&nar-error (file f) (port port))))))
|
||||||
(write-string ")" p)))
|
(write-string ")" p)))
|
||||||
|
|
||||||
|
(define port-conversion-strategy
|
||||||
|
(fluid->parameter %default-port-conversion-strategy))
|
||||||
|
|
||||||
(define (restore-file port file)
|
(define (restore-file port file)
|
||||||
"Read a file (possibly a directory structure) in Nar format from PORT.
|
"Read a file (possibly a directory structure) in Nar format from PORT.
|
||||||
Restore it as FILE."
|
Restore it as FILE."
|
||||||
(parameterize ((currently-restored-file file))
|
(parameterize ((currently-restored-file file)
|
||||||
|
|
||||||
|
;; Error out if we can convert file names to the current
|
||||||
|
;; locale. (XXX: We'd prefer UTF-8 encoding for file names
|
||||||
|
;; regardless of the locale, but that's what Guile gives us
|
||||||
|
;; so far.)
|
||||||
|
(port-conversion-strategy 'error))
|
||||||
(let ((signature (read-string port)))
|
(let ((signature (read-string port)))
|
||||||
(unless (equal? signature %archive-version-1)
|
(unless (equal? signature %archive-version-1)
|
||||||
(raise
|
(raise
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
;;; GNU Guix --- Functional package management for GNU
|
;;; GNU Guix --- Functional package management for GNU
|
||||||
;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018 Ludovic Courtès <ludo@gnu.org>
|
;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Ludovic Courtès <ludo@gnu.org>
|
||||||
;;;
|
;;;
|
||||||
;;; This file is part of GNU Guix.
|
;;; This file is part of GNU Guix.
|
||||||
;;;
|
;;;
|
||||||
|
@ -334,6 +334,40 @@
|
||||||
(lambda ()
|
(lambda ()
|
||||||
(rmdir input)))))
|
(rmdir input)))))
|
||||||
|
|
||||||
|
(test-eq "restore-file with non-UTF8 locale" ;<https://bugs.gnu.org/33603>
|
||||||
|
'encoding-error
|
||||||
|
(let* ((file (search-path %load-path "guix.scm"))
|
||||||
|
(output (string-append %test-dir "/output"))
|
||||||
|
(locale (setlocale LC_ALL "C")))
|
||||||
|
(dynamic-wind
|
||||||
|
(lambda () #t)
|
||||||
|
(lambda ()
|
||||||
|
(define-values (port get-bytevector)
|
||||||
|
(open-bytevector-output-port))
|
||||||
|
|
||||||
|
(write-file-tree "root" port
|
||||||
|
#:file-type+size
|
||||||
|
(match-lambda
|
||||||
|
("root" (values 'directory 0))
|
||||||
|
("root/λ" (values 'regular 0)))
|
||||||
|
#:file-port (const (%make-void-port "r"))
|
||||||
|
#:symlink-target (const #f)
|
||||||
|
#:directory-entries (const '("λ")))
|
||||||
|
(close-port port)
|
||||||
|
|
||||||
|
(mkdir %test-dir)
|
||||||
|
(catch 'encoding-error
|
||||||
|
(lambda ()
|
||||||
|
;; This show throw to 'encoding-error.
|
||||||
|
(restore-file (open-bytevector-input-port (get-bytevector))
|
||||||
|
output)
|
||||||
|
(scandir output))
|
||||||
|
(lambda args
|
||||||
|
'encoding-error)))
|
||||||
|
(lambda ()
|
||||||
|
(false-if-exception (rm-rf %test-dir))
|
||||||
|
(setlocale LC_ALL locale)))))
|
||||||
|
|
||||||
(test-assert "restore-file-set (signed, valid)"
|
(test-assert "restore-file-set (signed, valid)"
|
||||||
(with-store store
|
(with-store store
|
||||||
(let* ((texts (unfold (cut >= <> 10)
|
(let* ((texts (unfold (cut >= <> 10)
|
||||||
|
|
Loading…
Reference in New Issue