From 4d29a844bddd41cb18b4b9a1f81fdcaf14a4bf86 Mon Sep 17 00:00:00 2001 From: JarrodCTaylor Date: Tue, 16 Dec 2025 08:11:46 -0600 Subject: [PATCH] CLJ-2931 Invalid symbol regex parses keywords with empty namespace src/jvm/clojure/lang/LispReader.java * symbolPat update regex pattern src/jvm/clojure/lang/EdnReader.java * symbolPat update regex pattern test/clojure/test_clojure/reader.cljc * Add tests --- src/jvm/clojure/lang/EdnReader.java | 2 +- src/jvm/clojure/lang/LispReader.java | 2 +- test/clojure/test_clojure/reader.cljc | 7 ++++++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/jvm/clojure/lang/EdnReader.java b/src/jvm/clojure/lang/EdnReader.java index e744969747..ffb97d59ee 100644 --- a/src/jvm/clojure/lang/EdnReader.java +++ b/src/jvm/clojure/lang/EdnReader.java @@ -25,7 +25,7 @@ public class EdnReader{ static IFn[] macros = new IFn[256]; static IFn[] dispatchMacros = new IFn[256]; -static Pattern symbolPat = Pattern.compile("[:]?([\\D&&[^/]].*/)?(/|[\\D&&[^/]][^/]*)"); +static Pattern symbolPat = Pattern.compile("[:]?([\\D&&[^/]][^/]*/)?(/|[\\D&&[^/]][^/]*)"); static Pattern intPat = Pattern.compile( "([-+]?)(?:(0)|([1-9][0-9]*)|0[xX]([0-9A-Fa-f]+)|0([0-7]+)|([1-9][0-9]?)[rR]([0-9A-Za-z]+)|0[0-9]+)(N)?"); diff --git a/src/jvm/clojure/lang/LispReader.java b/src/jvm/clojure/lang/LispReader.java index 8d7079cf5a..568e699e5a 100644 --- a/src/jvm/clojure/lang/LispReader.java +++ b/src/jvm/clojure/lang/LispReader.java @@ -63,7 +63,7 @@ public class LispReader{ static IFn[] macros = new IFn[256]; static IFn[] dispatchMacros = new IFn[256]; //static Pattern symbolPat = Pattern.compile("[:]?([\\D&&[^:/]][^:/]*/)?[\\D&&[^:/]][^:/]*"); -static Pattern symbolPat = Pattern.compile("[:]?([\\D&&[^/]].*/)?(/|[\\D&&[^/]][^/]*)"); +static Pattern symbolPat = Pattern.compile("[:]?([\\D&&[^/]][^/]*/)?(/|[\\D&&[^/]][^/]*)"); static Pattern arraySymbolPat = Pattern.compile("([\\D&&[^/:]].*)/([1-9])"); //static Pattern varPat = Pattern.compile("([\\D&&[^:\\.]][^:\\.]*):([\\D&&[^:\\.]][^:\\.]*)"); //static Pattern intPat = Pattern.compile("[-+]?[0-9]+\\.?"); diff --git a/test/clojure/test_clojure/reader.cljc b/test/clojure/test_clojure/reader.cljc index a0e1f1f13e..88bc12346c 100644 --- a/test/clojure/test_clojure/reader.cljc +++ b/test/clojure/test_clojure/reader.cljc @@ -359,7 +359,8 @@ (are [err msg form] (thrown-with-msg? err msg (read-string form)) Exception #"Invalid token: foo:" "foo:" Exception #"Invalid token: :bar/" ":bar/" - Exception #"Invalid token: ::does.not/exist" "::does.not/exist")) + Exception #"Invalid token: ::does.not/exist" "::does.not/exist" + Exception #"Invalid token: :/-/-" ":/-/-")) ;; Lists (deftest t-Lists) @@ -776,6 +777,10 @@ (is (thrown-with-msg? Exception #"Unknown symbolic value" (read-string "##Foo"))) (is (thrown-with-msg? Exception #"Unknown symbolic value" (edn/read-string "##Foo")))) +(deftest keywords-with-empty-namespace + (is (thrown-with-msg? Exception #"Invalid token" (read-string ":/-/-"))) + (is (thrown-with-msg? Exception #"Invalid token" (edn/read-string ":/-/-")))) + (defn str->lnpr [s] (-> s (java.io.StringReader.) (clojure.lang.LineNumberingPushbackReader.)))