diff options
author | Ludovic Courtès <ludo@gnu.org> | 2019-01-18 14:23:31 +0100 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2019-01-18 17:51:34 +0100 |
commit | 9fe3f11398e858f1d06120bd046cab506efc86dc (patch) | |
tree | 24aac8e3ba08e420b60cc66fe008aaa355e4e200 /guix | |
parent | 7bf1dc75706d558cea41e24ce90f2eb0c026996d (diff) | |
download | gnu-guix-9fe3f11398e858f1d06120bd046cab506efc86dc.tar gnu-guix-9fe3f11398e858f1d06120bd046cab506efc86dc.tar.gz |
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.
Diffstat (limited to 'guix')
-rw-r--r-- | guix/serialization.scm | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/guix/serialization.scm b/guix/serialization.scm index 87ad7eeec0..7c0fea552d 100644 --- a/guix/serialization.scm +++ b/guix/serialization.scm @@ -1,5 +1,5 @@ ;;; 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. ;;; @@ -380,10 +380,19 @@ which case you can use 'identity'." (&nar-error (file f) (port port)))))) (write-string ")" p))) +(define port-conversion-strategy + (fluid->parameter %default-port-conversion-strategy)) + (define (restore-file port file) "Read a file (possibly a directory structure) in Nar format from PORT. 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))) (unless (equal? signature %archive-version-1) (raise |