Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 624a205e authored by Sreeram Ramachandran's avatar Sreeram Ramachandran Committed by Android (Google) Code Review
Browse files

Merge "Unescape strings properly in NsdService." into lmp-dev

parents a0c99623 ef12884d
Loading
Loading
Loading
Loading
+8 −12
Original line number Diff line number Diff line
@@ -201,20 +201,16 @@ public class NativeDaemonEvent {
        }
        while (current < length) {
            // find the end of the word
            if (quoted) {
            char terminator = quoted ? '\"' : ' ';
            wordEnd = current;
                while ((wordEnd = rawEvent.indexOf('\"', wordEnd)) != -1) {
                    if (rawEvent.charAt(wordEnd - 1) != '\\') {
                        break;
                    } else {
                        wordEnd++; // skip this escaped quote and keep looking
                    }
            while (wordEnd < length && rawEvent.charAt(wordEnd) != terminator) {
                if (rawEvent.charAt(wordEnd) == '\\') {
                    // skip the escaped char
                    ++wordEnd;
                }
            } else {
                wordEnd = rawEvent.indexOf(' ', current);
                ++wordEnd;
            }
            // if we didn't find the end-o-word token, take the rest of the string
            if (wordEnd == -1) wordEnd = length;
            if (wordEnd > length) wordEnd = length;
            String word = rawEvent.substring(current, wordEnd);
            current += word.length();
            if (!quoted) {
+39 −6
Original line number Diff line number Diff line
@@ -397,8 +397,7 @@ public class NsdService extends INsdManager.Stub {
                        break;
                    case NsdManager.NATIVE_DAEMON_EVENT:
                        NativeEvent event = (NativeEvent) msg.obj;
                        if (!handleNativeEvent(event.code, event.raw,
                                NativeDaemonEvent.unescapeArgs(event.raw))) {
                        if (!handleNativeEvent(event.code, event.raw, event.cooked)) {
                            result = NOT_HANDLED;
                        }
                        break;
@@ -474,8 +473,14 @@ public class NsdService extends INsdManager.Stub {
                    case NativeResponseCode.SERVICE_RESOLVED:
                        /* NNN resolveId fullName hostName port txtlen txtdata */
                        if (DBG) Slog.d(TAG, "SERVICE_RESOLVED Raw: " + raw);
                        int index = cooked[2].indexOf(".");
                        if (index == -1) {
                        int index = 0;
                        while (index < cooked[2].length() && cooked[2].charAt(index) != '.') {
                            if (cooked[2].charAt(index) == '\\') {
                                ++index;
                            }
                            ++index;
                        }
                        if (index >= cooked[2].length()) {
                            Slog.e(TAG, "Invalid service found " + raw);
                            break;
                        }
@@ -483,6 +488,8 @@ public class NsdService extends INsdManager.Stub {
                        String rest = cooked[2].substring(index);
                        String type = rest.replace(".local.", "");

                        name = unescape(name);

                        clientInfo.mResolvedService.setServiceName(name);
                        clientInfo.mResolvedService.setServiceType(type);
                        clientInfo.mResolvedService.setPort(Integer.parseInt(cooked[4]));
@@ -541,6 +548,30 @@ public class NsdService extends INsdManager.Stub {
       }
    }

    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()) {
                    Slog.e(TAG, "Unexpected end of escape sequence in: " + s);
                    break;
                }
                c = s.charAt(i);
                if (c != '.' && c != '\\') {
                    if (i + 2 >= s.length()) {
                        Slog.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();
    }

    private NativeDaemonConnector mNativeConnector;
    private final CountDownLatch mNativeDaemonConnected = new CountDownLatch(1);

@@ -625,10 +656,12 @@ public class NsdService extends INsdManager.Stub {
    private class NativeEvent {
        final int code;
        final String raw;
        final String[] cooked;

        NativeEvent(int code, String raw) {
        NativeEvent(int code, String raw, String[] cooked) {
            this.code = code;
            this.raw = raw;
            this.cooked = cooked;
        }
    }

@@ -644,7 +677,7 @@ public class NsdService extends INsdManager.Stub {
        public boolean onEvent(int code, String raw, String[] cooked) {
            // TODO: NDC translates a message to a callback, we could enhance NDC to
            // directly interact with a state machine through messages
            NativeEvent event = new NativeEvent(code, raw);
            NativeEvent event = new NativeEvent(code, raw, cooked);
            mNsdStateMachine.sendMessage(NsdManager.NATIVE_DAEMON_EVENT, event);
            return true;
        }