diff options
Diffstat (limited to 'mDNSResponder/mDNSMacOSX')
20 files changed, 899 insertions, 224 deletions
diff --git a/mDNSResponder/mDNSMacOSX/D2D.c b/mDNSResponder/mDNSMacOSX/D2D.c index 2848cdab..6ad8e945 100644 --- a/mDNSResponder/mDNSMacOSX/D2D.c +++ b/mDNSResponder/mDNSMacOSX/D2D.c @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 4 -*- * - * Copyright (c) 2002-2016 Apple Inc. All rights reserved. + * Copyright (c) 2002-2018 Apple Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -97,7 +97,6 @@ static mDNSu8 *const compression_limit = (mDNSu8 *) &compression_base_msg + size static mDNSu8 *const compression_lhs = (mDNSu8 *const) compression_base_msg.data + 27; mDNSlocal void FreeD2DARElemCallback(mDNS *const m, AuthRecord *const rr, mStatus result); -mDNSlocal void PrintHex(mDNSu8 *data, mDNSu16 len); typedef struct D2DRecordListElem { @@ -167,44 +166,15 @@ mDNSlocal mDNSu8 * DNSNameCompressionBuildRHS(mDNSu8 *start, const ResourceRecor return putRData(&compression_base_msg, start, compression_limit, resourceRecord); } -#define PRINT_DEBUG_BYTES_LIMIT 64 // set limit on number of record bytes printed for debugging - -mDNSlocal void PrintHex(mDNSu8 *data, mDNSu16 len) +mDNSlocal void PrintHelper(const char *const tag, mDNSu8 *lhs, mDNSu16 lhs_len, mDNSu8 *rhs, mDNSu16 rhs_len) { - mDNSu8 *end; - char buffer[49] = {0}; - char *bufend = buffer + sizeof(buffer); - - if (len > PRINT_DEBUG_BYTES_LIMIT) - { - LogInfo(" (limiting debug output to %d bytes)", PRINT_DEBUG_BYTES_LIMIT); - len = PRINT_DEBUG_BYTES_LIMIT; - } - end = data + len; - - while(data < end) + if (mDNS_LoggingEnabled) { - char *ptr = buffer; - for(; data < end && ptr < bufend-1; ptr+=3,data++) - mDNS_snprintf(ptr, bufend - ptr, "%02X ", *data); - LogInfo(" %s", buffer); + LogDebug("%s: LHS: (%d bytes) %.*H", tag, lhs_len, lhs_len, lhs); + if (rhs) LogDebug("%s: RHS: (%d bytes) %.*H", tag, rhs_len, rhs_len, rhs); } } -mDNSlocal void PrintHelper(const char *const tag, mDNSu8 *lhs, mDNSu16 lhs_len, mDNSu8 *rhs, mDNSu16 rhs_len) -{ - if (!mDNS_LoggingEnabled) return; - - LogInfo("%s:", tag); - LogInfo(" LHS: (%d bytes)", lhs_len); - PrintHex(lhs, lhs_len); - - if (!rhs) return; - - LogInfo(" RHS: (%d bytes)", rhs_len); - PrintHex(rhs, rhs_len); -} - mDNSlocal void FreeD2DARElemCallback(mDNS *const m, AuthRecord *const rr, mStatus result) { (void)m; // unused @@ -333,9 +303,8 @@ mDNSlocal mStatus xD2DParse(const mDNSu8 * const lhs, const mDNSu16 lhs_len, con if (mDNS_LoggingEnabled) { - LogInfo("%s", __func__); - LogInfo(" Static Bytes: (%d bytes)", compression_lhs - (mDNSu8*)&compression_base_msg); - PrintHex((mDNSu8*)&compression_base_msg, compression_lhs - (mDNSu8*)&compression_base_msg); + const int len = (int)(compression_lhs - (mDNSu8*)&compression_base_msg); + LogInfo("xD2DParse: Static Bytes: (%d bytes) %.*H", len, len, &compression_base_msg); } mDNSu8 *ptr = compression_lhs; // pointer to the end of our fake packet @@ -366,8 +335,8 @@ mDNSlocal mStatus xD2DParse(const mDNSu8 * const lhs, const mDNSu16 lhs_len, con if (mDNS_LoggingEnabled) { - LogInfo(" Our Bytes (%d bytes): ", ptr - compression_lhs); - PrintHex(compression_lhs, ptr - compression_lhs); + const int len = (int)(ptr - compression_lhs); + LogInfo("xD2DParse: Our Bytes (%d bytes): %.*H", len, len, compression_lhs); } ptr = (mDNSu8 *) GetLargeResourceRecord(m, &compression_base_msg, compression_lhs, ptr, mDNSInterface_Any, kDNSRecordTypePacketAns, &m->rec); diff --git a/mDNSResponder/mDNSMacOSX/DNS64.c b/mDNSResponder/mDNSMacOSX/DNS64.c index 1f4e0ec2..6fef38f8 100644 --- a/mDNSResponder/mDNSMacOSX/DNS64.c +++ b/mDNSResponder/mDNSMacOSX/DNS64.c @@ -22,7 +22,13 @@ #include "DNS64.h" #include <AssertMacros.h> -#include <network/nat64.h> + +#if __has_include(<nw/private.h>) + #include <nw/private.h> +#else + #include <network/nat64.h> +#endif + #include <stdlib.h> #include <string.h> diff --git a/mDNSResponder/mDNSMacOSX/DNSServiceDiscovery.c b/mDNSResponder/mDNSMacOSX/DNSServiceDiscovery.c index dd670ab1..2b89bc24 100644 --- a/mDNSResponder/mDNSMacOSX/DNSServiceDiscovery.c +++ b/mDNSResponder/mDNSMacOSX/DNSServiceDiscovery.c @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 4 -*- * - * Copyright (c) 2002-2012 Apple Inc. All rights reserved. + * Copyright (c) 2002-2018 Apple Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,14 +15,6 @@ * limitations under the License. */ -// Suppress "warning: 'DNSServiceDiscoveryMachPort' is deprecated" messages -- we already know this code is building the deprecated API -// Since we compile with all warnings treated as errors, we have to turn off the warnings here or the project won't compile -#include <AvailabilityMacros.h> -#undef AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED -#define AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED -#undef AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_3 -#define AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_3 - #include "../mDNSMacOSX/DNSServiceDiscovery.h" #include "DNSServiceDiscoveryDefines.h" diff --git a/mDNSResponder/mDNSMacOSX/DNSServiceDiscovery.h b/mDNSResponder/mDNSMacOSX/DNSServiceDiscovery.h index 004d3259..3f683a83 100644 --- a/mDNSResponder/mDNSMacOSX/DNSServiceDiscovery.h +++ b/mDNSResponder/mDNSMacOSX/DNSServiceDiscovery.h @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 4 -*- * - * Copyright (c) 2002, 2004, 2006, 2011 Apple Inc. All rights reserved. + * Copyright (c) 2002-2018 Apple Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,8 +31,9 @@ #include <sys/cdefs.h> #include <netinet/in.h> +#include <os/availability.h> -#include <AvailabilityMacros.h> +#define kDNSServiceDiscoveryDeprecatedMsg "This API was deprecated in Mac OS X 10.3 and replaced by the portable cross-platform /usr/include/dns_sd.h API" __BEGIN_DECLS @@ -90,7 +91,7 @@ typedef uint32_t DNSRecordReference; call to the specified callout function. @param replyMsg The Mach message. */ -void DNSServiceDiscovery_handleReply(void *replyMsg); +void DNSServiceDiscovery_handleReply(void *replyMsg) API_DEPRECATED(kDNSServiceDiscoveryDeprecatedMsg, macos(10.2, 10.3)); /***************************************************************************/ /* DNS Service Browser */ @@ -125,7 +126,7 @@ dns_service_discovery_ref DNSServiceBrowserCreate const char *domain, DNSServiceBrowserReply callBack, void *context -) AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_3; +) API_DEPRECATED(kDNSServiceDiscoveryDeprecatedMsg, macos(10.2, 10.3)); /***************************************************************************/ /* Resolver requests */ @@ -158,7 +159,7 @@ dns_service_discovery_ref DNSServiceResolverResolve const char *domain, DNSServiceResolverReply callBack, void *context -) AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_3; +) API_DEPRECATED(kDNSServiceDiscoveryDeprecatedMsg, macos(10.2, 10.3)); /***************************************************************************/ /* Mach port accessor and deallocation */ @@ -173,7 +174,7 @@ dns_service_discovery_ref DNSServiceResolverResolve specified or some other error occurred which prevented the resolution from being started. */ -mach_port_t DNSServiceDiscoveryMachPort(dns_service_discovery_ref dnsServiceDiscovery) AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_3; +mach_port_t DNSServiceDiscoveryMachPort(dns_service_discovery_ref dnsServiceDiscovery) API_DEPRECATED(kDNSServiceDiscoveryDeprecatedMsg, macos(10.2, 10.3)); /*! @function DNSServiceDiscoveryDeallocate @@ -181,7 +182,7 @@ mach_port_t DNSServiceDiscoveryMachPort(dns_service_discovery_ref dnsServiceDisc @param dnsServiceDiscovery A dns_service_discovery_ref as returned from a creation or enumeration call @result void */ -void DNSServiceDiscoveryDeallocate(dns_service_discovery_ref dnsServiceDiscovery) AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_3; +void DNSServiceDiscoveryDeallocate(dns_service_discovery_ref dnsServiceDiscovery) API_DEPRECATED(kDNSServiceDiscoveryDeprecatedMsg, macos(10.2, 10.3)); __END_DECLS diff --git a/mDNSResponder/mDNSMacOSX/LoggingProfiles/AppleInternal/com.apple.mDNSResponder.plist b/mDNSResponder/mDNSMacOSX/LoggingProfiles/AppleInternal/com.apple.mDNSResponder.plist new file mode 100644 index 00000000..72352ceb --- /dev/null +++ b/mDNSResponder/mDNSMacOSX/LoggingProfiles/AppleInternal/com.apple.mDNSResponder.plist @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>DEFAULT-OPTIONS</key> + <dict> + <key>Level</key> + <dict> + <key>Persist</key> + <string>Info</string> + </dict> + </dict> +</dict> +</plist> diff --git a/mDNSResponder/mDNSMacOSX/LoggingProfiles/com.apple.mDNSResponder.plist b/mDNSResponder/mDNSMacOSX/LoggingProfiles/com.apple.mDNSResponder.plist new file mode 100644 index 00000000..1eba185d --- /dev/null +++ b/mDNSResponder/mDNSMacOSX/LoggingProfiles/com.apple.mDNSResponder.plist @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>DEFAULT-OPTIONS</key> + <dict> + <key>Level</key> + <dict> + <key>Persist</key> + <string>Inherit</string> + <key>Enable</key> + <string>Inherit</string> + </dict> + </dict> +</dict> +</plist> diff --git a/mDNSResponder/mDNSMacOSX/Metrics.h b/mDNSResponder/mDNSMacOSX/Metrics.h index ff419fd8..e3772299 100644 --- a/mDNSResponder/mDNSMacOSX/Metrics.h +++ b/mDNSResponder/mDNSMacOSX/Metrics.h @@ -26,7 +26,7 @@ extern "C" { #if TARGET_OS_IOS mStatus MetricsInit(void); -void MetricsUpdateDNSQueryStats(const domainname *inQueryName, mDNSu16 inType, const ResourceRecord *inRR, mDNSu32 inSendCount, mDNSu32 inLatencyMs, mDNSBool inForCell); +void MetricsUpdateDNSQueryStats(const domainname *inQueryName, mDNSu16 inType, const ResourceRecord *inRR, mDNSu32 inSendCount, ExpiredAnswerMetric inExpiredAnswerState, mDNSu32 inLatencyMs, mDNSBool inForCell); void MetricsUpdateDNSResolveStats(const domainname *inQueryName, const ResourceRecord *inRR, mDNSBool inForCell); void MetricsUpdateDNSQuerySize(mDNSu32 inSize); void MetricsUpdateDNSResponseSize(mDNSu32 inSize); diff --git a/mDNSResponder/mDNSMacOSX/Metrics.m b/mDNSResponder/mDNSMacOSX/Metrics.m index e540f3be..dd20bc27 100644 --- a/mDNSResponder/mDNSMacOSX/Metrics.m +++ b/mDNSResponder/mDNSMacOSX/Metrics.m @@ -93,10 +93,11 @@ SOFT_LINK_CLASS(WirelessDiagnostics, AWDMDNSResponderDNSMessageSizeStats) // Constants //=========================================================================================================================== -#define kQueryStatsMaxQuerySendCount 10 -#define kQueryStatsSendCountBinCount (kQueryStatsMaxQuerySendCount + 1) -#define kQueryStatsLatencyBinCount 55 -#define kResolveStatsMaxObjCount 2000 +#define kQueryStatsMaxQuerySendCount 10 +#define kQueryStatsSendCountBinCount (kQueryStatsMaxQuerySendCount + 1) +#define kQueryStatsLatencyBinCount 55 +#define kQueryStatsExpiredAnswerStateCount (ExpiredAnswer_EnumCount) +#define kResolveStatsMaxObjCount 2000 //=========================================================================================================================== // Data structures @@ -152,6 +153,7 @@ typedef struct uint16_t responseLatencyBins[kQueryStatsLatencyBinCount]; uint16_t negAnsweredQuerySendCountBins[kQueryStatsSendCountBinCount]; uint16_t negResponseLatencyBins[kQueryStatsLatencyBinCount]; + uint16_t expiredAnswerStateBins[kQueryStatsExpiredAnswerStateCount]; } DNSHist; @@ -159,6 +161,7 @@ check_compile_time(sizeof(DNSHist) <= 512); check_compile_time(countof_field(DNSHist, unansweredQuerySendCountBins) == (kQueryStatsMaxQuerySendCount + 1)); check_compile_time(countof_field(DNSHist, answeredQuerySendCountBins) == (kQueryStatsMaxQuerySendCount + 1)); check_compile_time(countof_field(DNSHist, negAnsweredQuerySendCountBins) == (kQueryStatsMaxQuerySendCount + 1)); +check_compile_time(countof_field(DNSHist, expiredAnswerStateBins) == (kQueryStatsExpiredAnswerStateCount)); // Important: Do not modify kResponseLatencyMsLimits because the code used to generate AWD reports expects the response // latency histogram bins to observe these time interval upper bounds. @@ -344,7 +347,7 @@ check_compile_time(sizeof(DNSMessageSizeStats) <= 132); mDNSlocal mStatus QueryStatsCreate(const char *inDomainStr, const char *inAltDomainStr, QueryNameTest_f inTest, mDNSBool inTerminal, QueryStats **outStats); mDNSlocal void QueryStatsFree(QueryStats *inStats); mDNSlocal void QueryStatsFreeList(QueryStats *inList); -mDNSlocal mStatus QueryStatsUpdate(QueryStats *inStats, int inType, const ResourceRecord *inRR, mDNSu32 inQuerySendCount, mDNSu32 inLatencyMs, mDNSBool inForCell); +mDNSlocal mStatus QueryStatsUpdate(QueryStats *inStats, int inType, const ResourceRecord *inRR, mDNSu32 inQuerySendCount, ExpiredAnswerMetric inExpiredAnswerState, mDNSu32 inLatencyMs, mDNSBool inForCell); mDNSlocal const char * QueryStatsGetDomainString(const QueryStats *inStats); mDNSlocal mDNSBool QueryStatsDomainTest(const QueryStats *inStats, const domainname *inQueryName); mDNSlocal mDNSBool QueryStatsHostnameTest(const QueryStats *inStats, const domainname *inQueryName); @@ -492,7 +495,7 @@ mStatus MetricsInit(void) // MetricsUpdateDNSQueryStats //=========================================================================================================================== -mDNSexport void MetricsUpdateDNSQueryStats(const domainname *inQueryName, mDNSu16 inType, const ResourceRecord *inRR, mDNSu32 inSendCount, mDNSu32 inLatencyMs, mDNSBool inForCell) +mDNSexport void MetricsUpdateDNSQueryStats(const domainname *inQueryName, mDNSu16 inType, const ResourceRecord *inRR, mDNSu32 inSendCount, ExpiredAnswerMetric inExpiredAnswerState, mDNSu32 inLatencyMs, mDNSBool inForCell) { QueryStats * stats; mDNSBool match; @@ -505,7 +508,7 @@ mDNSexport void MetricsUpdateDNSQueryStats(const domainname *inQueryName, mDNSu1 match = stats->test(stats, inQueryName); if (match) { - QueryStatsUpdate(stats, inType, inRR, inSendCount, inLatencyMs, inForCell); + QueryStatsUpdate(stats, inType, inRR, inSendCount, inExpiredAnswerState, inLatencyMs, inForCell); if (stats->terminal) break; } } @@ -839,7 +842,7 @@ mDNSlocal void QueryStatsFreeList(QueryStats *inList) // QueryStatsUpdate //=========================================================================================================================== -mDNSlocal mStatus QueryStatsUpdate(QueryStats *inStats, int inType, const ResourceRecord *inRR, mDNSu32 inQuerySendCount, mDNSu32 inLatencyMs, mDNSBool inForCell) +mDNSlocal mStatus QueryStatsUpdate(QueryStats *inStats, int inType, const ResourceRecord *inRR, mDNSu32 inQuerySendCount, ExpiredAnswerMetric inExpiredAnswerState, mDNSu32 inLatencyMs, mDNSBool inForCell) { mStatus err; DNSHistSet * set; @@ -892,6 +895,7 @@ mDNSlocal mStatus QueryStatsUpdate(QueryStats *inStats, int inType, const Resour for (i = 0; (i < (int)countof(kResponseLatencyMsLimits)) && (inLatencyMs >= kResponseLatencyMsLimits[i]); ++i) {} increment_saturate(hist->unansweredQueryDurationBins[i], UINT16_MAX); } + increment_saturate(hist->expiredAnswerStateBins[Min(inExpiredAnswerState, (kQueryStatsExpiredAnswerStateCount-1))], UINT16_MAX); err = mStatus_NoError; exit: @@ -2061,6 +2065,7 @@ mDNSlocal mStatus CreateAWDDNSDomainStats(DNSHist *inHist, const char *inDomain, size_t binCount; uint32_t sendCountBins[kQueryStatsSendCountBinCount]; uint32_t latencyBins[kQueryStatsLatencyBinCount]; + uint32_t expiredAnswerBins[kQueryStatsExpiredAnswerStateCount]; awdStats = [[AWDDNSDomainStatsSoft alloc] init]; require_action_quiet(awdStats, exit, err = mStatus_UnknownErr); @@ -2107,6 +2112,11 @@ mDNSlocal mStatus CreateAWDDNSDomainStats(DNSHist *inHist, const char *inDomain, binCount = CopyHistogramBins(latencyBins, inHist->unansweredQueryDurationBins, kQueryStatsLatencyBinCount); [awdStats setUnansweredQueryDurationMs:latencyBins count:(NSUInteger)binCount]; } + + // Expired answers states + + binCount = CopyHistogramBins(expiredAnswerBins, inHist->expiredAnswerStateBins, kQueryStatsExpiredAnswerStateCount); + [awdStats setExpiredAnswerStates:expiredAnswerBins count:(NSUInteger)binCount]; *outStats = awdStats; awdStats = nil; @@ -2166,6 +2176,9 @@ mDNSlocal void LogDNSHist(const DNSHist *inHist, const char *inDomain, mDNSBool LogMsgNoIdent("Answered questions %4u", totalAnswered); LogMsgNoIdent("Negatively answered questions %4u", totalNegAnswered); LogMsgNoIdent("Unanswered questions %4u", totalUnanswered); + LogMsgNoIdent("Expired - no cached answer %4u", inHist->expiredAnswerStateBins[ExpiredAnswer_Allowed]); + LogMsgNoIdent("Expired - answered from cache %4u", inHist->expiredAnswerStateBins[ExpiredAnswer_AnsweredWithExpired]); + LogMsgNoIdent("Expired - cache changed %4u", inHist->expiredAnswerStateBins[ExpiredAnswer_ExpiredAnswerChanged]); LogMsgNoIdent("-- Query send counts ---------"); LogDNSHistSendCounts(inHist->answeredQuerySendCountBins); LogMsgNoIdent("-- Query send counts (NAQs) --"); diff --git a/mDNSResponder/mDNSMacOSX/Private/com.apple.mDNSResponder.plist b/mDNSResponder/mDNSMacOSX/Private/com.apple.mDNSResponder.plist deleted file mode 100644 index 6d403b52..00000000 --- a/mDNSResponder/mDNSMacOSX/Private/com.apple.mDNSResponder.plist +++ /dev/null @@ -1,19 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> -<plist version="1.0"> -<dict> - <key>DEFAULT-OPTIONS</key> - <dict> - <key>Default-Privacy-Setting</key> - <string>Public</string> - <key>Level</key> - <dict> - <key>Persist</key> - <string>Inherit</string> - <key>Enable</key> - <string>Inherit</string> - </dict> - </dict> -</dict> -</plist> - diff --git a/mDNSResponder/mDNSMacOSX/Scripts/bonjour-mcast-diagnose b/mDNSResponder/mDNSMacOSX/Scripts/bonjour-mcast-diagnose new file mode 100755 index 00000000..bda53ba8 --- /dev/null +++ b/mDNSResponder/mDNSMacOSX/Scripts/bonjour-mcast-diagnose @@ -0,0 +1,380 @@ +#! /bin/bash +# +# Copyright (c) 2017-2018 Apple Inc. All rights reserved. +# +# This script is currently for Apple Internal use only. +# + +version=1.4 +script=${BASH_SOURCE[0]} +dnssdutil=${dnssdutil:-dnssdutil} + +#============================================================================================================================ +# PrintUsage +#============================================================================================================================ + +PrintUsage() +{ + echo "" + echo "Usage: $( basename "${script}" ) [options]" + echo "" + echo "Options:" + echo " -V Display version of this script and exit." + echo "" +} + +#============================================================================================================================ +# LogOut +#============================================================================================================================ + +LogOut() +{ + echo "$( date '+%Y-%m-%d %H:%M:%S%z' ): $*" +} + +#============================================================================================================================ +# LogMsg +#============================================================================================================================ + +LogMsg() +{ + echo "$*" + if [ -d "${workPath}" ]; then + LogOut "$*" >> "${workPath}/log.txt" + fi +} + +#============================================================================================================================ +# ErrQuit +#============================================================================================================================ + +ErrQuit() +{ + echo "error: $*" + exit 1 +} + +#============================================================================================================================ +# SignalHandler +#============================================================================================================================ + +SignalHandler() +{ + LogMsg "Exiting due to signal." + trap '' SIGINT SIGTERM + pkill -TERM -P $$ + wait + exit 2 +} + +#============================================================================================================================ +# ExitHandler +#============================================================================================================================ + +ExitHandler() +{ + if [ -d "${tempPath}" ]; then + rm -fr "${tempPath}" + fi +} + +#============================================================================================================================ +# RunNetStat +#============================================================================================================================ + +RunNetStat() +{ + LogMsg "Running netstat -g -n -s" + netstat -g -n -s &> "${workPath}/netstat-g-n-s.txt" +} + +#============================================================================================================================ +# StartPacketCapture +#============================================================================================================================ + +StartPacketCapture() +{ + LogMsg "Starting tcpdump." + tcpdump -n -w "${workPath}/tcpdump.pcapng" &> "${workPath}/tcpdump.txt" & + tcpdumpPID=$! +} + +#============================================================================================================================ +# SaveExistingPacketCaptures +#============================================================================================================================ + +SaveExistingPacketCaptures() +{ + LogMsg "Saving existing mDNS packet captures." + mkdir "${workPath}/pcaps" + for file in /tmp/mdns-tcpdump.pcapng*; do + [ -e "${file}" ] || continue + baseName=$( sed -E 's/^mdns-tcpdump.pcapng([0-9]+)$/mdns-tcpdump-\1.pcapng/' <<< "$( basename ${file} )" ) + gzip < ${file} > "${workPath}/pcaps/${baseName}.gz" + done +} + +#============================================================================================================================ +# StopPacketCapture +#============================================================================================================================ + +StopPacketCapture() +{ + LogMsg "Stopping tcpdump." + kill -TERM ${tcpdumpPID} +} + +#============================================================================================================================ +# RunInterfaceMulticastTests +#============================================================================================================================ + +RunInterfaceMulticastTests() +{ + local ifname="$1" + local allHostsV4=224.0.0.1 + local allHostsV6=ff02::1 + local mDNSV4=224.0.0.251 + local mDNSV6=ff02::fb + local serviceList=( $( "${dnssdutil}" queryrecord -i "${ifname}" -A -t ptr -n _services._dns-sd._udp.local -l 6 | sed -E -n 's/.*(_.*_(tcp|udp)\.local\.)$/\1/p' | sort -u ) ) + local log="${workPath}/mcast-test-log-${ifname}.txt" + + LogOut "List of services: ${serviceList[*]}" >> "${log}" + # Ping All Hosts IPv4 multicast address. + + local routeOutput=$( route -n get -ifscope ${ifname} "${allHostsV4}" 2> /dev/null ) + if [ -n "${routeOutput}" ]; then + LogOut "Pinging "${allHostsV4}" on interface ${ifname}." >> "${log}" + ping -t 5 -b ${ifname} "${allHostsV4}" &> "${workPath}/ping-all-hosts-${ifname}.txt" + else + LogOut "No route to "${allHostsV4}" on interface ${ifname}." >> "${log}" + fi + + # Ping mDNS IPv4 multicast address. + + routeOutput=$( route -n get -ifscope ${ifname} "${mDNSV4}" 2> /dev/null ) + if [ -n "${routeOutput}" ]; then + LogOut "Pinging "${mDNSV4}" on interface ${ifname}." >> "${log}" + ping -t 5 -b ${ifname} "${mDNSV4}" &> "${workPath}/ping-mDNS-${ifname}.txt" + else + LogOut "No route to "${mDNSV4}" on interface ${ifname}." >> "${log}" + fi + + # Ping All Hosts IPv6 multicast address. + + routeOutput=$( route -n get -ifscope ${ifname} -inet6 "${allHostsV6}" 2> /dev/null ) + if [ -n "${routeOutput}" ]; then + LogOut "Pinging "${allHostsV6}" on interface ${ifname}." >> "${log}" + ping6 -c 6 -I ${ifname} "${allHostsV6}" &> "${workPath}/ping6-all-hosts-${ifname}.txt" + else + LogOut "No route to "${allHostsV6}" on interface ${ifname}." >> "${log}" + fi + + # Ping mDNS IPv6 multicast address. + + routeOutput=$( route -n get -ifscope ${ifname} -inet6 "${mDNSV6}" 2> /dev/null ) + if [ -n "${routeOutput}" ]; then + LogOut "Pinging "${mDNSV6}" on interface ${ifname}." >> "${log}" + ping6 -c 6 -I ${ifname} "${mDNSV6}" &> "${workPath}/ping6-mDNS-${ifname}.txt" + else + LogOut "No route to "${mDNSV6}" on interface ${ifname}." >> "${log}" + fi + + # Send mDNS queries for services. + + for service in "${serviceList[@]}"; do + LogOut "Sending mDNS queries for "${service}" on interface ${ifname}." >> "${log}" + for(( i = 1; i <= 3; ++i )); do + printf "\n" + "${dnssdutil}" mdnsquery -i "${ifname}" -n "${service}" -t ptr -r 2 + printf "\n" + "${dnssdutil}" mdnsquery -i "${ifname}" -n "${service}" -t ptr -r 1 --QU -p 5353 + printf "\n" + done >> "${workPath}/mdnsquery-${ifname}.txt" 2>&1 + done +} + +#============================================================================================================================ +# RunMulticastTests +#============================================================================================================================ + +RunMulticastTests() +{ + local interfaces=( $( ifconfig -l -u ) ) + local skipPrefixes=( ap awdl bridge ipsec lo p2p pdp_ip pktap UDC utun ) + local ifname="" + local pid="" + local pids=() + + LogMsg "List of interfaces: ${interfaces[*]}" + for ifname in "${interfaces[@]}"; do + local skip=false + for prefix in ${skipPrefixes[@]}; do + if [[ ${ifname} =~ ^${prefix}[0-9]*$ ]]; then + skip=true + break + fi + done + + if [ "${skip}" != "true" ]; then + ifconfig ${ifname} | grep -q inet + if [ $? -ne 0 ]; then + skip=true + fi + fi + + if [ "${skip}" == "true" ]; then + continue + fi + + LogMsg "Starting interface multicast tests for ${ifname}." + RunInterfaceMulticastTests "${ifname}" & pids+=($!) + done + + LogMsg "Waiting for interface multicast tests to complete..." + for pid in "${pids[@]}"; do + wait "${pid}" + done + LogMsg "All interface multicast tests completed." +} + +#============================================================================================================================ +# RunBrowseTest +#============================================================================================================================ + +RunBrowseTest() +{ + LogMsg "Running dnssdutil browseAll command." + "${dnssdutil}" browseAll -A -d local -b 10 -c 10 &> "${workPath}/browseAll.txt" +} + +#============================================================================================================================ +# IsMacOS +#============================================================================================================================ + +IsMacOS() +{ + [[ $( sw_vers -productName ) =~ ^Mac\ OS ]] +} + +#============================================================================================================================ +# ArchiveLogs +#============================================================================================================================ + +ArchiveLogs() +{ + local workdir=$( basename "${workPath}" ) + local archivePath="${dstPath}/${workdir}.tar.gz" + + LogMsg "Archiving logs." + echo "---" + tar -C "${tempPath}" -czf "${archivePath}" "${workdir}" + if [ -e "${archivePath}" ]; then + echo "Created log archive at ${archivePath}" + echo "*** Please run sysdiagnose NOW. ***" + echo "Attach both the log archive and the sysdiagnose archive to the radar." + if IsMacOS; then + open "${dstPath}" + fi + else + echo "Failed to create archive at ${archivePath}." + fi + echo "---" +} + +#============================================================================================================================ +# CreateWorkDirName +#============================================================================================================================ + +CreateWorkDirName() +{ + local suffix="" + local productName=$( sw_vers -productName ) + if [ -n "${productName}" ]; then + suffix+="_${productName}" + fi + + local model="" + if IsMacOS; then + model=$( sysctl -n hw.model ) + model=${model//,/-} + else + model=$( gestalt_query -undecorated DeviceName ) + fi + if [ -n "${model}" ]; then + suffix+="_${model}" + fi + + local buildVersion=$( sw_vers -buildVersion ) + if [ -n "${buildVersion}" ]; then + suffix+="_${buildVersion}" + fi + + suffix=${suffix//[^A-Za-z0-9._-]/_} + + printf "bonjour-mcast-diags_$( date '+%Y.%m.%d_%H-%M-%S%z' )${suffix}" +} + +#============================================================================================================================ +# main +#============================================================================================================================ + +main() +{ + while getopts ":hV" option; do + case "${option}" in + h) + PrintUsage + exit 0 + ;; + V) + echo "$( basename "${script}" ) version ${version}" + exit 0 + ;; + :) + ErrQuit "option '${OPTARG}' requires an argument." + ;; + *) + ErrQuit "unknown option '${OPTARG}'." + ;; + esac + done + + [ "${OPTIND}" -gt "$#" ] || ErrQuit "unexpected argument \""${!OPTIND}"\"." + + if IsMacOS; then + if [ "${EUID}" -ne 0 ]; then + echo "Re-launching with sudo" + exec sudo ${script} + fi + dstPath=/var/tmp + else + [ "${EUID}" -eq 0 ] || ErrQuit "$( basename "${script}" ) needs to be run as root." + dstPath=/var/mobile/Library/Logs/CrashReporter + fi + + tempPath=$( mktemp -d -q ) || ErrQuit "Failed to make temp directory." + workPath="${tempPath}/$( CreateWorkDirName )" + mkdir "${workPath}" || ErrQuit "Failed to make work directory." + + trap SignalHandler SIGINT SIGTERM + trap ExitHandler EXIT + + LogMsg "About: $( basename "${script}" ) version ${version} ($( md5 -q ${script} ))." + if [ "${dnssdutil}" != "dnssdutil" ]; then + if [ -x "$( which "${dnssdutil}" )" ]; then + LogMsg "Using $( "${dnssdutil}" -V ) at $( which "${dnssdutil}" )." + else + LogMsg "WARNING: dnssdutil (${dnssdutil}) isn't an executable." + fi + fi + + RunNetStat + StartPacketCapture + SaveExistingPacketCaptures + RunBrowseTest + RunMulticastTests + StopPacketCapture + ArchiveLogs +} + +main "$@" diff --git a/mDNSResponder/mDNSMacOSX/Scripts/bonjour-start-mdns-tcpdump b/mDNSResponder/mDNSMacOSX/Scripts/bonjour-start-mdns-tcpdump new file mode 100755 index 00000000..2a81b5f3 --- /dev/null +++ b/mDNSResponder/mDNSMacOSX/Scripts/bonjour-start-mdns-tcpdump @@ -0,0 +1,56 @@ +#! /bin/bash +# +# Copyright (c) 2018 Apple Inc. All rights reserved. +# +# This script is currently for Apple Internal use only. +# + +version=1.0 +script=${BASH_SOURCE[0]} + +#============================================================================================================================ +# PrintUsage +#============================================================================================================================ + +PrintUsage() +{ + echo "" + echo "Usage: $( basename "${script}" ) [options]" + echo "" + echo "Options:" + echo " -V Display version of this script and exit." + echo "" +} + +#============================================================================================================================ +# main +#============================================================================================================================ + +main() +{ + while getopts ":hV" option; do + case "${option}" in + h) + PrintUsage + exit 0 + ;; + V) + echo "$( basename "${script}" ) version ${version}" + exit 0 + ;; + :) + ErrQuit "option '${OPTARG}' requires an argument." + ;; + *) + ErrQuit "unknown option '${OPTARG}'." + ;; + esac + done + + [ "${OPTIND}" -gt "$#" ] || ErrQuit "unexpected argument \""${!OPTIND}"\"." + + launchctl load /Library/LaunchDaemons/com.apple.mDNSResponder.mdns-tcpdump.plist + launchctl start com.apple.mDNSResponder.mdns-tcpdump +} + +main "$@" diff --git a/mDNSResponder/mDNSMacOSX/Scripts/com.apple.mDNSResponder.mdns-tcpdump.plist b/mDNSResponder/mDNSMacOSX/Scripts/com.apple.mDNSResponder.mdns-tcpdump.plist new file mode 100644 index 00000000..0e48c217 --- /dev/null +++ b/mDNSResponder/mDNSMacOSX/Scripts/com.apple.mDNSResponder.mdns-tcpdump.plist @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>Label</key> + <string>com.apple.mDNSResponder.mdns-tcpdump</string> + <key>ProgramArguments</key> + <array> + <string>/usr/sbin/tcpdump</string> + <string>-w</string> + <string>/tmp/mdns-tcpdump.pcapng</string> + <string>-C</string> + <string>10</string> + <string>-W</string> + <string>16</string> + <string>( udp port 5353 ) or arp or icmp or icmp6</string> + </array> + <key>KeepAlive</key> + <false/> +</dict> +</plist> diff --git a/mDNSResponder/mDNSMacOSX/daemon.c b/mDNSResponder/mDNSMacOSX/daemon.c index fa192b6a..e16f1dbf 100644 --- a/mDNSResponder/mDNSMacOSX/daemon.c +++ b/mDNSResponder/mDNSMacOSX/daemon.c @@ -62,6 +62,7 @@ static os_log_t log_general = NULL; #define kPreferencesKey_DebugLogging CFSTR("DebugLogging") #define kPreferencesKey_UnicastPacketLogging CFSTR("UnicastPacketLogging") #define kPreferencesKey_AlwaysAppendSearchDomains CFSTR("AlwaysAppendSearchDomains") +#define kPreferencesKey_EnableAllowExpired CFSTR("EnableAllowExpired") #define kPreferencesKey_NoMulticastAdvertisements CFSTR("NoMulticastAdvertisements") #define kPreferencesKey_StrictUnicastOrdering CFSTR("StrictUnicastOrdering") #define kPreferencesKey_OfferSleepProxyService CFSTR("OfferSleepProxyService") @@ -84,13 +85,13 @@ static os_log_t log_general = NULL; static mDNS_PlatformSupport PlatformStorage; -// Start off with a default cache of 32K (141 records of 232 bytes each) -// Each time we grow the cache we add another 141 records -// 141 * 232 = 32712 bytes. -// This fits in eight 4kB pages, with 56 bytes spare for memory block headers and similar overhead +// Start off with a default cache of 32K (136 records of 240 bytes each) +// Each time we grow the cache we add another 136 records +// 136 * 240 = 32640 bytes. +// This fits in eight 4kB pages, with 128 bytes spare for memory block headers and similar overhead #define RR_CACHE_SIZE ((32*1024) / sizeof(CacheRecord)) static CacheEntity rrcachestorage[RR_CACHE_SIZE]; -struct CompileTimeAssertionChecks_RR_CACHE_SIZE { char a[(RR_CACHE_SIZE >= 141) ? 1 : -1]; }; +struct CompileTimeAssertionChecks_RR_CACHE_SIZE { char a[(RR_CACHE_SIZE >= 136) ? 1 : -1]; }; #define kRRCacheGrowSize (sizeof(CacheEntity) * RR_CACHE_SIZE) @@ -107,6 +108,7 @@ static mDNSBool NoMulticastAdvertisements = mDNSfalse; // By default, advertise extern mDNSBool StrictUnicastOrdering; extern mDNSBool AlwaysAppendSearchDomains; +extern mDNSBool EnableAllowExpired; #if ENABLE_BLE_TRIGGERED_BONJOUR extern mDNSBool EnableBLEBasedDiscovery; @@ -571,7 +573,7 @@ mDNSexport void mDNSPlatformLogToFile(int log_level, const char *buffer) if (!log_general) os_log_error(OS_LOG_DEFAULT, "Could NOT create log handle in init_logging()"); else - os_log_with_type(log_general, log_level, "%s", buffer); + os_log_with_type(log_general, log_level, "%{private}s", buffer); } @@ -652,6 +654,7 @@ mDNSlocal void SignalCallback(CFMachPortRef port, void *msg, CFIndex size, void mDNS_Lock(m); FORALL_CACHERECORDS(slot, cg, rr) { + rr->resrec.mortality = Mortality_Mortal; mDNS_PurgeCacheResourceRecord(m, rr); } // Restart unicast and multicast queries @@ -763,7 +766,8 @@ mDNSlocal void SignalDispatch(dispatch_source_t source) mDNS_Lock(m); FORALL_CACHERECORDS(slot, cg, rr) { - mDNS_PurgeCacheResourceRecord(m, rr); + rr->resrec.mortality = Mortality_Mortal; + mDNS_PurgeCacheResourceRecord(m, rr); } // Restart unicast and multicast queries mDNSCoreRestartQueries(m); @@ -1528,6 +1532,7 @@ mDNSexport int main(int argc, char **argv) UseInternalSleepProxy = (i+1<argc && mDNSIsDigit(argv[i+1][0]) && argv[i+1][1]==0) ? atoi(argv[++i]) : 1; if (!strcasecmp(argv[i], "-StrictUnicastOrdering" )) StrictUnicastOrdering = mDNStrue; if (!strcasecmp(argv[i], "-AlwaysAppendSearchDomains")) AlwaysAppendSearchDomains = mDNStrue; + if (!strcasecmp(argv[i], "-DisableAllowExpired" )) EnableAllowExpired = mDNSfalse; #if DEBUG if (!strcasecmp(argv[i], "-UseDebugSocket")) useDebugSocket = mDNStrue; if (!strcasecmp(argv[i], "-NoSandbox")) useSandbox = mDNSfalse; @@ -1568,6 +1573,7 @@ mDNSexport int main(int argc, char **argv) NoMulticastAdvertisements = PreferencesGetValueBool(kPreferencesKey_NoMulticastAdvertisements, NoMulticastAdvertisements); StrictUnicastOrdering = PreferencesGetValueBool(kPreferencesKey_StrictUnicastOrdering, StrictUnicastOrdering); AlwaysAppendSearchDomains = PreferencesGetValueBool(kPreferencesKey_AlwaysAppendSearchDomains, AlwaysAppendSearchDomains); + EnableAllowExpired = PreferencesGetValueBool(kPreferencesKey_EnableAllowExpired, EnableAllowExpired); OfferSleepProxyService = PreferencesGetValueInt(kPreferencesKey_OfferSleepProxyService, OfferSleepProxyService); UseInternalSleepProxy = PreferencesGetValueInt(kPreferencesKey_UseInternalSleepProxy, UseInternalSleepProxy); diff --git a/mDNSResponder/mDNSMacOSX/helper-stubs.c b/mDNSResponder/mDNSMacOSX/helper-stubs.c index a1e804fd..c7c34968 100644 --- a/mDNSResponder/mDNSMacOSX/helper-stubs.c +++ b/mDNSResponder/mDNSMacOSX/helper-stubs.c @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 4 -*- * - * Copyright (c) 2007-2015 Apple Inc. All rights reserved. + * Copyright (c) 2007-2018 Apple Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -55,10 +55,10 @@ static int64_t maxwait_secs = 5LL; //************************************************************************************************************* // Utility Functions -static void LogDebug(const char *prefix, xpc_object_t o) +static void HelperLog(const char *prefix, xpc_object_t o) { char *desc = xpc_copy_description(o); - mDNSHELPER_DEBUG("LogDebug %s: %s", prefix, desc); + mDNSHELPER_DEBUG("HelperLog %s: %s", prefix, desc); free(desc); } @@ -83,7 +83,7 @@ mDNSlocal int SendDict_ToServer(xpc_object_t msg) { __block int errorcode = kHelperErr_NoResponse; - LogDebug("SendDict_ToServer Sending msg to Daemon", msg); + HelperLog("SendDict_ToServer Sending msg to Daemon", msg); dispatch_semaphore_t sem = dispatch_semaphore_create(0); dispatch_retain(sem); // for the block below @@ -94,7 +94,7 @@ mDNSlocal int SendDict_ToServer(xpc_object_t msg) if (type == XPC_TYPE_DICTIONARY) { - LogDebug("SendDict_ToServer Received reply msg from Daemon", recv_msg); + HelperLog("SendDict_ToServer Received reply msg from Daemon", recv_msg); uint64_t reply_status = xpc_dictionary_get_uint64(recv_msg, kHelperReplyStatus); errorcode = xpc_dictionary_get_int64(recv_msg, kHelperErrCode); @@ -112,7 +112,7 @@ mDNSlocal int SendDict_ToServer(xpc_object_t msg) { LogMsg("SendDict_ToServer Received unexpected reply from daemon [%s]", xpc_dictionary_get_string(recv_msg, XPC_ERROR_KEY_DESCRIPTION)); - LogDebug("SendDict_ToServer Unexpected Reply contents", recv_msg); + HelperLog("SendDict_ToServer Unexpected Reply contents", recv_msg); } dispatch_semaphore_signal(sem); @@ -137,7 +137,7 @@ mDNSlocal xpc_object_t SendDict_GetReply(xpc_object_t msg) if (!dict) return NULL; xpc_retain(dict); - LogDebug("SendDict_GetReply Sending msg to Daemon", msg); + HelperLog("SendDict_GetReply Sending msg to Daemon", msg); dispatch_semaphore_t sem = dispatch_semaphore_create(0); dispatch_retain(sem); // for the block below @@ -148,7 +148,7 @@ mDNSlocal xpc_object_t SendDict_GetReply(xpc_object_t msg) if (type == XPC_TYPE_DICTIONARY) { - LogDebug("SendDict_GetReply Received reply msg from Daemon", recv_msg); + HelperLog("SendDict_GetReply Received reply msg from Daemon", recv_msg); uint64_t reply_status = xpc_dictionary_get_uint64(recv_msg, kHelperReplyStatus); switch (reply_status) @@ -171,7 +171,7 @@ mDNSlocal xpc_object_t SendDict_GetReply(xpc_object_t msg) { LogMsg("SendDict_GetReply Received unexpected reply from daemon [%s]", xpc_dictionary_get_string(recv_msg, XPC_ERROR_KEY_DESCRIPTION)); - LogDebug("SendDict_GetReply Unexpected Reply contents", recv_msg); + HelperLog("SendDict_GetReply Unexpected Reply contents", recv_msg); } dispatch_semaphore_signal(sem); diff --git a/mDNSResponder/mDNSMacOSX/helper.c b/mDNSResponder/mDNSMacOSX/helper.c index dc90b35d..7b6cb897 100644 --- a/mDNSResponder/mDNSMacOSX/helper.c +++ b/mDNSResponder/mDNSMacOSX/helper.c @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 4 -*- * - * Copyright (c) 2007-2015 Apple Inc. All rights reserved. + * Copyright (c) 2007-2018 Apple Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -710,7 +710,12 @@ fin: enum DNSKeyFormat { - formatNotDNSKey, formatDdnsTypeItem, formatDnsPrefixedServiceItem, formatBtmmPrefixedServiceItem + formatNotDNSKey, + formatDdnsTypeItem, + formatDnsPrefixedServiceItem, +#if MDNSRESPONDER_BTMM_SUPPORT + formatBtmmPrefixedServiceItem +#endif }; // On Mac OS X on Intel, the four-character string seems to be stored backwards, at least sometimes. @@ -720,7 +725,9 @@ enum DNSKeyFormat #ifndef NO_SECURITYFRAMEWORK +#if MDNSRESPONDER_BTMM_SUPPORT static const char btmmprefix[] = "btmmdns:"; +#endif static const char dnsprefix[] = "dns:"; static const char ddns[] = "ddns"; static const char ddnsrev[] = "sndd"; @@ -778,8 +785,10 @@ static enum DNSKeyFormat getDNSKeyFormat(SecKeychainItemRef item, SecKeychainAtt } if (attributes->attr[1].length >= sizeof(dnsprefix)-1 && 0 == strncasecmp(attributes->attr[1].data, dnsprefix, sizeof(dnsprefix)-1)) format = formatDnsPrefixedServiceItem; +#if MDNSRESPONDER_BTMM_SUPPORT else if (attributes->attr[1].length >= sizeof(btmmprefix)-1 && 0 == strncasecmp(attributes->attr[1].data, btmmprefix, sizeof(btmmprefix)-1)) format = formatBtmmPrefixedServiceItem; +#endif else if (attributes->attr[0].length == sizeof(ddns)-1 && 0 == strncasecmp(attributes->attr[0].data, ddns, sizeof(ddns)-1)) format = formatDdnsTypeItem; else if (attributes->attr[0].length == sizeof(ddnsrev)-1 && 0 == strncasecmp(attributes->attr[0].data, ddnsrev, sizeof(ddnsrev)-1)) @@ -821,7 +830,9 @@ static CFPropertyListRef copyKeychainItemInfo(SecKeychainItemRef item, SecKeycha data = CFDataCreate(kCFAllocatorDefault, attributes->attr[1].data, attributes->attr[1].length); break; case formatDnsPrefixedServiceItem: +#if MDNSRESPONDER_BTMM_SUPPORT case formatBtmmPrefixedServiceItem: +#endif data = CFDataCreate(kCFAllocatorDefault, attributes->attr[1].data, attributes->attr[1].length); break; default: diff --git a/mDNSResponder/mDNSMacOSX/mDNSMacOSX.c b/mDNSResponder/mDNSMacOSX/mDNSMacOSX.c index 3bb4ec69..f64e28af 100644 --- a/mDNSResponder/mDNSMacOSX/mDNSMacOSX.c +++ b/mDNSResponder/mDNSMacOSX/mDNSMacOSX.c @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 4 -*- * - * Copyright (c) 2002-2016 Apple Inc. All rights reserved. + * Copyright (c) 2002-2018 Apple Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -86,22 +86,22 @@ #include <SystemConfiguration/SCPrivate.h> #if TARGET_OS_IPHONE -// For WiFiManagerClientRef etc, declarations. -#include <MobileGestalt.h> -#include <MobileWiFi/WiFiManagerClient.h> +#include <MobileWiFi/WiFiManagerClient.h> // For WiFiManagerClientRef etc, declarations. #include <dlfcn.h> +#include <os/variant_private.h> // For os_variant_has_internal_diagnostics(). #endif // TARGET_OS_IPHONE // Include definition of opaque_presence_indication for KEV_DL_NODE_PRESENCE handling logic. #include <Kernel/IOKit/apple80211/apple80211_var.h> #include <network_information.h> // for nwi_state -#if APPLE_OSX_mDNSResponder +#if MDNSRESPONDER_BTMM_SUPPORT #include <AWACS.h> +#endif + +#if APPLE_OSX_mDNSResponder #include <ne_session.h> // for ne_session_set_socket_attributes() -#else -#define NO_AWACS 1 -#endif // APPLE_OSX_mDNSResponder +#endif #if APPLE_OSX_mDNSResponder && !TARGET_OS_EMBEDDED #include <IOKit/platform/IOPlatformSupportPrivate.h> @@ -153,9 +153,11 @@ static CFStringRef NetworkChangedKey_Computername; static CFStringRef NetworkChangedKey_DNS; static CFStringRef NetworkChangedKey_StateInterfacePrefix; static CFStringRef NetworkChangedKey_DynamicDNS = CFSTR("Setup:/Network/DynamicDNS"); +static CFStringRef NetworkChangedKey_PowerSettings = CFSTR("State:/IOKit/PowerManagement/CurrentSettings"); +#if MDNSRESPONDER_BTMM_SUPPORT static CFStringRef NetworkChangedKey_BackToMyMac = CFSTR("Setup:/Network/BackToMyMac"); static CFStringRef NetworkChangedKey_BTMMConnectivity = CFSTR("State:/Network/Connectivity"); -static CFStringRef NetworkChangedKey_PowerSettings = CFSTR("State:/IOKit/PowerManagement/CurrentSettings"); +#endif static char HINFO_HWstring_buffer[32]; static char *HINFO_HWstring = "Device"; @@ -794,8 +796,8 @@ mDNSexport mStatus mDNSPlatformSendUDP(const mDNS *const m, const void *const ms s, InterfaceID, ifa_name, dst->type, dst, mDNSVal16(dstPort), s, err, sendto_errno, strerror(sendto_errno), (mDNSu32)(m->timenow)); if (!mDNSAddressIsAllDNSLinkGroup(dst)) { - if (sendto_errno == EHOSTUNREACH) return(mStatus_HostUnreachErr); - if (sendto_errno == EHOSTDOWN || sendto_errno == ENETDOWN || sendto_errno == ENETUNREACH) return(mStatus_TransientErr); + if ((sendto_errno == EHOSTUNREACH) || (sendto_errno == ENETUNREACH)) return(mStatus_HostUnreachErr); + if ((sendto_errno == EHOSTDOWN) || (sendto_errno == ENETDOWN)) return(mStatus_TransientErr); } // Don't report EHOSTUNREACH in the first three minutes after boot // This is because mDNSResponder intentionally starts up early in the boot process (See <rdar://problem/3409090>) @@ -3310,6 +3312,40 @@ mDNSlocal u_int64_t getExtendedFlags(char * ifa_name) return ifr.ifr_eflags; } +#if TARGET_OS_OSX +// IFRTYPE_FUNCTIONAL_INTCOPROC type interfaces on macOS do not support Bonjour discovery. +mDNSlocal mDNSBool isCoprocessorInterface(int sockFD, char * ifa_name) +{ + struct ifreq ifr; + + if (sockFD < 0) + { + LogMsg("isCoprocessorInterface: invalid socket FD passed: %d", sockFD); + return mDNSfalse; + } + + memset(&ifr, 0, sizeof(struct ifreq)); + strlcpy(ifr.ifr_name, ifa_name, sizeof(ifr.ifr_name)); + + if (ioctl(sockFD, SIOCGIFFUNCTIONALTYPE, (caddr_t)&ifr) == -1) + { + LogMsg("isCoprocessorInterface: SIOCGIFFUNCTIONALTYPE failed, errno = %d (%s)", errno, strerror(errno)); + return mDNSfalse; + } + + if (ifr.ifr_functional_type == IFRTYPE_FUNCTIONAL_INTCOPROC) + { + LogMsg("isCoprocessorInterface: %s marked as coprocessor interface", ifa_name); + return mDNStrue; + } + else + return mDNSfalse; +} + +#else // TARGET_OS_OSX +#define isCoprocessorInterface(A, B) mDNSfalse +#endif // TARGET_OS_OSX + #if TARGET_OS_IPHONE // Function pointers for the routines we use in the MobileWiFi framework. @@ -3499,7 +3535,17 @@ mDNSlocal NetworkInterfaceInfoOSX *AddInterfaceToList(struct ifaddrs *ifa, mDNSs // we get the corresponding name for the interface index on which the packet was received and check against // the InterfaceList for a matching name. So, keep the name in sync strlcpy((*p)->ifinfo.ifname, ifa->ifa_name, sizeof((*p)->ifinfo.ifname)); - (*p)->Exists = mDNStrue; + + // Determine if multicast state has changed. + const mDNSBool txrx = MulticastInterface(*p); + if ((*p)->ifinfo.McastTxRx != txrx) + { + (*p)->ifinfo.McastTxRx = txrx; + (*p)->Exists = MulticastStateChanged; // State change; need to deregister and reregister this interface + } + else + (*p)->Exists = mDNStrue; + // If interface was not in getifaddrs list last time we looked, but it is now, update 'AppearanceTime' for this record if ((*p)->LastSeen != utc) (*p)->AppearanceTime = utc; @@ -3539,7 +3585,6 @@ mDNSlocal NetworkInterfaceInfoOSX *AddInterfaceToList(struct ifaddrs *ifa, mDNSs // We can be configured to disable multicast advertisement, but we want to to support // local-only services, which need a loopback address record. i->ifinfo.Advertise = m->DivertMulticastAdvertisements ? ((ifa->ifa_flags & IFF_LOOPBACK) ? mDNStrue : mDNSfalse) : m->AdvertiseLocalAddresses; - i->ifinfo.McastTxRx = mDNSfalse; // For now; will be set up later at the end of UpdateInterfaceList i->ifinfo.Loopback = ((ifa->ifa_flags & IFF_LOOPBACK) != 0) ? mDNStrue : mDNSfalse; i->ifinfo.IgnoreIPv4LL = ((eflags & IFEF_ARPLL) != 0) ? mDNSfalse : mDNStrue; @@ -3566,6 +3611,7 @@ mDNSlocal NetworkInterfaceInfoOSX *AddInterfaceToList(struct ifaddrs *ifa, mDNSs LogInfo("AddInterfaceToList: D2DInterface set for %s", ifa->ifa_name); i->isExpensive = (eflags & IFEF_EXPENSIVE) ? mDNStrue: mDNSfalse; + i->isAWDL = (eflags & IFEF_AWDL) ? mDNStrue: mDNSfalse; if (eflags & IFEF_AWDL) { // Set SupportsUnicastMDNSResponse false for the AWDL interface since unicast reserves @@ -3590,6 +3636,8 @@ mDNSlocal NetworkInterfaceInfoOSX *AddInterfaceToList(struct ifaddrs *ifa, mDNSs i->BPF_len = 0; i->Registered = mDNSNULL; + // MulticastInterface() depends on the "m" and "ifa_flags" values being initialized above. + i->ifinfo.McastTxRx = MulticastInterface(i); // Do this AFTER i->BSSID has been set up i->ifinfo.NetWake = (eflags & IFEF_EXPENSIVE)? mDNSfalse : NetWakeInterface(i); GetMAC(&i->ifinfo.MAC, scope_id); @@ -4827,14 +4875,14 @@ mDNSlocal mStatus UpdateInterfaceList(mDNSs32 utc) mDNSPlatformMemCopy(m->PrimaryMAC.b, sdl->sdl_data + sdl->sdl_nlen, 6); } - if (ifa->ifa_flags & IFF_UP && ifa->ifa_addr) + if (ifa->ifa_flags & IFF_UP && ifa->ifa_addr && !isCoprocessorInterface(InfoSocket, ifa->ifa_name)) if (ifa->ifa_addr->sa_family == AF_INET || ifa->ifa_addr->sa_family == AF_INET6) { if (!ifa->ifa_netmask) { mDNSAddr ip; SetupAddr(&ip, ifa->ifa_addr); - LogMsg("getifaddrs: ifa_netmask is NULL for %5s(%d) Flags %04X Family %2d %#a", + LogMsg("UpdateInterfaceList: ifa_netmask is NULL for %5s(%d) Flags %04X Family %2d %#a", ifa->ifa_name, if_nametoindex(ifa->ifa_name), ifa->ifa_flags, ifa->ifa_addr->sa_family, &ip); } // Apparently it's normal for the sa_family of an ifa_netmask to sometimes be zero, so we don't complain about that @@ -4843,7 +4891,7 @@ mDNSlocal mStatus UpdateInterfaceList(mDNSs32 utc) { mDNSAddr ip; SetupAddr(&ip, ifa->ifa_addr); - LogMsg("getifaddrs ifa_netmask for %5s(%d) Flags %04X Family %2d %#a has different family: %d", + LogMsg("UpdateInterfaceList: ifa_netmask for %5s(%d) Flags %04X Family %2d %#a has different family: %d", ifa->ifa_name, if_nametoindex(ifa->ifa_name), ifa->ifa_flags, ifa->ifa_addr->sa_family, &ip, ifa->ifa_netmask->sa_family); } // Currently we use a few internal ones like mDNSInterfaceID_LocalOnly etc. that are negative values (0, -1, -2). @@ -4900,19 +4948,6 @@ mDNSlocal mStatus UpdateInterfaceList(mDNSs32 utc) if (!foundav4 && v4Loopback) AddInterfaceToList(v4Loopback, utc); if (!foundav6 && v6Loopback) AddInterfaceToList(v6Loopback, utc); - // Now the list is complete, set the McastTxRx setting for each interface. - NetworkInterfaceInfoOSX *i; - for (i = m->p->InterfaceList; i; i = i->next) - if (i->Exists) - { - mDNSBool txrx = MulticastInterface(i); - if (i->ifinfo.McastTxRx != txrx) - { - i->ifinfo.McastTxRx = txrx; - i->Exists = MulticastStateChanged; // State change; need to deregister and reregister this interface - } - } - if (InfoSocket >= 0) close(InfoSocket); @@ -5234,7 +5269,7 @@ mDNSlocal int ClearInactiveInterfaces(mDNSs32 utc) if (!i->Exists) { if (i->LastSeen == utc) i->LastSeen = utc - 1; - mDNSBool delete = (NumCacheRecordsForInterfaceID(m, i->ifinfo.InterfaceID) == 0) && (utc - i->LastSeen >= 60); + const mDNSBool delete = (i->isAWDL || (NumCacheRecordsForInterfaceID(m, i->ifinfo.InterfaceID) == 0)) && (utc - i->LastSeen >= 60); LogInfo("ClearInactiveInterfaces: %-13s %5s(%lu) %.6a InterfaceID %p(%p) %#a/%d Age %d%s", delete ? "Deleting" : "Holding", i->ifinfo.ifname, i->scope_id, &i->BSSID, i->ifinfo.InterfaceID, i, &i->ifinfo.ip, CountMaskBits(&i->ifinfo.mask), utc - i->LastSeen, @@ -5818,6 +5853,7 @@ mDNSlocal void SetupDDNSDomains(domainname *const fqdn, DNameListElem **RegDomai } CFRelease(ddnsdict); } +#if MDNSRESPONDER_BTMM_SUPPORT if (RegDomains) { CFDictionaryRef btmm = SCDynamicStoreCopyValue(NULL, NetworkChangedKey_BackToMyMac); @@ -5847,7 +5883,7 @@ mDNSlocal void SetupDDNSDomains(domainname *const fqdn, DNameListElem **RegDomai CFRelease(btmm); } } - +#endif } // Returns mDNSfalse, if it does not set the configuration i.e., if the DNS configuration did not change @@ -6141,7 +6177,7 @@ mDNSexport void mDNSPlatformDynDNSHostNameStatusChanged(const domainname *const } } -#if APPLE_OSX_mDNSResponder +#if MDNSRESPONDER_BTMM_SUPPORT #if !NO_AWACS // checks whether a domain is present in Setup:/Network/BackToMyMac. Just because there is a key in the @@ -6283,7 +6319,7 @@ mDNSlocal void UpdateBTMMRelayConnection(mDNS *const m) else LogInfo("UpdateBTMMRelayConnection: Not calling AWS_Disconnect"); } } -#elif !TARGET_OS_EMBEDDED +#else mDNSlocal void UpdateBTMMRelayConnection(mDNS *const m) { (void) m; // Unused @@ -6291,11 +6327,9 @@ mDNSlocal void UpdateBTMMRelayConnection(mDNS *const m) } #endif // ! NO_AWACS -#if !TARGET_OS_EMBEDDED mDNSlocal void ProcessConndConfigChanges(void); -#endif -#endif // APPLE_OSX_mDNSResponder +#endif // MDNSRESPONDER_BTMM_SUPPORT // MUST be called holding the lock mDNSlocal void SetDomainSecrets_internal(mDNS *m) @@ -6369,11 +6403,13 @@ mDNSlocal void SetDomainSecrets_internal(mDNS *m) offset = 0; if (!strncmp(stringbuf, dnsprefix, strlen(dnsprefix))) offset = strlen(dnsprefix); +#if MDNSRESPONDER_BTMM_SUPPORT else if (!strncmp(stringbuf, btmmprefix, strlen(btmmprefix))) { AutoTunnel = mDNStrue; offset = strlen(btmmprefix); } +#endif domainname domain; if (!MakeDomainNameFromDNSNameString(&domain, stringbuf + offset)) { LogMsg("SetDomainSecrets: bad key domain %s", stringbuf); continue; } @@ -6555,7 +6591,9 @@ mDNSlocal void SetDomainSecrets_internal(mDNS *m) } UpdateAnonymousRacoonConfig(m); // Determine whether we need racoon to accept incoming connections +#if MDNSRESPONDER_BTMM_SUPPORT ProcessConndConfigChanges(); // Update AutoTunnelInnerAddress values and default ipsec policies as necessary +#endif } #endif // APPLE_OSX_mDNSResponder @@ -7236,8 +7274,9 @@ mDNSexport void RemoveAutoTunnel6Record(mDNS *const m) if (info->AutoTunnel) UpdateAutoTunnel6Record(m, info); } +#endif /* APPLE_OSX_mDNSResponder */ -#if !TARGET_OS_EMBEDDED +#if MDNSRESPONDER_BTMM_SUPPORT mDNSlocal mDNSBool IPv6AddressIsOnInterface(mDNSv6Addr ipv6Addr, char *ifname) { struct ifaddrs *ifa; @@ -7474,8 +7513,7 @@ mDNSlocal void ProcessConndConfigChanges(void) // If awacsd crashes or exits for some reason, restart it UpdateBTMMRelayConnection(m); } -#endif // !TARGET_OS_EMBEDDED -#endif /* APPLE_OSX_mDNSResponder */ +#endif // MDNSRESPONDER_BTMM_SUPPORT mDNSlocal mDNSBool IsAppleNetwork(mDNS *const m) { @@ -7580,9 +7618,11 @@ mDNSexport void mDNSMacOSXNetworkChanged(void) #if APPLE_OSX_mDNSResponder #if !TARGET_OS_EMBEDDED +#if MDNSRESPONDER_BTMM_SUPPORT mDNS_Lock(m); ProcessConndConfigChanges(); mDNS_Unlock(m); +#endif // Scan to find client tunnels whose questions have completed, // but whose local inner/outer addresses have changed since the tunnel was set up @@ -7806,14 +7846,18 @@ mDNSlocal void NetworkChanged(SCDynamicStoreRef store, CFArrayRef changedKeys, v //mDNSs32 delay = mDNSPlatformOneSecond * 2; // Start off assuming a two-second delay const mDNSs32 delay = (mDNSPlatformOneSecond + 39) / 40; // 25 ms delay - int c = CFArrayGetCount(changedKeys); // Count changes + const int c = CFArrayGetCount(changedKeys); // Count changes CFRange range = { 0, c }; - int c_host = (CFArrayContainsValue(changedKeys, range, NetworkChangedKey_Hostnames ) != 0); - int c_comp = (CFArrayContainsValue(changedKeys, range, NetworkChangedKey_Computername) != 0); - int c_udns = (CFArrayContainsValue(changedKeys, range, NetworkChangedKey_DNS ) != 0); - int c_ddns = (CFArrayContainsValue(changedKeys, range, NetworkChangedKey_DynamicDNS ) != 0); - int c_btmm = (CFArrayContainsValue(changedKeys, range, NetworkChangedKey_BackToMyMac ) != 0); - int c_v4ll = ChangedKeysHaveIPv4LL(changedKeys); + const int c_host = (CFArrayContainsValue(changedKeys, range, NetworkChangedKey_Hostnames ) != 0); + const int c_comp = (CFArrayContainsValue(changedKeys, range, NetworkChangedKey_Computername) != 0); + const int c_udns = (CFArrayContainsValue(changedKeys, range, NetworkChangedKey_DNS ) != 0); + const int c_ddns = (CFArrayContainsValue(changedKeys, range, NetworkChangedKey_DynamicDNS ) != 0); +#if MDNSRESPONDER_BTMM_SUPPORT + const int c_btmm = (CFArrayContainsValue(changedKeys, range, NetworkChangedKey_BackToMyMac ) != 0); +#else + const int c_btmm = 0; +#endif + const int c_v4ll = ChangedKeysHaveIPv4LL(changedKeys); int c_fast = 0; // Do immediate network changed processing for "p2p*" interfaces and @@ -7971,9 +8015,11 @@ mDNSlocal mStatus WatchForNetworkChanges(mDNS *const m) CFArrayAppendValue(keys, NetworkChangedKey_Computername); CFArrayAppendValue(keys, NetworkChangedKey_DNS); CFArrayAppendValue(keys, NetworkChangedKey_DynamicDNS); - CFArrayAppendValue(keys, NetworkChangedKey_BackToMyMac); CFArrayAppendValue(keys, NetworkChangedKey_PowerSettings); +#if MDNSRESPONDER_BTMM_SUPPORT + CFArrayAppendValue(keys, NetworkChangedKey_BackToMyMac); CFArrayAppendValue(keys, NetworkChangedKey_BTMMConnectivity); +#endif CFArrayAppendValue(patterns, pattern1); CFArrayAppendValue(patterns, pattern2); CFArrayAppendValue(patterns, CFSTR("State:/Network/Interface/[^/]+/AirPort")); @@ -8177,13 +8223,9 @@ mDNSlocal void removeCachedPeerRecords(mDNSu32 ifindex, mDNSAddr *ap, bool purge // Handle KEV_DL_NODE_PRESENCE event. mDNSlocal void nodePresence(struct kev_dl_node_presence * p) { - char buf[INET6_ADDRSTRLEN]; struct opaque_presence_indication *op = (struct opaque_presence_indication *) p->node_service_info; - if (inet_ntop(AF_INET6, & p->sin6_node_address.sin6_addr, buf, sizeof(buf))) - LogInfo("nodePresence: IPv6 address: %s, SUI %d", buf, op->SUI); - else - LogInfo("nodePresence: inet_ntop() error"); + LogInfo("nodePresence: IPv6 address: %.16a, SUI %d", p->sin6_node_address.sin6_addr.s6_addr, op->SUI); // AWDL will generate a KEV_DL_NODE_PRESENCE event with SSTH field of // all zeroes when a node is present and has no services registered. @@ -8203,17 +8245,11 @@ mDNSlocal void nodePresence(struct kev_dl_node_presence * p) mDNSlocal void nodeAbsence(struct kev_dl_node_absence * p) { mDNSAddr peerAddr; - char buf[INET6_ADDRSTRLEN]; - - if (inet_ntop(AF_INET6, & p->sin6_node_address.sin6_addr, buf, sizeof(buf))) - LogInfo("nodeAbsence: IPv6 address: %s", buf); - else - LogInfo("nodeAbsence: inet_ntop() error"); peerAddr.type = mDNSAddrType_IPv6; peerAddr.ip.v6 = *(mDNSv6Addr*)&p->sin6_node_address.sin6_addr; - LogInfo("nodeAbsence: immediately purge cached records from this peer"); + LogInfo("nodeAbsence: immediately purge cached records from %.16a", p->sin6_node_address.sin6_addr.s6_addr); removeCachedPeerRecords(p->sdl_node_address.sdl_index, & peerAddr, true); } @@ -8367,8 +8403,13 @@ mDNSlocal OSStatus KeychainChanged(SecKeychainEvent keychainEvent, SecKeychainCa if (!err) { relevant = ((a->attr[0].length == 4 && (!strncasecmp(a->attr[0].data, "ddns", 4) || !strncasecmp(a->attr[0].data, "sndd", 4))) || - (a->attr[1].length >= mDNSPlatformStrLen(dnsprefix) && (!strncasecmp(a->attr[1].data, dnsprefix, mDNSPlatformStrLen(dnsprefix)))) || - (a->attr[1].length >= mDNSPlatformStrLen(btmmprefix) && (!strncasecmp(a->attr[1].data, btmmprefix, mDNSPlatformStrLen(btmmprefix))))); + (a->attr[1].length >= mDNSPlatformStrLen(dnsprefix) && (!strncasecmp(a->attr[1].data, dnsprefix, mDNSPlatformStrLen(dnsprefix))))); +#if MDNSRESPONDER_BTMM_SUPPORT + if (!relevant && (a->attr[1].length >= mDNSPlatformStrLen(btmmprefix)) && !strncasecmp(a->attr[1].data, btmmprefix, mDNSPlatformStrLen(btmmprefix))) + { + relevant = mDNStrue; + } +#endif SecKeychainItemFreeAttributesAndData(a, NULL); } } @@ -9419,36 +9460,13 @@ mDNSlocal void CreatePTRRecord(const domainname *domain) // intentionally to avoid adding to the complexity of code handling /etc/hosts. mDNSlocal void SetupLocalHostRecords(void) { - char buffer[MAX_REVERSE_MAPPING_NAME]; domainname name; - int i; - struct in6_addr addr; - mDNSu8 *ptr = addr.__u6_addr.__u6_addr8; - if (inet_pton(AF_INET, "127.0.0.1", &addr) == 1) - { - mDNS_snprintf(buffer, sizeof(buffer), "%d.%d.%d.%d.in-addr.arpa.", - ptr[3], ptr[2], ptr[1], ptr[0]); - MakeDomainNameFromDNSNameString(&name, buffer); - CreatePTRRecord(&name); - } - else LogMsg("SetupLocalHostRecords: ERROR!! inet_pton AF_INET failed"); + MakeDomainNameFromDNSNameString(&name, "1.0.0.127.in-addr.arpa."); + CreatePTRRecord(&name); - if (inet_pton(AF_INET6, "::1", &addr) == 1) - { - for (i = 0; i < 16; i++) - { - static const char hexValues[] = "0123456789ABCDEF"; - buffer[i * 4 ] = hexValues[ptr[15 - i] & 0x0F]; - buffer[i * 4 + 1] = '.'; - buffer[i * 4 + 2] = hexValues[ptr[15 - i] >> 4]; - buffer[i * 4 + 3] = '.'; - } - mDNS_snprintf(&buffer[64], sizeof(buffer)-64, "ip6.arpa."); - MakeDomainNameFromDNSNameString(&name, buffer); - CreatePTRRecord(&name); - } - else LogMsg("SetupLocalHostRecords: ERROR!! inet_pton AF_INET6 failed"); + MakeDomainNameFromDNSNameString(&name, "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa."); + CreatePTRRecord(&name); } #if APPLE_OSX_mDNSResponder // Don't compile for dnsextd target @@ -9465,6 +9483,56 @@ mDNSlocal void setSameDomainLabelPointer(void); // 6) client calls to enumerate domains now go over LocalOnly interface // (!!!KRS may add outgoing interface in addition) +#if TARGET_OS_IPHONE +mDNSlocal mDNSBool IsAppleInternalBuild(void) +{ + return (os_variant_has_internal_diagnostics("com.apple.mDNSResponder") ? mDNStrue : mDNSfalse); +} + +mDNSlocal mStatus RegisterLocalOnlyAddressRecord(const domainname *const name, mDNSu16 type, const void *rdata, mDNSu16 rdlength) +{ + switch(type) + { + case kDNSType_A: + if (rdlength != 4) return (mStatus_BadParamErr); + break; + + case kDNSType_AAAA: + if (rdlength != 16) return (mStatus_BadParamErr); + break; + + default: + return (mStatus_BadParamErr); + } + + AuthRecord *rr = mallocL("etchosts", sizeof(*rr)); + if (!rr) return (mStatus_NoMemoryErr); + mDNSPlatformMemZero(rr, sizeof(*rr)); + + mDNS_SetupResourceRecord(rr, NULL, mDNSInterface_LocalOnly, type, 1, kDNSRecordTypeKnownUnique, AuthRecordLocalOnly, FreeEtcHosts, NULL); + AssignDomainName(&rr->namestorage, name); + mDNSPlatformMemCopy(rr->resrec.rdata->u.data, rdata, rdlength); + + const mStatus err = mDNS_Register_internal(&mDNSStorage, rr); + if (err) + { + LogMsg("RegisterLocalOnlyAddressRecord: mDNS_Register error %d registering %s", err, ARDisplayString(&mDNSStorage, rr)); + freeL("etchosts", rr); + } + return (err); +} + +mDNSlocal void RegisterLocalOnlyARecord(const domainname *const name, const mDNSv4Addr *const addr) +{ + RegisterLocalOnlyAddressRecord(name, kDNSType_A, addr->b, (mDNSu16)sizeof(mDNSv4Addr)); +} + +mDNSlocal void RegisterLocalOnlyAAAARecord(const domainname *const name, const mDNSv6Addr *const addr) +{ + RegisterLocalOnlyAddressRecord(name, kDNSType_AAAA, addr->b, (mDNSu16)sizeof(mDNSv6Addr)); +} +#endif + mDNSlocal mStatus mDNSPlatformInit_setup(mDNS *const m) { mStatus err; @@ -9694,7 +9762,41 @@ mDNSlocal mStatus mDNSPlatformInit_setup(mDNS *const m) #endif if (SSLqueue == mDNSNULL) LogMsg("dispatch_queue_create: SSL queue NULL"); - mDNSMacOSXUpdateEtcHosts(m); +#if TARGET_OS_IPHONE + // On device OSes (iOS, tvOS, watchOS, etc.), ignore /etc/hosts unless the OS is an internal build. When the /etc/hosts + // file is ignored, LocalOnly auth records will be registered for localhost and broadcasthost addresses contained in the + // standard /etc/hosts file: + // + // 127.0.0.1 localhost + // 255.255.255.255 broadcasthost + // ::1 localhost + + if (!IsAppleInternalBuild()) + { + const domainname *const localHostName = (const domainname *) "\x9" "localhost"; + const domainname *const broadcastHostName = (const domainname *) "\xd" "broadcasthost"; + const mDNSv4Addr localHostV4 = { { 127, 0, 0, 1 } }; + mDNSv6Addr localHostV6; + + // Register localhost 127.0.0.1 A record. + + RegisterLocalOnlyARecord(localHostName, &localHostV4); + + // Register broadcasthost 255.255.255.255 A record. + + RegisterLocalOnlyARecord(broadcastHostName, &onesIPv4Addr); + + // Register localhost ::1 AAAA record. + + mDNSPlatformMemZero(&localHostV6, sizeof(localHostV6)); + localHostV6.b[15] = 1; + RegisterLocalOnlyAAAARecord(localHostName, &localHostV6); + } + else +#endif + { + mDNSMacOSXUpdateEtcHosts(m); + } SetupLocalHostRecords(); return(mStatus_NoError); diff --git a/mDNSResponder/mDNSMacOSX/mDNSMacOSX.h b/mDNSResponder/mDNSMacOSX/mDNSMacOSX.h index 55c74c6c..f189b07f 100644 --- a/mDNSResponder/mDNSMacOSX/mDNSMacOSX.h +++ b/mDNSResponder/mDNSMacOSX/mDNSMacOSX.h @@ -153,6 +153,7 @@ struct NetworkInterfaceInfoOSX_struct int BPF_mcfd; // Socket for our IPv6 ND group membership u_int BPF_len; mDNSBool isExpensive; // True if this interface has the IFEF_EXPENSIVE flag set. + mDNSBool isAWDL; // True if this interface has the IFEF_AWDL flag set. #ifdef MDNSRESPONDER_USES_LIB_DISPATCH_AS_PRIMARY_EVENT_LOOP_MECHANISM dispatch_source_t BPF_source; #else @@ -272,7 +273,7 @@ struct CompileTimeAssertionChecks_mDNSMacOSX // Check our structures are reasonable sizes. Including overly-large buffers, or embedding // other overly-large structures instead of having a pointer to them, can inadvertently // cause structure sizes (and therefore memory usage) to balloon unreasonably. - char sizecheck_NetworkInterfaceInfoOSX[(sizeof(NetworkInterfaceInfoOSX) <= 7464) ? 1 : -1]; + char sizecheck_NetworkInterfaceInfoOSX[(sizeof(NetworkInterfaceInfoOSX) <= 8488) ? 1 : -1]; char sizecheck_mDNS_PlatformSupport [(sizeof(mDNS_PlatformSupport) <= 1378) ? 1 : -1]; }; diff --git a/mDNSResponder/mDNSMacOSX/mDNSResponder.sb b/mDNSResponder/mDNSMacOSX/mDNSResponder.sb index 1458815c..29186314 100644 --- a/mDNSResponder/mDNSMacOSX/mDNSResponder.sb +++ b/mDNSResponder/mDNSMacOSX/mDNSResponder.sb @@ -1,6 +1,6 @@ ; -*- Mode: Scheme; tab-width: 4 -*- ; -; Copyright (c) 2012-2015 Apple Inc. All rights reserved. +; Copyright (c) 2012-2018 Apple Inc. All rights reserved. ; ; Redistribution and use in source and binary forms, with or without ; modification, are permitted provided that the following conditions are met: @@ -128,7 +128,7 @@ (literal "/private/var/preferences/SystemConfiguration/preferences.plist") (subpath "/System/Library/Preferences/Logging") (subpath "/AppleInternal/Library/Preferences/Logging") - (subpath "/private/var/preferences/Logging/Subsystems") + (subpath "/private/var/preferences/Logging") (subpath "/private/var/db/timezone") (subpath "/Library/Preferences/Logging")) diff --git a/mDNSResponder/mDNSMacOSX/mDNSResponder.xcodeproj/project.pbxproj b/mDNSResponder/mDNSMacOSX/mDNSResponder.xcodeproj/project.pbxproj index f1a8b1da..bbbd12ff 100644 --- a/mDNSResponder/mDNSMacOSX/mDNSResponder.xcodeproj/project.pbxproj +++ b/mDNSResponder/mDNSMacOSX/mDNSResponder.xcodeproj/project.pbxproj @@ -271,8 +271,9 @@ 4AAE0C9A0C68EA81003882A5 /* mDNSResponderHelper.8 in CopyFiles */ = {isa = PBXBuildFile; fileRef = 4AAE0C7A0C68E97F003882A5 /* mDNSResponderHelper.8 */; }; 4BD2B63A134FE09F002B96D5 /* P2PPacketFilter.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BD2B638134FE09F002B96D5 /* P2PPacketFilter.c */; }; 4BD2B63B134FE09F002B96D5 /* P2PPacketFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BD2B639134FE09F002B96D5 /* P2PPacketFilter.h */; }; - 729DF4601CD40630005ECF70 /* com.apple.mDNSResponder.plist in CopyFiles */ = {isa = PBXBuildFile; fileRef = 729DF45F1CD40630005ECF70 /* com.apple.mDNSResponder.plist */; }; 72FB5467166D5FCA0090B2D9 /* dnsctl.c in Sources */ = {isa = PBXBuildFile; fileRef = 72FB545A166D5F960090B2D9 /* dnsctl.c */; }; + 789036921F7AC1FA0077A962 /* libnetwork.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 789036911F7AC1F90077A962 /* libnetwork.tbd */; }; + 789036931F7AC2050077A962 /* libnetwork.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 789036911F7AC1F90077A962 /* libnetwork.tbd */; }; 8415A6571897109000BDBA26 /* libdns_services.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 8415A6561897109000BDBA26 /* libdns_services.dylib */; }; 8417375C1B967D37000CD5C2 /* dnsctl_server.c in Sources */ = {isa = PBXBuildFile; fileRef = 8417375A1B967CBE000CD5C2 /* dnsctl_server.c */; }; 848DA5C7165477E000D2E8B4 /* xpc_services.c in Sources */ = {isa = PBXBuildFile; fileRef = 848DA5C6165477E000D2E8B4 /* xpc_services.c */; }; @@ -324,8 +325,14 @@ B7E06B0D1DBA9DFE00E4580C /* ClientCommon.c in Sources */ = {isa = PBXBuildFile; fileRef = FF5852100DD27BD300862BDF /* ClientCommon.c */; }; B7E06B0E1DBA9E9700E4580C /* DomainBrowser.strings in Resources */ = {isa = PBXBuildFile; fileRef = B7016F4F1D5D0D1900107E7C /* DomainBrowser.strings */; }; BD03E88D1AD31278005E8A81 /* SymptomReporter.c in Sources */ = {isa = PBXBuildFile; fileRef = BD03E88C1AD31278005E8A81 /* SymptomReporter.c */; }; + BD28AE8F207B892D00F0B257 /* bonjour-mcast-diagnose in Copy diagnose scripts */ = {isa = PBXBuildFile; fileRef = BD28AE8E207B88F600F0B257 /* bonjour-mcast-diagnose */; }; + BD41B27D203EBE6100A53629 /* dns_sd.h in Headers */ = {isa = PBXBuildFile; fileRef = FFA572630AF190C20055A0F1 /* dns_sd.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BD41F9C4209B60AC0077F8B6 /* libpcap.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = BD41F9C3209B60AC0077F8B6 /* libpcap.tbd */; }; BD691B2A1ED2F47100E6F317 /* DNS64.c in Sources */ = {isa = PBXBuildFile; fileRef = BD691B281ED2F43200E6F317 /* DNS64.c */; }; BD691B2B1ED2F4AB00E6F317 /* DNS64.h in Headers */ = {isa = PBXBuildFile; fileRef = BD691B291ED2F43200E6F317 /* DNS64.h */; }; + BD75E940206ADEF400656ED3 /* com.apple.mDNSResponder.plist in Copy AppleInternal Logging Profile */ = {isa = PBXBuildFile; fileRef = BDB61846206ADDDF00AFF600 /* com.apple.mDNSResponder.plist */; }; + BD893CE5206C0D980055F9E7 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BD893CE4206C0D980055F9E7 /* SystemConfiguration.framework */; }; + BD893CE7206C0EAF0055F9E7 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BD893CE6206C0EAF0055F9E7 /* CoreFoundation.framework */; }; BD9BA7551EAF91FB00658CCF /* dnssdutil.c in Sources */ = {isa = PBXBuildFile; fileRef = BD9BA7541EAF91E700658CCF /* dnssdutil.c */; }; BD9BA7581EAF929C00658CCF /* CoreUtils.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BD9BA7571EAF929C00658CCF /* CoreUtils.framework */; }; BDA3F08A1C48DB920054FB4B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BDA3F0891C48DB910054FB4B /* Foundation.framework */; }; @@ -333,6 +340,12 @@ BDA3F08F1C48DCA50054FB4B /* Metrics.m in Sources */ = {isa = PBXBuildFile; fileRef = BDA3F0881C48DB6D0054FB4B /* Metrics.m */; }; BDA9A7881B3A924C00523835 /* dns_sd_private.h in Headers */ = {isa = PBXBuildFile; fileRef = BDA9A7871B3A923600523835 /* dns_sd_private.h */; settings = {ATTRIBUTES = (Private, ); }; }; BDA9A7891B3A92A500523835 /* dns_sd_private.h in Headers */ = {isa = PBXBuildFile; fileRef = BDA9A7871B3A923600523835 /* dns_sd_private.h */; settings = {ATTRIBUTES = (Private, ); }; }; + BDAF4BC020B52D3D0062219E /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BDAF4BBF20B52D3D0062219E /* CFNetwork.framework */; }; + BDB04221203FEF4C00419961 /* dns_sd.h in Headers */ = {isa = PBXBuildFile; fileRef = FFA572630AF190C20055A0F1 /* dns_sd.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BDB04222203FEF4D00419961 /* dns_sd.h in Headers */ = {isa = PBXBuildFile; fileRef = FFA572630AF190C20055A0F1 /* dns_sd.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BDB04223203FF18000419961 /* dns_sd_private.h in Headers */ = {isa = PBXBuildFile; fileRef = BDA9A7871B3A923600523835 /* dns_sd_private.h */; settings = {ATTRIBUTES = (Private, ); }; }; + BDB04224203FF18000419961 /* dns_sd_private.h in Headers */ = {isa = PBXBuildFile; fileRef = BDA9A7871B3A923600523835 /* dns_sd_private.h */; settings = {ATTRIBUTES = (Private, ); }; }; + BDB61845206ADB9D00AFF600 /* com.apple.mDNSResponder.plist in Copy Base Logging Profile */ = {isa = PBXBuildFile; fileRef = BDB61843206ADB7700AFF600 /* com.apple.mDNSResponder.plist */; }; BDBF9B941ED74B9C001498A8 /* DNS64State.h in Headers */ = {isa = PBXBuildFile; fileRef = BDBF9B931ED74B8C001498A8 /* DNS64State.h */; }; D284BE540ADD80740027CCDF /* dnssd_ipc.h in Headers */ = {isa = PBXBuildFile; fileRef = F5E11B5B04A28126019798ED /* dnssd_ipc.h */; }; D284BE580ADD80740027CCDF /* mDNS.c in Sources */ = {isa = PBXBuildFile; fileRef = 6575FBE9022EAF5A00000109 /* mDNS.c */; }; @@ -717,14 +730,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 8418673D15AB8BFF00BB7F70 /* CopyFiles */ = { + 8418673D15AB8BFF00BB7F70 /* Copy Base Logging Profile */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 8; dstPath = /System/Library/Preferences/Logging/Subsystems; dstSubfolderSpec = 0; files = ( - 729DF4601CD40630005ECF70 /* com.apple.mDNSResponder.plist in CopyFiles */, + BDB61845206ADB9D00AFF600 /* com.apple.mDNSResponder.plist in Copy Base Logging Profile */, ); + name = "Copy Base Logging Profile"; runOnlyForDeploymentPostprocessing = 1; }; B7D566C61E81D9B600E43008 /* CopyFiles */ = { @@ -738,6 +752,28 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + BD28AE8C207B888E00F0B257 /* Copy diagnose scripts */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 8; + dstPath = /usr/local/bin; + dstSubfolderSpec = 0; + files = ( + BD28AE8F207B892D00F0B257 /* bonjour-mcast-diagnose in Copy diagnose scripts */, + ); + name = "Copy diagnose scripts"; + runOnlyForDeploymentPostprocessing = 1; + }; + BD75E93F206ADEAD00656ED3 /* Copy AppleInternal Logging Profile */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 8; + dstPath = /AppleInternal/Library/Preferences/Logging/Subsystems; + dstSubfolderSpec = 0; + files = ( + BD75E940206ADEF400656ED3 /* com.apple.mDNSResponder.plist in Copy AppleInternal Logging Profile */, + ); + name = "Copy AppleInternal Logging Profile"; + runOnlyForDeploymentPostprocessing = 1; + }; D284BE6A0ADD80740027CCDF /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 8; @@ -891,9 +927,9 @@ 6575FBE9022EAF5A00000109 /* mDNS.c */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.c.c; name = mDNS.c; path = ../mDNSCore/mDNS.c; sourceTree = "<group>"; tabWidth = 4; usesTabs = 0; }; 6575FBEB022EAF7200000109 /* mDNSMacOSX.c */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.c.c; path = mDNSMacOSX.c; sourceTree = "<group>"; tabWidth = 4; usesTabs = 0; }; 6575FBEC022EAF7200000109 /* daemon.c */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.c.c; path = daemon.c; sourceTree = "<group>"; tabWidth = 4; usesTabs = 0; }; - 729DF45F1CD40630005ECF70 /* com.apple.mDNSResponder.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = com.apple.mDNSResponder.plist; path = Private/com.apple.mDNSResponder.plist; sourceTree = "<group>"; }; 72FB545A166D5F960090B2D9 /* dnsctl.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = dnsctl.c; path = ../Clients/dnsctl.c; sourceTree = "<group>"; }; 72FB545F166D5FB00090B2D9 /* dnsctl */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = dnsctl; sourceTree = BUILT_PRODUCTS_DIR; }; + 789036911F7AC1F90077A962 /* libnetwork.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libnetwork.tbd; path = usr/lib/libnetwork.tbd; sourceTree = SDKROOT; }; 7F18A9F60587CEF6001880B3 /* DNSCommon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = DNSCommon.c; path = ../mDNSCore/DNSCommon.c; sourceTree = SOURCE_ROOT; }; 7F18A9F70587CEF6001880B3 /* uDNS.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = uDNS.c; path = ../mDNSCore/uDNS.c; sourceTree = SOURCE_ROOT; }; 7F461DB5062DBF2900672BF3 /* DNSDigest.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = DNSDigest.c; path = ../mDNSCore/DNSDigest.c; sourceTree = SOURCE_ROOT; }; @@ -952,8 +988,12 @@ B7D6CA701D1076F3005E24CF /* DomainBrowser.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DomainBrowser.framework; sourceTree = BUILT_PRODUCTS_DIR; }; B7E5920F1DB687A700A38085 /* Base */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = Base; path = Base.lproj/DNSServiceDiscoveryPref.nib; sourceTree = "<group>"; }; BD03E88C1AD31278005E8A81 /* SymptomReporter.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SymptomReporter.c; sourceTree = "<group>"; }; + BD28AE8E207B88F600F0B257 /* bonjour-mcast-diagnose */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = "bonjour-mcast-diagnose"; sourceTree = "<group>"; }; + BD41F9C3209B60AC0077F8B6 /* libpcap.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libpcap.tbd; path = usr/lib/libpcap.tbd; sourceTree = SDKROOT; }; BD691B281ED2F43200E6F317 /* DNS64.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = DNS64.c; sourceTree = "<group>"; }; BD691B291ED2F43200E6F317 /* DNS64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DNS64.h; sourceTree = "<group>"; }; + BD893CE4206C0D980055F9E7 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; + BD893CE6206C0EAF0055F9E7 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = System/Library/Frameworks/CoreFoundation.framework; sourceTree = SDKROOT; }; BD9BA7531EAF90E400658CCF /* dnssdutil */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = dnssdutil; sourceTree = BUILT_PRODUCTS_DIR; }; BD9BA7541EAF91E700658CCF /* dnssdutil.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = dnssdutil.c; path = ../Clients/dnssdutil.c; sourceTree = "<group>"; }; BD9BA7571EAF929C00658CCF /* CoreUtils.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreUtils.framework; path = System/Library/PrivateFrameworks/CoreUtils.framework; sourceTree = SDKROOT; }; @@ -961,6 +1001,9 @@ BDA3F0881C48DB6D0054FB4B /* Metrics.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Metrics.m; sourceTree = "<group>"; }; BDA3F0891C48DB910054FB4B /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; BDA9A7871B3A923600523835 /* dns_sd_private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = dns_sd_private.h; path = ../mDNSShared/dns_sd_private.h; sourceTree = "<group>"; }; + BDAF4BBF20B52D3D0062219E /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = System/Library/Frameworks/CFNetwork.framework; sourceTree = SDKROOT; }; + BDB61843206ADB7700AFF600 /* com.apple.mDNSResponder.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = com.apple.mDNSResponder.plist; sourceTree = "<group>"; }; + BDB61846206ADDDF00AFF600 /* com.apple.mDNSResponder.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = com.apple.mDNSResponder.plist; sourceTree = "<group>"; }; BDBF9B931ED74B8C001498A8 /* DNS64State.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DNS64State.h; sourceTree = "<group>"; }; BDE238C11DF69D8300B9F696 /* dns_sd_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dns_sd_internal.h; path = ../mDNSShared/dns_sd_internal.h; sourceTree = "<group>"; }; D284BE730ADD80740027CCDF /* mDNSResponder */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = mDNSResponder; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -1084,6 +1127,7 @@ 21B830A61D8A63E400AE2001 /* CoreFoundation.framework in Frameworks */, 21B830A21D8A63A300AE2001 /* libxml2.dylib in Frameworks */, 37538E141D7A43B600226BE4 /* libicucore.dylib in Frameworks */, + 789036931F7AC2050077A962 /* libnetwork.tbd in Frameworks */, 21B830A41D8A63BB00AE2001 /* Security.framework in Frameworks */, 21B830A51D8A63CB00AE2001 /* IOKit.framework in Frameworks */, ); @@ -1149,7 +1193,11 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + BD41F9C4209B60AC0077F8B6 /* libpcap.tbd in Frameworks */, + BDAF4BC020B52D3D0062219E /* CFNetwork.framework in Frameworks */, + BD893CE7206C0EAF0055F9E7 /* CoreFoundation.framework in Frameworks */, BD9BA7581EAF929C00658CCF /* CoreUtils.framework in Frameworks */, + BD893CE5206C0D980055F9E7 /* SystemConfiguration.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1164,6 +1212,7 @@ D284BE660ADD80740027CCDF /* SystemConfiguration.framework in Frameworks */, 21B830A81D8A642200AE2001 /* libicucore.dylib in Frameworks */, 219D5542149ED645004464AE /* libxml2.dylib in Frameworks */, + 789036921F7AC1FA0077A962 /* libnetwork.tbd in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1246,6 +1295,8 @@ 19C28FBDFE9D53C911CA2CBB /* Products */, 37DDE9241BA382280092AC61 /* Unit Tests */, BD9BA7561EAF929C00658CCF /* Frameworks */, + BDB61842206ADB7700AFF600 /* LoggingProfiles */, + BD28AE8D207B88F600F0B257 /* Scripts */, ); name = mDNSResponder; sourceTree = "<group>"; @@ -1267,7 +1318,6 @@ 21F51DBD1B3540DB0070B05C /* com.apple.dnsextd.plist */, 21F51DBF1B35412D0070B05C /* com.apple.mDNSResponder.plist */, 21F51DBE1B3541030070B05C /* com.apple.mDNSResponderHelper.plist */, - 729DF45F1CD40630005ECF70 /* com.apple.mDNSResponder.plist */, 21A57F4A145B2AE100939099 /* CryptoAlg.c */, 21A57F4B145B2AE100939099 /* CryptoAlg.h */, 21A57F51145B2B1400939099 /* CryptoSupport.c */, @@ -1568,14 +1618,44 @@ path = macOS; sourceTree = "<group>"; }; + BD28AE8D207B88F600F0B257 /* Scripts */ = { + isa = PBXGroup; + children = ( + BD28AE8E207B88F600F0B257 /* bonjour-mcast-diagnose */, + ); + path = Scripts; + sourceTree = "<group>"; + }; BD9BA7561EAF929C00658CCF /* Frameworks */ = { isa = PBXGroup; children = ( + BDAF4BBF20B52D3D0062219E /* CFNetwork.framework */, + BD41F9C3209B60AC0077F8B6 /* libpcap.tbd */, + BD893CE6206C0EAF0055F9E7 /* CoreFoundation.framework */, + BD893CE4206C0D980055F9E7 /* SystemConfiguration.framework */, + 789036911F7AC1F90077A962 /* libnetwork.tbd */, BD9BA7571EAF929C00658CCF /* CoreUtils.framework */, ); name = Frameworks; sourceTree = "<group>"; }; + BDB61842206ADB7700AFF600 /* LoggingProfiles */ = { + isa = PBXGroup; + children = ( + BDB61843206ADB7700AFF600 /* com.apple.mDNSResponder.plist */, + BDB61844206ADB7700AFF600 /* AppleInternal */, + ); + path = LoggingProfiles; + sourceTree = "<group>"; + }; + BDB61844206ADB7700AFF600 /* AppleInternal */ = { + isa = PBXGroup; + children = ( + BDB61846206ADDDF00AFF600 /* com.apple.mDNSResponder.plist */, + ); + path = AppleInternal; + sourceTree = "<group>"; + }; DB2CC4420662DCE500335AB3 /* Java Support */ = { isa = PBXGroup; children = ( @@ -1784,6 +1864,8 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( + BDB04221203FEF4C00419961 /* dns_sd.h in Headers */, + BDB04223203FF18000419961 /* dns_sd_private.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1791,6 +1873,8 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( + BDB04222203FEF4D00419961 /* dns_sd.h in Headers */, + BDB04224203FF18000419961 /* dns_sd_private.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1799,6 +1883,7 @@ buildActionMask = 2147483647; files = ( BDA9A7881B3A924C00523835 /* dns_sd_private.h in Headers */, + BD41B27D203EBE6100A53629 /* dns_sd.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1881,7 +1966,6 @@ 2141DD19123FFCDB0086D23E /* Headers */, 2141DD1A123FFCDB0086D23E /* Sources */, 2141DD1B123FFCDB0086D23E /* Frameworks */, - 2130256B12400DE600AC839F /* ShellScript */, ); buildRules = ( ); @@ -2115,8 +2199,10 @@ 4A7B9E7F14FDA21B00B84CC1 /* CopyFiles */, 4A7B9E8114FDA25500B84CC1 /* CopyFiles */, D284BE6C0ADD80740027CCDF /* Run Script */, - 8418673D15AB8BFF00BB7F70 /* CopyFiles */, 21F51DC01B35418C0070B05C /* CopyFiles */, + 8418673D15AB8BFF00BB7F70 /* Copy Base Logging Profile */, + BD75E93F206ADEAD00656ED3 /* Copy AppleInternal Logging Profile */, + BD28AE8C207B888E00F0B257 /* Copy diagnose scripts */, ); buildRules = ( ); @@ -2439,19 +2525,6 @@ shellPath = /bin/sh; shellScript = "if [ -e \"${SDKROOT}/usr/local/include/vproc.h\" -o -e \"${SDKROOT}/usr/include/vproc.h\" ]\nthen\nrm -f \"${CONFIGURATION_TEMP_DIR}/vproc.h\"\nelse\ntouch \"${CONFIGURATION_TEMP_DIR}/vproc.h\"\nfi\n\nipsec=$(ls \"${SDKROOT}/usr/lib/libipsec.*\" 2> /dev/null | wc -l)\nif [ \"$ipsec\" != \"0\" ]\nthen\nrm -f \"${CONFIGURATION_TEMP_DIR}/ipsec_options.h\"\ntouch \"${CONFIGURATION_TEMP_DIR}/ipsec_options.h\"\nrm -f \"${CONFIGURATION_TEMP_DIR}/libipsec.a\"\nelse\necho \"#define MDNS_NO_IPSEC 1\" > ${CONFIGURATION_TEMP_DIR}/ipsec_options.h\ntouch \"${CONFIGURATION_TEMP_DIR}/empty.c\"\nfor i in ${ARCHS}\ndo\nccflags=\"-arch $i $ccflags\"\ndone\ncc ${ccflags} \"${CONFIGURATION_TEMP_DIR}/empty.c\" -c -o \"${CONFIGURATION_TEMP_DIR}/libipsec.a\"\nrm -f \"${CONFIGURATION_TEMP_DIR}/empty.c\"\nfi\n"; }; - 2130256B12400DE600AC839F /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 8; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 1; - shellPath = /bin/sh; - shellScript = "DSTROOT=${DSTROOT}\n\nmkdir -p \"$DSTROOT/usr/include\"\nsed 's/\\(^#define _DNS_SD_LIBDISPATCH \\)0$/\\1 1/' \"$SRCROOT/../mDNSShared/dns_sd.h\" > \"$DSTROOT/usr/include/dns_sd.h\""; - }; 21DE714D115831CB00DD4BD1 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 8; @@ -2463,7 +2536,7 @@ ); runOnlyForDeploymentPostprocessing = 1; shellPath = "/bin/bash -e -x"; - shellScript = "DSTROOT=${DSTROOT}\nmkdir -p \"$DSTROOT/usr/include\"\nsed 's/\\(^#define _DNS_SD_LIBDISPATCH \\)0$/\\1 1/' \"$SRCROOT/../mDNSShared/dns_sd.h\" > \"$DSTROOT/usr/include/dns_sd.h\"\n\nif [[ \"${ACTION}\" == \"installhdrs\" ]]; then\n exit 0\nfi\n\nif [[ \"${PLATFORM_NAME}\" =~ \"simulator\" ]]; then\n ln -s libsystem_dnssd.dylib ${DSTROOT}${INSTALL_PATH}/libsystem_sim_dnssd.dylib\nfi\n"; + shellScript = "DSTROOT=${DSTROOT}\n\nif [[ \"${ACTION}\" == \"installhdrs\" ]] || [[ \"${ACTION}\" == \"installapi\" ]]; then\n exit 0\nfi\n\nif [[ \"${PLATFORM_NAME}\" =~ \"simulator\" ]]; then\n ln -s libsystem_dnssd.dylib ${DSTROOT}${INSTALL_PATH}/libsystem_sim_dnssd.dylib\nfi\n"; }; 37DDE9341BA384000092AC61 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; @@ -3154,7 +3227,6 @@ GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "__APPLE_USE_RFC_3542=1", - "_DNS_SD_LIBDISPATCH=1", "APPLE_OSX_mDNSResponder=1", "__MigTypeCheck=1", "mDNSResponderVersion=${MVERS}", @@ -3249,7 +3321,6 @@ "-lMobileGestalt", ); "OTHER_LDFLAGS[sdk=macosx*][arch=*]" = ( - "-lAWACS", "-weak_framework", WebFilterDNS, "-weak_framework", @@ -3339,7 +3410,6 @@ buildSettings = { GCC_PREPROCESSOR_DEFINITIONS = ( "__APPLE_USE_RFC_3542=1", - "_DNS_SD_LIBDISPATCH=1", "APPLE_OSX_mDNSResponder=1", "__MigTypeCheck=1", "mDNSResponderVersion=${MVERS}", @@ -3431,6 +3501,7 @@ INSTALLHDRS_SCRIPT_PHASE = YES; INSTALL_PATH = /usr/local/lib/system; PRODUCT_NAME = dns_sd; + PUBLIC_HEADERS_FOLDER_PATH = /usr/include; "SKIP_INSTALL[sdk=iphonesimulator*]" = YES; }; name = Debug; @@ -3474,12 +3545,14 @@ "$(inherited)", "__DARWIN_NON_CANCELABLE=1", ); + GCC_SYMBOLS_PRIVATE_EXTERN = YES; HEADER_SEARCH_PATHS = "$(SDKROOT)/System/Library/Frameworks/System.framework/PrivateHeaders/"; INSTALLHDRS_COPY_PHASE = YES; INSTALLHDRS_SCRIPT_PHASE = YES; INSTALL_PATH = /usr/lib/system; INTERPOSITION_SIM_SUFFIX = ""; "INTERPOSITION_SIM_SUFFIX[sdk=iphonesimulator*]" = _sim; + IS_ZIPPERED = YES; LINK_WITH_STANDARD_LIBRARIES = NO; OTHER_LDFLAGS = ( "-Wl,-umbrella,System", @@ -3496,7 +3569,11 @@ "-llaunch", "-lsystem_asl", ); + OTHER_TAPI_FLAGS = "-umbrella System -extra-public-header $(SRCROOT)/DNSServiceDiscovery.h"; PRODUCT_NAME = libsystem_dnssd; + PUBLIC_HEADERS_FOLDER_PATH = /usr/include; + SUPPORTS_TEXT_BASED_API = YES; + TAPI_VERIFY_MODE = Pedantic; }; name = Debug; }; @@ -3509,6 +3586,7 @@ "$(inherited)", "__DARWIN_NON_CANCELABLE=1", ); + GCC_SYMBOLS_PRIVATE_EXTERN = YES; HEADER_SEARCH_PATHS = "$(SDKROOT)/System/Library/Frameworks/System.framework/PrivateHeaders/"; INSTALL_PATH = /usr/lib/system; INTERPOSITION_SIM_SUFFIX = ""; @@ -3529,7 +3607,11 @@ "-llaunch", "-lsystem_asl", ); + OTHER_TAPI_FLAGS = "-umbrella System -extra-public-header $(SRCROOT)/DNSServiceDiscovery.h"; PRODUCT_NAME = libsystem_dnssd_debug; + PUBLIC_HEADERS_FOLDER_PATH = /usr/include; + SUPPORTS_TEXT_BASED_API = YES; + TAPI_VERIFY_MODE = Pedantic; }; name = Debug; }; @@ -3543,6 +3625,7 @@ "$(inherited)", "__DARWIN_NON_CANCELABLE=1", ); + GCC_SYMBOLS_PRIVATE_EXTERN = YES; GENERATE_PROFILING_CODE = YES; HEADER_SEARCH_PATHS = "$(SDKROOT)/System/Library/Frameworks/System.framework/PrivateHeaders/"; INSTALL_PATH = /usr/lib/system; @@ -3564,7 +3647,11 @@ "-llaunch", "-lsystem_asl", ); + OTHER_TAPI_FLAGS = "-umbrella System -extra-public-header $(SRCROOT)/DNSServiceDiscovery.h"; PRODUCT_NAME = libsystem_dnssd_profile; + PUBLIC_HEADERS_FOLDER_PATH = /usr/include; + SUPPORTS_TEXT_BASED_API = YES; + TAPI_VERIFY_MODE = Pedantic; }; name = Debug; }; @@ -3755,6 +3842,7 @@ INSTALLHDRS_SCRIPT_PHASE = YES; INSTALL_PATH = /usr/local/lib/system; PRODUCT_NAME = dns_sd; + PUBLIC_HEADERS_FOLDER_PATH = /usr/include; "SKIP_INSTALL[sdk=iphonesimulator*]" = YES; }; name = Release; @@ -3836,7 +3924,6 @@ ); GCC_PREPROCESSOR_DEFINITIONS = ( "__APPLE_USE_RFC_3542=1", - "_DNS_SD_LIBDISPATCH=1", "APPLE_OSX_mDNSResponder=1", "__MigTypeCheck=1", "mDNSResponderVersion=${MVERS}", @@ -3899,7 +3986,6 @@ GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "__APPLE_USE_RFC_3542=1", - "_DNS_SD_LIBDISPATCH=1", "APPLE_OSX_mDNSResponder=1", "__MigTypeCheck=1", "mDNSResponderVersion=${MVERS}", @@ -4644,7 +4730,6 @@ DEAD_CODE_STRIPPING = YES; GCC_PREPROCESSOR_DEFINITIONS = ( "__APPLE_USE_RFC_3542=1", - "_DNS_SD_LIBDISPATCH=1", "APPLE_OSX_mDNSResponder=1", "__MigTypeCheck=1", "mDNSResponderVersion=${MVERS}", @@ -4715,7 +4800,6 @@ "-lMobileGestalt", ); "OTHER_LDFLAGS[sdk=macosx*][arch=*]" = ( - "-lAWACS", "-weak_framework", WebFilterDNS, "-weak_framework", @@ -4807,6 +4891,7 @@ "$(inherited)", "__DARWIN_NON_CANCELABLE=1", ); + GCC_SYMBOLS_PRIVATE_EXTERN = YES; HEADER_SEARCH_PATHS = "$(SDKROOT)/System/Library/Frameworks/System.framework/PrivateHeaders/"; INSTALL_PATH = /usr/lib/system; INTERPOSITION_SIM_SUFFIX = ""; @@ -4827,7 +4912,11 @@ "-llaunch", "-lsystem_asl", ); + OTHER_TAPI_FLAGS = "-umbrella System -extra-public-header $(SRCROOT)/DNSServiceDiscovery.h"; PRODUCT_NAME = libsystem_dnssd_debug; + PUBLIC_HEADERS_FOLDER_PATH = /usr/include; + SUPPORTS_TEXT_BASED_API = YES; + TAPI_VERIFY_MODE = Pedantic; }; name = Release; }; @@ -4841,6 +4930,7 @@ "$(inherited)", "__DARWIN_NON_CANCELABLE=1", ); + GCC_SYMBOLS_PRIVATE_EXTERN = YES; GENERATE_PROFILING_CODE = YES; HEADER_SEARCH_PATHS = "$(SDKROOT)/System/Library/Frameworks/System.framework/PrivateHeaders/"; INSTALL_PATH = /usr/lib/system; @@ -4862,7 +4952,11 @@ "-llaunch", "-lsystem_asl", ); + OTHER_TAPI_FLAGS = "-umbrella System -extra-public-header $(SRCROOT)/DNSServiceDiscovery.h"; PRODUCT_NAME = libsystem_dnssd_profile; + PUBLIC_HEADERS_FOLDER_PATH = /usr/include; + SUPPORTS_TEXT_BASED_API = YES; + TAPI_VERIFY_MODE = Pedantic; }; name = Release; }; @@ -4889,12 +4983,14 @@ "$(inherited)", "__DARWIN_NON_CANCELABLE=1", ); + GCC_SYMBOLS_PRIVATE_EXTERN = YES; HEADER_SEARCH_PATHS = "$(SDKROOT)/System/Library/Frameworks/System.framework/PrivateHeaders/"; INSTALLHDRS_COPY_PHASE = YES; INSTALLHDRS_SCRIPT_PHASE = YES; INSTALL_PATH = /usr/lib/system; INTERPOSITION_SIM_SUFFIX = ""; "INTERPOSITION_SIM_SUFFIX[sdk=iphonesimulator*]" = _sim; + IS_ZIPPERED = YES; LINK_WITH_STANDARD_LIBRARIES = NO; OTHER_LDFLAGS = ( "-Wl,-umbrella,System", @@ -4911,7 +5007,11 @@ "-llaunch", "-lsystem_asl", ); + OTHER_TAPI_FLAGS = "-umbrella System -extra-public-header $(SRCROOT)/DNSServiceDiscovery.h"; PRODUCT_NAME = libsystem_dnssd; + PUBLIC_HEADERS_FOLDER_PATH = /usr/include; + SUPPORTS_TEXT_BASED_API = YES; + TAPI_VERIFY_MODE = Pedantic; }; name = Release; }; diff --git a/mDNSResponder/mDNSMacOSX/uDNSPathEvalulation.c b/mDNSResponder/mDNSMacOSX/uDNSPathEvalulation.c index 96d4a0db..e4744736 100644 --- a/mDNSResponder/mDNSMacOSX/uDNSPathEvalulation.c +++ b/mDNSResponder/mDNSMacOSX/uDNSPathEvalulation.c @@ -17,7 +17,13 @@ #include "mDNSMacOSX.h" #include <libproc.h> -#include <network/private.h> + +#if __has_include(<nw/private.h>) + #include <nw/private.h> +#else + #include <network/private.h> +#endif + #include "dns_sd_internal.h" //Gets the DNSPolicy from NW PATH EVALUATOR |