From d55f2f3de744f5bcd6038e856208f42fa299a774 Mon Sep 17 00:00:00 2001 From: Chalard Jean Date: Fri, 19 Apr 2019 14:58:51 +0900 Subject: [PATCH] Fix a bug where + before % is ignored Achievement unlocked : fix a 10-year-old trivial bug Bug: 1866121 Test: new CTS in Ib7ee866f65baf99b46a31e2115355a42a829421e Change-Id: Ic91660d974dce21f2affdcacaeffe9accf8451ac Merged-In: Ibe73a33264569b08cac4c00b4dda838f1e5551fc Merged-In: Id4b1e456f7ce4e7aae84abb96fa55a8fe8f5caa5 --- core/java/android/net/UrlQuerySanitizer.java | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/core/java/android/net/UrlQuerySanitizer.java b/core/java/android/net/UrlQuerySanitizer.java index 5b674067192ee..cf08b653d0f42 100644 --- a/core/java/android/net/UrlQuerySanitizer.java +++ b/core/java/android/net/UrlQuerySanitizer.java @@ -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)) {