aboutsummaryrefslogtreecommitdiff
path: root/guix/serialization.scm
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2019-01-18 14:23:31 +0100
committerLudovic Courtès <ludo@gnu.org>2019-01-18 17:51:34 +0100
commit9fe3f11398e858f1d06120bd046cab506efc86dc (patch)
tree24aac8e3ba08e420b60cc66fe008aaa355e4e200 /guix/serialization.scm
parent7bf1dc75706d558cea41e24ce90f2eb0c026996d (diff)
downloadguix-9fe3f11398e858f1d06120bd046cab506efc86dc.tar
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/serialization.scm')
-rw-r--r--guix/serialization.scm13
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