Fix Stackoverflow in sal-rest-docgen 35/100035/1
authorSamuel Schneider <samuel.schneider@pantheon.tech>
Thu, 3 Mar 2022 09:14:22 +0000 (10:14 +0100)
committerRobert Varga <nite@hq.sk>
Fri, 25 Mar 2022 06:41:34 +0000 (06:41 +0000)
Add escaping of chars which underlying library
consider as special characters (and we do not).

JIRA: NETCONF-713
Change-Id: Ife63c31cd9c4912a74db10562b9f927623bc4695
Signed-off-by: Samuel Schneider <samuel.schneider@pantheon.tech>
(cherry picked from commit 7c022319559356346bf5b0e9b1d9f18a9b87b928)

restconf/sal-rest-docgen/src/main/java/org/opendaylight/netconf/sal/rest/doc/impl/DefinitionGenerator.java

index 939eaf6f535107f6e3e15becaaa4a3614ea8fbc3..4a7e45d87593d4adbdee52121b864990d23fea36 100644 (file)
@@ -32,6 +32,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 import org.opendaylight.netconf.sal.rest.doc.impl.ApiDocServiceImpl.OAversion;
 import org.opendaylight.yangtools.yang.common.QName;
@@ -122,6 +123,9 @@ public class DefinitionGenerator {
     private static final String INT32_FORMAT = "int32";
     private static final String INT64_FORMAT = "int64";
     private static final String BOOLEAN_TYPE = "boolean";
+    // Special characters used in automaton inside Generex.
+    // See https://www.brics.dk/automaton/doc/dk/brics/automaton/RegExp.html
+    private static final Pattern AUTOMATON_SPECIAL_CHARACTERS = Pattern.compile("[@&\"<>#~]");
 
     private Module topLevelModule;
 
@@ -837,6 +841,8 @@ public class DefinitionGenerator {
             final PatternConstraint pattern = type.getPatternConstraints().iterator().next();
             String regex = pattern.getJavaPatternString();
             regex = regex.substring(1, regex.length() - 1);
+            // Escape special characters to prevent issues inside Generex.
+            regex = AUTOMATON_SPECIAL_CHARACTERS.matcher(regex).replaceAll("\\\\$0");
             String defaultValue = "";
             try {
                 final Generex generex = new Generex(regex);