From 7eab1c3aa5ab0a4463c9953072fc3a32e21a8b29 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Sa=C3=BAl=20Ibarra=20Corretg=C3=A9?= <saghul@jitsi.org>
Date: Fri, 18 Dec 2020 09:57:29 +0100
Subject: [PATCH] ios: fix crash if device doesn't have a name

We have observed this crash:

~~~
Fatal Exception: NSInvalidArgumentException
0  CoreFoundation                 0x19c404654 __exceptionPreprocess
1  libobjc.A.dylib                0x19c126bcc objc_exception_throw
2  CoreFoundation                 0x19c45a280 -[__NSCFString characterAtIndex:].cold.1
3  CoreFoundation                 0x19c4636e8 -[__NSPlaceholderDictionary initWithObjects:forKeys:count:].cold.5
4  CoreFoundation                 0x19c2f20bc -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]
5  CoreFoundation                 0x19c2e40c4 +[NSDictionary dictionaryWithObjects:forKeys:count:]
6  JitsiMeet                      0x104d58d20 -[WebRTCModule(RTCMediaStream) enumerateDevices:] + 145 (WebRTCModule+RTCMediaStream.m:145)
~~~
---
 ios/RCTWebRTC/WebRTCModule+RTCMediaStream.m | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/ios/RCTWebRTC/WebRTCModule+RTCMediaStream.m b/ios/RCTWebRTC/WebRTCModule+RTCMediaStream.m
index 7635205..109fe33 100644
--- a/ios/RCTWebRTC/WebRTCModule+RTCMediaStream.m
+++ b/ios/RCTWebRTC/WebRTCModule+RTCMediaStream.m
@@ -123,17 +123,21 @@ RCT_EXPORT_METHOD(enumerateDevices:(RCTResponseSenderBlock)callback)
                                                                  mediaType:AVMediaTypeVideo
                                                                   position:AVCaptureDevicePositionUnspecified];
     for (AVCaptureDevice *device in videoevicesSession.devices) {
-        NSString *position = @"";
+        NSString *position = @"unknown";
         if (device.position == AVCaptureDevicePositionBack) {
             position = @"environment";
         } else if (device.position == AVCaptureDevicePositionFront) {
             position = @"front";
         }
+        NSString *label = "Unknown video device";
+        if (device.localizedName != nil) {
+            label = device.localizedName;
+        }
         [devices addObject:@{
                              @"facing": position,
                              @"deviceId": device.uniqueID,
                              @"groupId": @"",
-                             @"label": device.localizedName,
+                             @"label": label,
                              @"kind": @"videoinput",
                              }];
     }
@@ -142,10 +146,14 @@ RCT_EXPORT_METHOD(enumerateDevices:(RCTResponseSenderBlock)callback)
                                                                  mediaType:AVMediaTypeAudio
                                                                   position:AVCaptureDevicePositionUnspecified];
     for (AVCaptureDevice *device in audioDevicesSession.devices) {
+        NSString *label = "Unknown audio device";
+        if (device.localizedName != nil) {
+            label = device.localizedName;
+        }
         [devices addObject:@{
                              @"deviceId": device.uniqueID,
                              @"groupId": @"",
-                             @"label": device.localizedName,
+                             @"label": label,
                              @"kind": @"audioinput",
                              }];
     }
-- 
GitLab