Browse Source

Handle case where no old DNS servers exist

Robert.Schreib 4 năm trước cách đây
mục cha
commit
4e8640b380
1 tập tin đã thay đổi với 12 bổ sung7 xóa
  1. 12 7
      osdep/MacDNSHelper.mm

+ 12 - 7
osdep/MacDNSHelper.mm

@@ -40,9 +40,13 @@ void MacDNSHelper::setDNS(uint64_t nwid, const char *domain, const std::vector<I
     CFStringRef key = CFStringCreateWithCString(NULL, buf, kCFStringEncodingUTF8);
     CFArrayRef list = SCDynamicStoreCopyKeyList(ds, key);
     CFIndex i = 0, j = CFArrayGetCount(list);
-
-    CFPropertyListRef oldDNSServers = SCDynamicStoreCopyValue(ds, (CFStringRef)CFArrayGetValueAtIndex(list, i));
-    if (!CFEqual(oldDNSServers,dict)) {
+    bool dnsServersChanged = true;
+    CFPropertyListRef oldDNSServers = NULL;
+    if (j > 0) {
+        oldDNSServers = SCDynamicStoreCopyValue(ds, (CFStringRef)CFArrayGetValueAtIndex(list, i));
+        dnsServersChanged = !CFEqual(oldDNSServers,dict);
+    }
+    if (dnsServersChanged) {
         bool ret = TRUE;
         if (j <= 0) {
             ret &= SCDynamicStoreAddValue(ds, key, dict);
@@ -53,8 +57,9 @@ void MacDNSHelper::setDNS(uint64_t nwid, const char *domain, const std::vector<I
             fprintf(stderr, "Error writing DNS configuration\n");
         }
     }
-
-    CFRelease(oldDNSServers);
+    if (oldDNSServers != NULL) {
+        CFRelease(oldDNSServers);
+    }
     CFRelease(list);
     CFRelease(key);
     CFRelease(dict);
@@ -67,8 +72,8 @@ void MacDNSHelper::setDNS(uint64_t nwid, const char *domain, const std::vector<I
     delete[] s;
     CFRelease(ds);
 }
-    
-void MacDNSHelper::removeDNS(uint64_t nwid) 
+
+void MacDNSHelper::removeDNS(uint64_t nwid)
 {
     SCDynamicStoreRef ds = SCDynamicStoreCreate(NULL, CFSTR("zerotier"), NULL, NULL);