summary refs log tree commit diff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2014-07-23 18:17:06 +0200
committerLudovic Courtès <ludo@gnu.org>2014-07-23 18:20:56 +0200
commit720ee245dae56759785f968aca1714ea222645ad (patch)
tree4cbd71b8e8c5deae0c5a3c077f8cc10bd0c09657
parentb6debdaa22931646fbbc116048732c6bcb37af3c (diff)
downloadguix-720ee245dae56759785f968aca1714ea222645ad.tar.gz
guix system: Protect against changes to $PATH when activating the system.
Partly fixes <http://bugs.gnu.org/18082>.
Reported by Mark H Weaver <mhw@netris.org>.

* guix/scripts/system.scm (save-environment-excursion): New macro.
  (switch-to-system): Wrap 'primitive-load' call in it.
-rw-r--r--guix/scripts/system.scm16
1 files changed, 15 insertions, 1 deletions
diff --git a/guix/scripts/system.scm b/guix/scripts/system.scm
index 5737807d8b..4f1869af38 100644
--- a/guix/scripts/system.scm
+++ b/guix/scripts/system.scm
@@ -172,6 +172,16 @@ When GRUB? is true, install GRUB on DEVICE, using GRUB.CFG."
   ;; The system profile.
   (string-append %state-directory "/profiles/system"))
 
+(define-syntax-rule (save-environment-excursion body ...)
+  "Save the current environment variables, run BODY..., and restore them."
+  (let ((env (environ)))
+    (dynamic-wind
+      (const #t)
+      (lambda ()
+        body ...)
+      (lambda ()
+        (environ env)))))
+
 (define* (switch-to-system os
                            #:optional (profile %system-profile))
   "Make a new generation of PROFILE pointing to the directory of OS, switch to
@@ -185,7 +195,11 @@ it atomically, and then run OS's activation script."
       (switch-symlinks profile generation)
 
       (format #t (_ "activating system...~%"))
-      (return (primitive-load (derivation->output-path script)))
+
+      ;; The activation script may change $PATH, among others, so protect
+      ;; against that.
+      (return (save-environment-excursion
+               (primitive-load (derivation->output-path script))))
 
       ;; TODO: Run 'deco reload ...'.
       )))