From e4e21cab8cb0fa36af1dd79cc0645e647967fd62 Mon Sep 17 00:00:00 2001 From: Max Radermacher Date: Mon, 18 Jul 2022 16:32:41 -0700 Subject: [PATCH] =?UTF-8?q?Fix=20outage=20detector=20error=20when=20there?= =?UTF-8?q?=E2=80=99s=20no=20network?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If DNS resolution fails, then it’s expected that there won’t be any addresses. Fail gracefully in this case. If DNS resolution succeeds and provides a non-nil but empty list of addresses, report an error. This shouldn’t happen. --- SignalServiceKit/src/Network/OutageDetection.swift | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/SignalServiceKit/src/Network/OutageDetection.swift b/SignalServiceKit/src/Network/OutageDetection.swift index 8cfd03744a..6272fbdbe7 100644 --- a/SignalServiceKit/src/Network/OutageDetection.swift +++ b/SignalServiceKit/src/Network/OutageDetection.swift @@ -52,16 +52,22 @@ public class OutageDetection: NSObject { // DNS lookup failures, etc. are not considered an outage. private func checkForOutageSync() -> Bool { let host = CFHostCreateWithName(nil, "uptime.signal.org" as CFString).takeRetainedValue() - CFHostStartInfoResolution(host, .addresses, nil) + var resolutionError = CFStreamError() + guard CFHostStartInfoResolution(host, .addresses, &resolutionError) else { + Logger.warn("CFHostStartInfoResolution failed: \(resolutionError)") + return false + } var success: DarwinBoolean = false guard let addresses = CFHostGetAddressing(host, &success)?.takeUnretainedValue() as NSArray? else { - owsFailDebug("CFHostGetAddressing failed: no addresses.") + owsFailDebug("CFHostGetAddressing failed: nil addresses") return false } guard success.boolValue else { owsFailDebug("CFHostGetAddressing failed.") return false } + owsAssertDebug(addresses.count > 0, "CFHostGetAddressing: empty addresses") + var isOutageDetected = false for case let address as NSData in addresses { var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST))