Browse Source

Fix ExprMatch stackoverflow

Raul Santos 5 years ago
parent
commit
d425cf6fed
1 changed files with 23 additions and 18 deletions
  1. 23 18
      modules/mono/glue/GodotSharp/GodotSharp/Core/StringExtensions.cs

+ 23 - 18
modules/mono/glue/GodotSharp/GodotSharp/Core/StringExtensions.cs

@@ -624,41 +624,46 @@ namespace Godot
             return instance.Length;
         }
 
-        // <summary>
-        // Do a simple expression match, where '*' matches zero or more arbitrary characters and '?' matches any single character except '.'.
-        // </summary>
-        public static bool ExprMatch(this string instance, string expr, bool caseSensitive)
+        /// <summary>
+        /// Do a simple expression match, where '*' matches zero or more arbitrary characters and '?' matches any single character except '.'.
+        /// </summary>
+        private static bool ExprMatch(this string instance, string expr, bool caseSensitive)
         {
-            if (expr.Length == 0 || instance.Length == 0)
-                return false;
+            // case '\0':
+            if (expr.Length == 0)
+                return instance.Length == 0;
 
             switch (expr[0])
             {
-                case '\0':
-                    return instance[0] == 0;
                 case '*':
-                    return ExprMatch(expr + 1, instance, caseSensitive) || instance[0] != 0 && ExprMatch(expr, instance + 1, caseSensitive);
+                    return ExprMatch(instance, expr.Substring(1), caseSensitive) || (instance.Length > 0 && ExprMatch(instance.Substring(1), expr, caseSensitive));
                 case '?':
-                    return instance[0] != 0 && instance[0] != '.' && ExprMatch(expr + 1, instance + 1, caseSensitive);
+                    return instance.Length > 0 && instance[0] != '.' && ExprMatch(instance.Substring(1), expr.Substring(1), caseSensitive);
                 default:
-                    return (caseSensitive ? instance[0] == expr[0] : char.ToUpper(instance[0]) == char.ToUpper(expr[0])) &&
-                                ExprMatch(expr + 1, instance + 1, caseSensitive);
+                    if (instance.Length == 0) return false;
+                    return (caseSensitive ? instance[0] == expr[0] : char.ToUpper(instance[0]) == char.ToUpper(expr[0])) && ExprMatch(instance.Substring(1), expr.Substring(1), caseSensitive);
             }
         }
 
-        // <summary>
-        // Do a simple case sensitive expression match, using ? and * wildcards (see [method expr_match]).
-        // </summary>
+        /// <summary>
+        /// Do a simple case sensitive expression match, using ? and * wildcards (see [method expr_match]).
+        /// </summary>
         public static bool Match(this string instance, string expr, bool caseSensitive = true)
         {
+            if (instance.Length == 0 || expr.Length == 0)
+                return false;
+
             return instance.ExprMatch(expr, caseSensitive);
         }
 
-        // <summary>
-        // Do a simple case insensitive expression match, using ? and * wildcards (see [method expr_match]).
-        // </summary>
+        /// <summary>
+        /// Do a simple case insensitive expression match, using ? and * wildcards (see [method expr_match]).
+        /// </summary>
         public static bool MatchN(this string instance, string expr)
         {
+            if (instance.Length == 0 || expr.Length == 0)
+                return false;
+
             return instance.ExprMatch(expr, caseSensitive: false);
         }