Skip to content

Commit

Permalink
Android/tv-casting-app: Adding defensive checks in Discovery/record p…
Browse files Browse the repository at this point in the history
…arsing (#25464)

* Checking if multicastLock isHeld before trying to release it, avoiding stopServiceDiscovery call if discovery failed to start

* Android tv-casting-app: Adding defensive checks in DiscoveredNodeData constructor (#108)

* Android tv-casting-app: Adding defensive null checks in DiscoveredNodeData constructor

* Adding more defensive checks / exception handling
  • Loading branch information
sharadb-amazon authored and pull[bot] committed Feb 19, 2024
1 parent 9bd6e7d commit 1012976
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,16 @@
package com.chip.casting;

import android.net.nsd.NsdServiceInfo;
import android.util.Log;
import java.net.InetAddress;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

public class DiscoveredNodeData {
private static final String TAG = DiscoveredNodeData.class.getSimpleName();

private static final int MAX_IP_ADDRESSES = 5;
private static final int MAX_ROTATING_ID_LEN = 50;
private static final String KEY_DEVICE_NAME = "DN";
Expand All @@ -51,26 +54,54 @@ public class DiscoveredNodeData {

public DiscoveredNodeData(NsdServiceInfo serviceInfo) {
Map<String, byte[]> attributes = serviceInfo.getAttributes();
this.deviceName = new String(attributes.get(KEY_DEVICE_NAME), StandardCharsets.UTF_8);
if (serviceInfo.getHost() != null) {
this.hostName = serviceInfo.getHost().getHostName();
}
this.deviceType =
Long.parseLong(new String(attributes.get(KEY_DEVICE_TYPE), StandardCharsets.UTF_8));

String vp = new String(attributes.get(KEY_VENDOR_PRODUCT), StandardCharsets.UTF_8);
if (vp != null) {
String[] vpArray = vp.split("\\+");
if (vpArray.length > 0) {
this.vendorId = Long.parseLong(vpArray[0]);
if (vpArray.length == 2) {
this.productId = Long.parseLong(vpArray[1]);

if (attributes != null) {
if (attributes.get(KEY_DEVICE_NAME) != null) {
this.deviceName = new String(attributes.get(KEY_DEVICE_NAME), StandardCharsets.UTF_8);
} else {
Log.e(TAG, "No device name (DN) found in DiscovoredNodeData");
}

if (attributes.get(KEY_DEVICE_TYPE) != null) {
try {
this.deviceType =
Long.parseLong(new String(attributes.get(KEY_DEVICE_TYPE), StandardCharsets.UTF_8));
} catch (NumberFormatException e) {
Log.e(TAG, "Could not parse TXT record for DT: " + e.getMessage());
}
} else {
Log.e(TAG, "TXT Record for DT was null");
}

if (attributes.get(KEY_VENDOR_PRODUCT) != null) {
String vp = new String(attributes.get(KEY_VENDOR_PRODUCT), StandardCharsets.UTF_8);
if (vp != null) {
String[] vpArray = vp.split("\\+");
try {
if (vpArray.length > 0) {
this.vendorId = Long.parseLong(vpArray[0]);
if (vpArray.length == 2) {
this.productId = Long.parseLong(vpArray[1]);
}
}
} catch (NumberFormatException e) {
Log.e(TAG, "Could not parse TXT record for VP: " + e.getMessage());
}
}
} else {
Log.e(TAG, "TXT Record for VP was null");
}
} else {
Log.e(TAG, "NsdServiceInfo.attributes was null");
}

if (serviceInfo.getHost() != null) {
this.hostName = serviceInfo.getHost().getHostName();
this.ipAddresses = Arrays.asList(serviceInfo.getHost());
} else {
Log.e(TAG, "Host name was null");
}
this.port = serviceInfo.getPort();
this.ipAddresses = Arrays.asList(serviceInfo.getHost());
this.numIPs = 1;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,6 @@ public void onStartDiscoveryFailed(String serviceType, int errorCode) {
failureCallback.handle(
new MatterError(
3, "NsdDiscoveryListener Discovery failed to start: Nsd Error code:" + errorCode));
nsdManager.stopServiceDiscovery(this);
}

@Override
Expand All @@ -123,6 +122,5 @@ public void onStopDiscoveryFailed(String serviceType, int errorCode) {
failureCallback.handle(
new MatterError(
3, "NsdDiscoveryListener Discovery failed to stop: Nsd Error code:" + errorCode));
nsdManager.stopServiceDiscovery(this);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,9 @@ public void discoverVideoPlayerCommissioners(
public void run() {
Log.d(TAG, "TvCastingApp stopping Video Player commissioner discovery");
nsdManager.stopServiceDiscovery(nsdDiscoveryListener);
multicastLock.release();
if (multicastLock.isHeld()) {
multicastLock.release();
}
}
},
discoveryDurationSeconds,
Expand Down

0 comments on commit 1012976

Please sign in to comment.