guix-commits
[Top][All Lists]
Advanced

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

03/07: gexp: Catch and report non-self-quoting gexp inputs.


From: guix-commits
Subject: 03/07: gexp: Catch and report non-self-quoting gexp inputs.
Date: Mon, 23 Sep 2019 17:41:42 -0400 (EDT)

civodul pushed a commit to branch master
in repository guix.

commit 24ab804ce11fe12ff49cd144a3d9c4bfcf55b41c
Author: Ludovic Courtès <address@hidden>
Date:   Mon Sep 23 22:17:39 2019 +0200

    gexp: Catch and report non-self-quoting gexp inputs.
    
    Previously we would, for example, generate build scripts in the store;
    when trying to run them, we'd get a 'read' error due to the presence
    of #<foo> syntax in there.
    
    * guix/gexp.scm (gexp->sexp)[self-quoting?]: New procedure.
    [reference->sexp]: Check whether the argument in a <gexp-input> box is
    self-quoting.  Raise a '&gexp-input-error' condition if it's not.
    * tests/gexp.scm ("lower-gexp, non-self-quoting input"): New test.
---
 guix/gexp.scm  | 13 ++++++++++++-
 tests/gexp.scm |  7 +++++++
 2 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/guix/gexp.scm b/guix/gexp.scm
index 45cd586..0d0b661 100644
--- a/guix/gexp.scm
+++ b/guix/gexp.scm
@@ -1005,6 +1005,15 @@ references; otherwise, return only non-native 
references."
                      (target (%current-target-system)))
   "Return (monadically) the sexp corresponding to EXP for the given OUTPUT,
 and in the current monad setting (system type, etc.)"
+  (define (self-quoting? x)
+    (letrec-syntax ((one-of (syntax-rules ()
+                              ((_) #f)
+                              ((_ pred rest ...)
+                               (or (pred x)
+                                   (one-of rest ...))))))
+      (one-of symbol? string? keyword? pair? null? array?
+              number? boolean?)))
+
   (define* (reference->sexp ref #:optional native?)
     (with-monad %store-monad
       (match ref
@@ -1034,8 +1043,10 @@ and in the current monad setting (system type, etc.)"
                                                   #:target target)))
              ;; OBJ must be either a derivation or a store file name.
              (return (expand thing obj output)))))
-        (($ <gexp-input> x)
+        (($ <gexp-input> (? self-quoting? x))
          (return x))
+        (($ <gexp-input> x)
+         (raise (condition (&gexp-input-error (input x)))))
         (x
          (return x)))))
 
diff --git a/tests/gexp.scm b/tests/gexp.scm
index 5c013d8..50d0948 100644
--- a/tests/gexp.scm
+++ b/tests/gexp.scm
@@ -871,6 +871,13 @@
                    (eq? (derivation-input-derivation (lowered-gexp-guile lexp))
                         (%guile-for-build)))))))
 
+(test-eq "lower-gexp, non-self-quoting input"
+  +
+  (guard (c ((gexp-input-error? c)
+             (gexp-error-invalid-input c)))
+    (run-with-store %store
+      (lower-gexp #~(foo #$+)))))
+
 (test-assertm "gexp->derivation #:references-graphs"
   (mlet* %store-monad
       ((one (text-file "one" (random-text)))



reply via email to

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