From be186602f961768f3f2a237753c0f2cb8b4fdc2e Mon Sep 17 00:00:00 2001 From: paulhu Date: Tue, 12 Apr 2022 07:18:23 +0000 Subject: [PATCH] Deal with non-ASCII characters on resolution info The service name can include non-ASCII characters. So NsdService need to have specific handling for these non-ASCII characters that make resolution working properly. Note: The unescape() method is the same one that was used in S, but was removed by mistake. Bug: 230698801 Test: atest FrameworksNetTests CtsNetTestCases Change-Id: I42fc5618aa2d549ceae25f516ad17c78930ea41d --- .../src/com/android/server/NsdService.java | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/service-t/src/com/android/server/NsdService.java b/service-t/src/com/android/server/NsdService.java index 4086e4ec9b..6816e82a27 100644 --- a/service-t/src/com/android/server/NsdService.java +++ b/service-t/src/com/android/server/NsdService.java @@ -513,7 +513,7 @@ public class NsdService extends INsdManager.Stub { break; } - String name = fullName.substring(0, index); + String name = unescape(fullName.substring(0, index)); String rest = fullName.substring(index); String type = rest.replace(".local.", ""); @@ -590,6 +590,35 @@ public class NsdService extends INsdManager.Stub { } } + // The full service name is escaped from standard DNS rules on mdnsresponder, making it suitable + // for passing to standard system DNS APIs such as res_query() . Thus, make the service name + // unescape for getting right service address. See "Notes on DNS Name Escaping" on + // external/mdnsresponder/mDNSShared/dns_sd.h for more details. + private String unescape(String s) { + StringBuilder sb = new StringBuilder(s.length()); + for (int i = 0; i < s.length(); ++i) { + char c = s.charAt(i); + if (c == '\\') { + if (++i >= s.length()) { + Log.e(TAG, "Unexpected end of escape sequence in: " + s); + break; + } + c = s.charAt(i); + if (c != '.' && c != '\\') { + if (i + 2 >= s.length()) { + Log.e(TAG, "Unexpected end of escape sequence in: " + s); + break; + } + c = (char) ((c - '0') * 100 + (s.charAt(i + 1) - '0') * 10 + + (s.charAt(i + 2) - '0')); + i += 2; + } + } + sb.append(c); + } + return sb.toString(); + } + @VisibleForTesting NsdService(Context ctx, Handler handler, long cleanupDelayMs) { mCleanupDelayMs = cleanupDelayMs;