From 0939bb8805c699f4f1e2f80126931a1a92a95b19 Mon Sep 17 00:00:00 2001 From: Thomas Heller Date: Thu, 29 Mar 2018 12:37:11 +0200 Subject: [PATCH] protect against *print-length* messing with data files --- src/main/shadow/build/babel.clj | 3 ++- src/main/shadow/build/closure.clj | 5 +++-- src/main/shadow/build/targets/browser.clj | 5 +++-- src/main/shadow/cljs/devtools/api.clj | 5 +++-- src/main/shadow/cljs/devtools/server/web/api.clj | 5 +++-- src/main/shadow/cljs/devtools/server/web/common.clj | 5 +++-- src/main/shadow/cljs/devtools/server/worker/ws.clj | 7 ++++--- src/main/shadow/core_ext.clj | 11 +++++++++++ src/main/shadow/undertow.clj | 5 +++-- 9 files changed, 35 insertions(+), 16 deletions(-) create mode 100644 src/main/shadow/core_ext.clj diff --git a/src/main/shadow/build/babel.clj b/src/main/shadow/build/babel.clj index 9e95daa4..81a5f949 100644 --- a/src/main/shadow/build/babel.clj +++ b/src/main/shadow/build/babel.clj @@ -3,6 +3,7 @@ [clojure.core.async :as async :refer (!!)] [shadow.build.log :as cljs-log] [shadow.cljs.util :as util] + [shadow.core-ext :as core-ext] [clojure.tools.logging :as log]) (:import (java.io PushbackReader Writer InputStreamReader BufferedReader IOException))) @@ -54,7 +55,7 @@ (let [line (-> req (dissoc ::reply-to) - (pr-str) + (core-ext/safe-pr-str) (str "\n"))] (doto out (.write line) diff --git a/src/main/shadow/build/closure.clj b/src/main/shadow/build/closure.clj index 5f493648..512008eb 100644 --- a/src/main/shadow/build/closure.clj +++ b/src/main/shadow/build/closure.clj @@ -15,7 +15,8 @@ [clojure.data.json :as json] [shadow.build.cache :as cache] [cljs.compiler :as cljs-comp] - [clojure.tools.logging :as log]) + [clojure.tools.logging :as log] + [shadow.core-ext :as core-ext]) (:import (java.io StringWriter ByteArrayInputStream FileOutputStream File) (com.google.javascript.jscomp JSError SourceFile CompilerOptions CustomPassExecutionTime CommandLineRunner VariableMap SourceMapInput DiagnosticGroups @@ -689,7 +690,7 @@ (map :name) (map (fn [def] (let [export-name - (-> def name str comp/munge pr-str)] + (-> def name str comp/munge core-ext/safe-pr-str)] (str export-name ":" (comp/munge def))))) (str/join ",") (as-module-exports)) diff --git a/src/main/shadow/build/targets/browser.clj b/src/main/shadow/build/targets/browser.clj index 218db654..589574fc 100644 --- a/src/main/shadow/build/targets/browser.clj +++ b/src/main/shadow/build/targets/browser.clj @@ -17,7 +17,8 @@ [shadow.build.output :as output] [shadow.build.closure :as closure] [shadow.build.data :as data] - [shadow.build.log :as log])) + [shadow.build.log :as log] + [shadow.core-ext :as core-ext])) (s/def ::entry (s/or :sym shared/unquoted-simple-symbol? @@ -342,7 +343,7 @@ (io/make-parents json-file) (spit json-file (json module-data)) - (spit edn-file (pr-str module-data)) + (spit edn-file (core-ext/safe-pr-str module-data)) state )) diff --git a/src/main/shadow/cljs/devtools/api.clj b/src/main/shadow/cljs/devtools/api.clj index d1e5159c..1af3f9c5 100644 --- a/src/main/shadow/cljs/devtools/api.clj +++ b/src/main/shadow/cljs/devtools/api.clj @@ -23,7 +23,8 @@ [shadow.cljs.devtools.server.repl-impl :as repl-impl] [shadow.cljs.devtools.server.runtime :as runtime] [shadow.build.output :as output] - [shadow.build.log :as build-log])) + [shadow.build.log :as build-log] + [shadow.core-ext :as core-ext])) ;; nREPL support @@ -454,7 +455,7 @@ (spit (io/file output-dir "bundle-info.edn") - (pr-str bundle-info))) + (core-ext/safe-pr-str bundle-info))) :done )) diff --git a/src/main/shadow/cljs/devtools/server/web/api.clj b/src/main/shadow/cljs/devtools/server/web/api.clj index a524227b..5d96912a 100644 --- a/src/main/shadow/cljs/devtools/server/web/api.clj +++ b/src/main/shadow/cljs/devtools/server/web/api.clj @@ -11,7 +11,8 @@ [shadow.cljs.devtools.api :as api] [shadow.cljs.util :as util] [hiccup.page :refer (html5)] - [clojure.java.io :as io])) + [clojure.java.io :as io] + [shadow.core-ext :as core-ext])) (defn index-page [req] {:status 200 @@ -82,7 +83,7 @@ {:status 200 :headers {"content-type" "application/edn; charset=utf-8"} - :body (pr-str result)})) + :body (core-ext/safe-pr-str result)})) (defn get-bundle-info [{:keys [config] :as req} build-id] (try diff --git a/src/main/shadow/cljs/devtools/server/web/common.clj b/src/main/shadow/cljs/devtools/server/web/common.clj index a124bc09..f608d62b 100644 --- a/src/main/shadow/cljs/devtools/server/web/common.clj +++ b/src/main/shadow/cljs/devtools/server/web/common.clj @@ -2,7 +2,8 @@ (:require [shadow.server.assets :as assets] [hiccup.page :refer (html5)] [hiccup.core :refer (html)] - [clojure.java.io :as io])) + [clojure.java.io :as io] + [shadow.core-ext :as core-ext])) (defn not-found ([req] @@ -20,7 +21,7 @@ (defn edn [req data] {:status 200 :header {"content-type" "application/edn"} - :body (pr-str data)}) + :body (core-ext/safe-pr-str data)}) (defn page-boilerplate [req ^String content] diff --git a/src/main/shadow/cljs/devtools/server/worker/ws.clj b/src/main/shadow/cljs/devtools/server/worker/ws.clj index c58ba5cc..084e074c 100644 --- a/src/main/shadow/cljs/devtools/server/worker/ws.clj +++ b/src/main/shadow/cljs/devtools/server/worker/ws.clj @@ -11,7 +11,8 @@ [shadow.http.router :as http] [shadow.build.data :as data] [shadow.build.resource :as rc] - [clojure.tools.logging :as log]) + [clojure.tools.logging :as log] + [shadow.core-ext :as core-ext]) (:import (java.util UUID))) (defn ws-loop! @@ -162,7 +163,7 @@ result (worker/repl-compile worker-proc input)] {:status 200 :headers headers - :body (pr-str result)}) + :body (core-ext/safe-pr-str result)}) ;; bad requests {:status 400 @@ -242,7 +243,7 @@ (str prepend js append sm-text))) }))) (into []) - (pr-str))}) + (core-ext/safe-pr-str))}) ;; bad requests {:status 400 diff --git a/src/main/shadow/core_ext.clj b/src/main/shadow/core_ext.clj new file mode 100644 index 00000000..1fd83dd3 --- /dev/null +++ b/src/main/shadow/core_ext.clj @@ -0,0 +1,11 @@ +(ns shadow.core-ext) + +(defn safe-pr-str + "cider globally sets *print-length* for the nrepl-session which messes with pr-str when used to print cache or other files" + [x] + (binding [*print-length* nil + *print-level* nil + *print-namespaced-maps* nil + *print-meta* nil] + (pr-str x) + )) diff --git a/src/main/shadow/undertow.clj b/src/main/shadow/undertow.clj index fa373b1f..9e84c2c3 100644 --- a/src/main/shadow/undertow.clj +++ b/src/main/shadow/undertow.clj @@ -5,7 +5,8 @@ [clojure.core.async.impl.protocols :as async-prot] [clojure.tools.logging :as log] [shadow.undertow.impl :as impl] - [clojure.edn :as edn]) + [clojure.edn :as edn] + [shadow.core-ext :as core-ext]) (:import (io.undertow Undertow Handlers UndertowOptions) (io.undertow.websockets WebSocketConnectionCallback) (io.undertow.server.handlers ResponseCodeHandler BlockingHandler) @@ -91,7 +92,7 @@ (async/close! ws-in) ;; try to send message, close everything if that fails (do (try - (WebSockets/sendTextBlocking (pr-str msg) channel) + (WebSockets/sendTextBlocking (core-ext/safe-pr-str msg) channel) ;; just ignore sending to a closed channel (catch ClosedChannelException e (async/close! ws-in)