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

Commit 8ed09e89 authored by Vinit Deshapnde's avatar Vinit Deshapnde
Browse files

Fix an NPE in NsdManager

The NPE happens because NSD Manager doesn't always notify with a 'good'
notification for SERVICE_FOUND. It can get in a situation where a
SERVICE_FOUND is recevied from MDnsDs demon when processing StopDiscovery
on the messaging thread. When that happens, NsdService sends a message
to NsdManager with an invalid index of the listener.

The fix is twofold. First, we fix NsdService to not generate a message if
it doesn't have a good listener index. And second, we also fix NsdManager
to watch for invalid index.

Change-Id: I3d63af10bded13c72e8e437a1ebf74a666760432
parent 28dd15b2
Loading
Loading
Loading
Loading
+8 −0
Original line number Original line Diff line number Diff line
@@ -417,7 +417,15 @@ public class NsdService extends INsdManager.Stub {
                int keyId = clientInfo.mClientIds.indexOfValue(id);
                int keyId = clientInfo.mClientIds.indexOfValue(id);
                if (keyId != -1) {
                if (keyId != -1) {
                    clientId = clientInfo.mClientIds.keyAt(keyId);
                    clientId = clientInfo.mClientIds.keyAt(keyId);
                } else {
                    // This can happen because of race conditions. For example,
                    // SERVICE_FOUND may race with STOP_SERVICE_DISCOVERY,
                    // and we may get in this situation.
                    Slog.d(TAG, "Notification for a listener that is no longer active: " + id);
                    handled = false;
                    return handled;
                }
                }

                switch (code) {
                switch (code) {
                    case NativeResponseCode.SERVICE_FOUND:
                    case NativeResponseCode.SERVICE_FOUND:
                        /* NNN uniqueId serviceName regType domain */
                        /* NNN uniqueId serviceName regType domain */