OSDN Git Service

Fix a bug where + before % is ignored
authorChalard Jean <jchalard@google.com>
Fri, 19 Apr 2019 05:58:51 +0000 (14:58 +0900)
committerChalard Jean <jchalard@google.com>
Mon, 22 Apr 2019 01:35:15 +0000 (10:35 +0900)
Achievement unlocked : fix a 10-year-old trivial bug

Bug: 1866121
Test: new CTS in Ib7ee866f65baf99b46a31e2115355a42a829421e
Change-Id: Ic91660d974dce21f2affdcacaeffe9accf8451ac

core/java/android/net/UrlQuerySanitizer.java

index 5b67406..cf08b65 100644 (file)
@@ -22,6 +22,8 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Set;
 import java.util.StringTokenizer;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  *
@@ -837,15 +839,11 @@ public class UrlQuerySanitizer {
      * @param string the escaped string
      * @return the unescaped string.
      */
+    private static final Pattern plusOrPercent = Pattern.compile("[+%]");
     public String unescape(String string) {
-        // Early exit if no escaped characters.
-        int firstEscape = string.indexOf('%');
-        if ( firstEscape < 0) {
-            firstEscape = string.indexOf('+');
-            if (firstEscape < 0) {
-                return string;
-            }
-        }
+        final Matcher matcher = plusOrPercent.matcher(string);
+        if (!matcher.find()) return string;
+        final int firstEscape = matcher.start();
 
         int length = string.length();
 
@@ -855,8 +853,7 @@ public class UrlQuerySanitizer {
             char c = string.charAt(i);
             if (c == '+') {
                 c = ' ';
-            }
-            else if ( c == '%' && i + 2 < length) {
+            } else if (c == '%' && i + 2 < length) {
                 char c1 = string.charAt(i + 1);
                 char c2 = string.charAt(i + 2);
                 if (isHexDigit(c1) && isHexDigit(c2)) {