guix-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

02/03: serialization: 'restore-file' errors out upon non-convertible fil


From: guix-commits
Subject: 02/03: serialization: 'restore-file' errors out upon non-convertible file names.
Date: Fri, 18 Jan 2019 11:51:43 -0500 (EST)

civodul pushed a commit to branch master
in repository guix.

commit 9fe3f11398e858f1d06120bd046cab506efc86dc
Author: Ludovic Courtès <address@hidden>
Date:   Fri Jan 18 14:23:31 2019 +0100

    serialization: 'restore-file' errors out upon non-convertible file names.
    
    Fixes <https://bugs.gnu.org/33603>.
    Reported by Maxim Cournoyer <address@hidden>.
    
    * guix/serialization.scm (port-conversion-strategy): New variable.
    (restore-file): Parameterize it.
    * tests/nar.scm ("restore-file with non-UTF8 locale"): New test.
---
 guix/serialization.scm | 13 +++++++++++--
 tests/nar.scm          | 36 +++++++++++++++++++++++++++++++++++-
 2 files changed, 46 insertions(+), 3 deletions(-)

diff --git a/guix/serialization.scm b/guix/serialization.scm
index 87ad7ee..7c0fea5 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 
<address@hidden>
+;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Ludovic Courtès 
<address@hidden>
 ;;;
 ;;; 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
diff --git a/tests/nar.scm b/tests/nar.scm
index 5ffe68c..bfc71c6 100644
--- a/tests/nar.scm
+++ b/tests/nar.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018 Ludovic Courtès 
<address@hidden>
+;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Ludovic Courtès 
<address@hidden>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -334,6 +334,40 @@
       (lambda ()
         (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)"
   (with-store store
     (let* ((texts (unfold (cut >= <> 10)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]