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

Commit bf588bda authored by Dave Platt's avatar Dave Platt Committed by Android Git Automerger
Browse files

am f08cd8c6: am 7d8262cb: am 22f66b76: Merge "Harden NsdManager against null-dereference crashes"

* commit 'f08cd8c6':
  Harden NsdManager against null-dereference crashes
parents 2faf28cf f08cd8c6
Loading
Loading
Loading
Loading
+28 −19
Original line number Diff line number Diff line
@@ -301,27 +301,36 @@ public final class NsdManager {

        @Override
        public void handleMessage(Message message) {
            Object listener = getListener(message.arg2);
            boolean listenerRemove = true;
            switch (message.what) {
                case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED:
                    mAsyncChannel.sendMessage(AsyncChannel.CMD_CHANNEL_FULL_CONNECTION);
                    break;
                    return;
                case AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED:
                    mConnected.countDown();
                    break;
                    return;
                case AsyncChannel.CMD_CHANNEL_DISCONNECTED:
                    Log.e(TAG, "Channel lost");
                    return;
                default:
                    break;
            }
            Object listener = getListener(message.arg2);
            if (listener == null) {
                Log.d(TAG, "Stale key " + message.arg2);
                return;
            }
            boolean listenerRemove = true;
            NsdServiceInfo ns = getNsdService(message.arg2);
            switch (message.what) {
                case DISCOVER_SERVICES_STARTED:
                    String s = ((NsdServiceInfo) message.obj).getServiceType();
                    String s = getNsdServiceInfoType((NsdServiceInfo) message.obj);
                    ((DiscoveryListener) listener).onDiscoveryStarted(s);
                    // Keep listener until stop discovery
                    listenerRemove = false;
                    break;
                case DISCOVER_SERVICES_FAILED:
                    ((DiscoveryListener) listener).onStartDiscoveryFailed(
                            getNsdService(message.arg2).getServiceType(), message.arg1);
                    ((DiscoveryListener) listener).onStartDiscoveryFailed(getNsdServiceInfoType(ns),
                            message.arg1);
                    break;
                case SERVICE_FOUND:
                    ((DiscoveryListener) listener).onServiceFound((NsdServiceInfo) message.obj);
@@ -334,16 +343,14 @@ public final class NsdManager {
                    listenerRemove = false;
                    break;
                case STOP_DISCOVERY_FAILED:
                    ((DiscoveryListener) listener).onStopDiscoveryFailed(
                            getNsdService(message.arg2).getServiceType(), message.arg1);
                    ((DiscoveryListener) listener).onStopDiscoveryFailed(getNsdServiceInfoType(ns),
                            message.arg1);
                    break;
                case STOP_DISCOVERY_SUCCEEDED:
                    ((DiscoveryListener) listener).onDiscoveryStopped(
                            getNsdService(message.arg2).getServiceType());
                    ((DiscoveryListener) listener).onDiscoveryStopped(getNsdServiceInfoType(ns));
                    break;
                case REGISTER_SERVICE_FAILED:
                    ((RegistrationListener) listener).onRegistrationFailed(
                            getNsdService(message.arg2), message.arg1);
                    ((RegistrationListener) listener).onRegistrationFailed(ns, message.arg1);
                    break;
                case REGISTER_SERVICE_SUCCEEDED:
                    ((RegistrationListener) listener).onServiceRegistered(
@@ -352,16 +359,13 @@ public final class NsdManager {
                    listenerRemove = false;
                    break;
                case UNREGISTER_SERVICE_FAILED:
                    ((RegistrationListener) listener).onUnregistrationFailed(
                            getNsdService(message.arg2), message.arg1);
                    ((RegistrationListener) listener).onUnregistrationFailed(ns, message.arg1);
                    break;
                case UNREGISTER_SERVICE_SUCCEEDED:
                    ((RegistrationListener) listener).onServiceUnregistered(
                            getNsdService(message.arg2));
                    ((RegistrationListener) listener).onServiceUnregistered(ns);
                    break;
                case RESOLVE_SERVICE_FAILED:
                    ((ResolveListener) listener).onResolveFailed(
                            getNsdService(message.arg2), message.arg1);
                    ((ResolveListener) listener).onResolveFailed(ns, message.arg1);
                    break;
                case RESOLVE_SERVICE_SUCCEEDED:
                    ((ResolveListener) listener).onServiceResolved((NsdServiceInfo) message.obj);
@@ -421,6 +425,11 @@ public final class NsdManager {
    }


    private String getNsdServiceInfoType(NsdServiceInfo s) {
        if (s == null) return "?";
        return s.getServiceType();
    }

    /**
     * Initialize AsyncChannel
     */