[rtems-libbsd commit] mDNSResponder: Update to v765.30.11

Sebastian Huber sebh at rtems.org
Thu Sep 20 09:28:28 UTC 2018


Module:    rtems-libbsd
Branch:    master
Commit:    7d33d36d73d2e902b107fb597e84e44ab11274a9
Changeset: http://git.rtems.org/rtems-libbsd/commit/?id=7d33d36d73d2e902b107fb597e84e44ab11274a9

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Wed Sep 19 08:54:52 2018 +0200

mDNSResponder: Update to v765.30.11

The sources can be obtained via:

https://opensource.apple.com/tarballs/mDNSResponder/mDNSResponder-765.30.11.tar.gz

Update #3522.

---

 mDNSResponder/Makefile                   |   2 +-
 mDNSResponder/mDNSCore/dnsproxy.c        |  21 +++---
 mDNSResponder/mDNSCore/mDNSEmbeddedAPI.h |   2 +-
 mDNSResponder/mDNSCore/uDNS.c            |   5 +-
 mDNSResponder/mDNSMacOSX/Metrics.m       | 123 ++++++++++---------------------
 mDNSResponder/mDNSMacOSX/mDNSMacOSX.c    |  32 ++++----
 mDNSResponder/mDNSPosix/Responder.c      |   4 +-
 mDNSResponder/mDNSPosix/mDNSPosix.c      |  36 +++++++--
 mDNSResponder/mDNSPosix/mDNSUNP.c        |   4 +-
 mDNSResponder/mDNSShared/dns_sd.h        |   2 +-
 mDNSResponder/mDNSWindows/mDNSWin32.c    |   2 +-
 11 files changed, 112 insertions(+), 121 deletions(-)

diff --git a/mDNSResponder/Makefile b/mDNSResponder/Makefile
index dbf604a..ddf12f7 100644
--- a/mDNSResponder/Makefile
+++ b/mDNSResponder/Makefile
@@ -16,7 +16,7 @@
 
 include $(MAKEFILEPATH)/pb_makefiles/platform.make
 
-MVERS = "mDNSResponder-765.20.4"
+MVERS = "mDNSResponder-765.30.11"
 
 DDNSWRITECONFIG = "$(DSTROOT)/Library/Application Support/Bonjour/ddnswriteconfig"
 VER = 
diff --git a/mDNSResponder/mDNSCore/dnsproxy.c b/mDNSResponder/mDNSCore/dnsproxy.c
index 05b70dd..5376d3c 100644
--- a/mDNSResponder/mDNSCore/dnsproxy.c
+++ b/mDNSResponder/mDNSCore/dnsproxy.c
@@ -195,6 +195,8 @@ mDNSlocal mDNSu8 *AddResourceRecords(mDNS *const m, DNSProxyClient *pc, mDNSu8 *
     CacheRecord *soa = mDNSNULL;
     CacheRecord *cname = mDNSNULL;
     mDNSu8 *limit;
+    domainname tempQName;
+    mDNSu32 tempQNameHash;
 
     *error = mStatus_NoError;
     *prevptr = mDNSNULL;
@@ -222,20 +224,17 @@ mDNSlocal mDNSu8 *AddResourceRecords(mDNS *const m, DNSProxyClient *pc, mDNSu8 *
     }
     LogInfo("AddResourceRecords: Limit is %d", limit - m->omsg.data);
 
-    if (!SameDomainName(&pc->qname, &pc->q.qname))
-    {
-        AssignDomainName(&pc->q.qname, &pc->qname);
-        pc->q.qnamehash = DomainNameHashValue(&pc->q.qname);
-    }
+    AssignDomainName(&tempQName, &pc->qname);
+    tempQNameHash = DomainNameHashValue(&tempQName);
 
 again:
     nsec = soa = cname = mDNSNULL;
-    slot = HashSlot(&pc->q.qname);
-        
-    cg = CacheGroupForName(m, slot, pc->q.qnamehash, &pc->q.qname);
+    slot = HashSlot(&tempQName);
+
+    cg = CacheGroupForName(m, slot, tempQNameHash, &tempQName);
     if (!cg)
     {
-        LogInfo("AddResourceRecords: CacheGroup not found");
+        LogInfo("AddResourceRecords: CacheGroup not found for %##s", tempQName.c);
         *error = mStatus_NoSuchRecord;
         return mDNSNULL;
     }
@@ -344,8 +343,8 @@ again:
     }
     if (cname)
     {
-        AssignDomainName(&pc->q.qname, &cname->resrec.rdata->u.name);
-        pc->q.qnamehash = DomainNameHashValue(&pc->q.qname);
+        AssignDomainName(&tempQName, &cname->resrec.rdata->u.name);
+        tempQNameHash = DomainNameHashValue(&tempQName);
         goto again;
     }
     if (!ptr)
diff --git a/mDNSResponder/mDNSCore/mDNSEmbeddedAPI.h b/mDNSResponder/mDNSCore/mDNSEmbeddedAPI.h
index 3fd654e..248b848 100755
--- a/mDNSResponder/mDNSCore/mDNSEmbeddedAPI.h
+++ b/mDNSResponder/mDNSCore/mDNSEmbeddedAPI.h
@@ -3376,7 +3376,7 @@ extern mDNSu8 *DNSProxySetAttributes(DNSQuestion *q, DNSMessageHeader *h, DNSMes
 #if APPLE_OSX_mDNSResponder
 extern void mDNSPlatformGetDNSRoutePolicy(mDNS *const m, DNSQuestion *q, mDNSBool *isBlocked);
 #endif
-extern void mDNSPlatformSetSocktOpt(void *sock, mDNSTransport_Type transType, mDNSAddr_Type addrType, DNSQuestion *q);
+extern void mDNSPlatformSetSocktOpt(void *sock, mDNSTransport_Type transType, mDNSAddr_Type addrType, const DNSQuestion *q);
 extern mDNSs32 mDNSPlatformGetPID(void);
 extern mDNSBool mDNSValidKeepAliveRecord(AuthRecord *rr);
 
diff --git a/mDNSResponder/mDNSCore/uDNS.c b/mDNSResponder/mDNSCore/uDNS.c
index 694c745..5848e1e 100755
--- a/mDNSResponder/mDNSCore/uDNS.c
+++ b/mDNSResponder/mDNSCore/uDNS.c
@@ -4737,7 +4737,10 @@ mDNSexport void uDNS_CheckCurrentQuestion(mDNS *const m)
                     {
                         q->LocalSocket = mDNSPlatformUDPSocket(m, zeroIPPort);
                         if (q->LocalSocket)
-                            mDNSPlatformSetSocktOpt(q->LocalSocket, mDNSTransport_UDP, q->qDNSServer->addr.type, q);
+                        {
+                            mDNSPlatformSetSocktOpt(q->LocalSocket, mDNSTransport_UDP, mDNSAddrType_IPv4, q);
+                            mDNSPlatformSetSocktOpt(q->LocalSocket, mDNSTransport_UDP, mDNSAddrType_IPv6, q);
+                        }
                     }
                     if (!q->LocalSocket) err = mStatus_NoMemoryErr; // If failed to make socket (should be very rare), we'll try again next time
                     else
diff --git a/mDNSResponder/mDNSMacOSX/Metrics.m b/mDNSResponder/mDNSMacOSX/Metrics.m
index 8dae3f5..bfff58e 100644
--- a/mDNSResponder/mDNSMacOSX/Metrics.m
+++ b/mDNSResponder/mDNSMacOSX/Metrics.m
@@ -99,16 +99,14 @@ static const Domain     kQueryStatsDomains[] =
     { "apple.com.",     (domainname *)"\x5" "apple"     "\x3" "com", 2 },
     { "icloud.com.",    (domainname *)"\x6" "icloud"    "\x3" "com", 2 },
     { "mzstatic.com.",  (domainname *)"\x8" "mzstatic"  "\x3" "com", 2 },
-    { "me.com.",        (domainname *)"\x2" "me"        "\x3" "com", 2 },
     { "google.com.",    (domainname *)"\x6" "google"    "\x3" "com", 2 },
-    { "youtube.com.",   (domainname *)"\x7" "youtube"   "\x3" "com", 2 },
     { "facebook.com.",  (domainname *)"\x8" "facebook"  "\x3" "com", 2 },
     { "baidu.com.",     (domainname *)"\x5" "baidu"     "\x3" "com", 2 },
     { "yahoo.com.",     (domainname *)"\x5" "yahoo"     "\x3" "com", 2 },
     { "qq.com.",        (domainname *)"\x2" "qq"        "\x3" "com", 2 },
 };
 
-check_compile_time(countof(kQueryStatsDomains) == 11);
+check_compile_time(countof(kQueryStatsDomains) == 9);
 
 // DNSHist contains the per domain per network type histogram data that goes in a DNSDomainStats protobuf message. See
 // <rdar://problem/23980546> MDNSResponder.proto update.
@@ -168,7 +166,6 @@ check_compile_time(countof_field(DNSHist, negResponseLatencyBins)      == (count
 
 typedef struct
 {
-    DNSHist *       histAny;    // Histogram data for queries of any resource record type.
     DNSHist *       histA;      // Histogram data for queries for A resource records.
     DNSHist *       histAAAA;   // Histogram data for queries for AAAA resource records.
 
@@ -313,7 +310,7 @@ static AWDServerConnection *        gAWDServerConnection        = nil;
 mDNSlocal mStatus   DNSDomainStatsCreate(const Domain *inDomain, DNSDomainStats **outStats);
 mDNSlocal void      DNSDomainStatsFree(DNSDomainStats *inStats);
 mDNSlocal void      DNSDomainStatsFreeList(DNSDomainStats *inList);
-mDNSlocal mStatus   DNSDomainStatsUpdate(DNSDomainStats *inStats, uint16_t inType, const ResourceRecord *inRR, mDNSu32 inQuerySendCount, mDNSu32 inLatencyMs, mDNSBool inForCell);
+mDNSlocal mStatus   DNSDomainStatsUpdate(DNSDomainStats *inStats, int inType, const ResourceRecord *inRR, mDNSu32 inQuerySendCount, mDNSu32 inLatencyMs, mDNSBool inForCell);
 
 mDNSlocal mStatus   ResolveStatsDomainCreate(const Domain *inDomain, ResolveStatsDomain **outDomain);
 mDNSlocal void      ResolveStatsDomainFree(ResolveStatsDomain *inDomain);
@@ -362,18 +359,10 @@ mDNSlocal void      ValidateDNSStatsDomains(void);
 
 mStatus MetricsInit(void)
 {
-    mStatus     err;
-
 #if (METRICS_VALIDATE_DNS_STATS_DOMAINS)
     ValidateDNSStatsDomains();
 #endif
 
-    err = CreateDomainStatsList(&gDomainStatsList);
-    require_noerr_quiet(err, exit);
-
-    err = CreateResolveStatsList(&gResolveStatsList);
-    require_noerr_quiet(err, exit);
-
     @autoreleasepool
     {
         gAWDServerConnection = [[AWDServerConnectionSoft alloc]
@@ -395,7 +384,7 @@ mStatus MetricsInit(void)
                     SubmitAWDMetric(inMetricID);
                 }
                 forIdentifier: (UInt32)AWDMetricId_MDNSResponder_ResolveStats];
-            
+
             [gAWDServerConnection
                 registerQueriableMetricCallback: ^(UInt32 inMetricID)
                 {
@@ -408,8 +397,14 @@ mStatus MetricsInit(void)
             LogMsg("MetricsInit: failed to create AWD server connection.");
         }
     }
-exit:
-    return (err);
+
+    if( gAWDServerConnection )
+    {
+        CreateDomainStatsList(&gDomainStatsList);
+        CreateResolveStatsList(&gResolveStatsList);
+    }
+
+    return (mStatus_NoError);
 }
 
 //===========================================================================================================================
@@ -425,6 +420,9 @@ mDNSexport void MetricsUpdateUDNSQueryStats(const domainname *inQueryName, mDNSu
     int                     skipCount;
     int                     skipCountLast = -1;
 
+    require_quiet(gAWDServerConnection, exit);
+    require_quiet((inType == kDNSType_A) || (inType == kDNSType_AAAA), exit);
+
     queryLabelCount = CountLabels(inQueryName);
 
     for (stats = gDomainStatsList; stats; stats = stats->next)
@@ -455,6 +453,8 @@ mDNSexport void MetricsUpdateUDNSQueryStats(const domainname *inQueryName, mDNSu
         }
     }
 
+exit:
+    return;
 }
 
 //===========================================================================================================================
@@ -473,6 +473,7 @@ mDNSexport void MetricsUpdateUDNSResolveStats(const domainname *inQueryName, con
     const domainname *          queryParentDomain;
     Response                    response;
 
+    require_quiet(gAWDServerConnection, exit);
     require_quiet((inRR->rrtype == kDNSType_A) || (inRR->rrtype == kDNSType_AAAA), exit);
     require_quiet(inRR->rDNSServer, exit);
 
@@ -536,6 +537,7 @@ mDNSexport void LogMetrics(void)
     int                                 hostnameObjCount = 0;
     int                                 addrObjCount     = 0;
 
+    LogMsgNoIdent("gAWDServerConnection %p", gAWDServerConnection);
     LogMsgNoIdent("---- DNS query stats by domain -----");
 
     for (stats = gDomainStatsList; stats; stats = stats->next)
@@ -657,7 +659,6 @@ mDNSlocal void DNSDomainStatsFree(DNSDomainStats *inStats)
 {
     if (inStats->nonCellular)
     {
-        ForgetMem(&inStats->nonCellular->histAny);
         ForgetMem(&inStats->nonCellular->histA);
         ForgetMem(&inStats->nonCellular->histAAAA);
         free(inStats->nonCellular);
@@ -665,7 +666,6 @@ mDNSlocal void DNSDomainStatsFree(DNSDomainStats *inStats)
     }
     if (inStats->cellular)
     {
-        ForgetMem(&inStats->cellular->histAny);
         ForgetMem(&inStats->cellular->histA);
         ForgetMem(&inStats->cellular->histAAAA);
         free(inStats->cellular);
@@ -693,51 +693,31 @@ mDNSlocal void DNSDomainStatsFreeList(DNSDomainStats *inList)
 //  DNSDomainStatsUpdate
 //===========================================================================================================================
 
-mDNSlocal mStatus DNSDomainStatsUpdate(DNSDomainStats *inStats, uint16_t inType, const ResourceRecord *inRR, mDNSu32 inQuerySendCount, mDNSu32 inLatencyMs, mDNSBool inForCell)
+mDNSlocal mStatus DNSDomainStatsUpdate(DNSDomainStats *inStats, int inType, const ResourceRecord *inRR, mDNSu32 inQuerySendCount, mDNSu32 inLatencyMs, mDNSBool inForCell)
 {
     mStatus             err;
-    DNSHistSet **       p;
     DNSHistSet *        set;
-    DNSHist *           histAny;
+    DNSHistSet **       pSet;
     DNSHist *           hist;
+    DNSHist **          pHist;
     int                 i;
 
     require_action_quiet(inRR || (inQuerySendCount > 0), exit, err = mStatus_NoError);
+    require_action_quiet((inType == kDNSType_A) || (inType == kDNSType_AAAA), exit, err = mStatus_NoError);
 
-    p = inForCell ? &inStats->cellular : &inStats->nonCellular;
-    if ((set = *p) == NULL)
+    pSet = inForCell ? &inStats->cellular : &inStats->nonCellular;
+    if ((set = *pSet) == NULL)
     {
         set = (DNSHistSet *)calloc(1, sizeof(*set));
         require_action_quiet(set, exit, err = mStatus_NoMemoryErr);
-        *p = set;
+        *pSet = set;
     }
-    if ((histAny = set->histAny) == NULL)
+    pHist = (inType == kDNSType_A) ? &set->histA : &set->histAAAA;
+    if ((hist = *pHist) == NULL)
     {
-        histAny = (DNSHist *)calloc(1, sizeof(*histAny));
-        require_action_quiet(histAny, exit, err = mStatus_NoMemoryErr);
-        set->histAny = histAny;
-    }
-    if (inType == kDNSType_A)
-    {
-        if ((hist = set->histA) == NULL)
-        {
-            hist = (DNSHist *)calloc(1, sizeof(*hist));
-            require_action_quiet(hist, exit, err = mStatus_NoMemoryErr);
-            set->histA = hist;
-        }
-    }
-    else if (inType == kDNSType_AAAA)
-    {
-        if ((hist = set->histAAAA) == NULL)
-        {
-            hist = (DNSHist *)calloc(1, sizeof(*hist));
-            require_action_quiet(hist, exit, err = mStatus_NoMemoryErr);
-            set->histAAAA = hist;
-        }
-    }
-    else
-    {
-        hist = NULL;
+        hist = (DNSHist *)calloc(1, sizeof(*hist));
+        require_action_quiet(hist, exit, err = mStatus_NoMemoryErr);
+        *pHist = hist;
     }
 
     if (inRR)
@@ -748,35 +728,23 @@ mDNSlocal mStatus DNSDomainStatsUpdate(DNSDomainStats *inStats, uint16_t inType,
 
         i = Min(inQuerySendCount, kQueryStatsMaxQuerySendCount);
 
-        sendCountBins = isNegative ? histAny->negAnsweredQuerySendCountBins : histAny->answeredQuerySendCountBins;
+        sendCountBins = isNegative ? hist->negAnsweredQuerySendCountBins : hist->answeredQuerySendCountBins;
         increment_saturate(sendCountBins[i], UINT16_MAX);
-        if (hist)
-        {
-            sendCountBins = isNegative ? hist->negAnsweredQuerySendCountBins : hist->answeredQuerySendCountBins;
-            increment_saturate(sendCountBins[i], UINT16_MAX);
-        }
 
         if (inQuerySendCount > 0)
         {
             for (i = 0; (i < (int)countof(kResponseLatencyMsLimits)) && (inLatencyMs >= kResponseLatencyMsLimits[i]); ++i) {}
-            latencyBins = isNegative ? histAny->negResponseLatencyBins : histAny->responseLatencyBins;
+            latencyBins = isNegative ? hist->negResponseLatencyBins : hist->responseLatencyBins;
             increment_saturate(latencyBins[i], UINT16_MAX);
-            if (hist)
-            {
-                latencyBins = isNegative ? hist->negResponseLatencyBins : hist->responseLatencyBins;
-                increment_saturate(latencyBins[i], UINT16_MAX);
-            }
         }
     }
     else
     {
         i = Min(inQuerySendCount, kQueryStatsMaxQuerySendCount);
-        increment_saturate(histAny->unansweredQuerySendCountBins[i], UINT16_MAX);
-        if (hist) increment_saturate(hist->unansweredQuerySendCountBins[i], UINT16_MAX);
+        increment_saturate(hist->unansweredQuerySendCountBins[i], UINT16_MAX);
 
         for (i = 0; (i < (int)countof(kResponseLatencyMsLimits)) && (inLatencyMs >= kResponseLatencyMsLimits[i]); ++i) {}
-        increment_saturate(histAny->unansweredQueryDurationBins[i], UINT16_MAX);
-        if (hist) increment_saturate(hist->unansweredQueryDurationBins[i], UINT16_MAX);
+        increment_saturate(hist->unansweredQueryDurationBins[i], UINT16_MAX);
     }
     err = mStatus_NoError;
 
@@ -1505,7 +1473,7 @@ mDNSlocal void FreeResolveStatsServerList(ResolveStatsDNSServer *inList)
 
 mDNSlocal mStatus SubmitAWDMetric(UInt32 inMetricID)
 {
-    mStatus     err = mStatus_NoError;
+    mStatus     err;
 
     switch (inMetricID)
     {
@@ -1518,11 +1486,12 @@ mDNSlocal mStatus SubmitAWDMetric(UInt32 inMetricID)
             break;
 
         case AWDMetricId_MDNSResponder_ServicesStats:
-            [AWDMetricManagerSoft postMetricWithId:AWDMetricId_MDNSResponder_ServicesStats integerValue:max_num_regservices];
+            [AWDMetricManagerSoft postMetricWithId:AWDMetricId_MDNSResponder_ServicesStats unsignedIntegerValue:max_num_regservices];
             KQueueLock(&mDNSStorage);
             // reset the no of max services since we want to collect the max no of services registered per AWD submission period
             max_num_regservices = curr_num_regservices;
             KQueueUnlock(&mDNSStorage, "SubmitAWDSimpleMetricServiceStats");
+            err = mStatus_NoError;
             break;
             
         default:
@@ -1530,8 +1499,7 @@ mDNSlocal mStatus SubmitAWDMetric(UInt32 inMetricID)
             break;
     }
 
-    if (err)
-        LogMsg("SubmitAWDMetric for metric ID 0x%08X failed with error %d", inMetricID, err);
+    if (err) LogMsg("SubmitAWDMetric for metric ID 0x%08X failed with error %d", inMetricID, err);
     return (err);
 }
 
@@ -1552,9 +1520,8 @@ mDNSlocal mStatus SubmitAWDMetricQueryStats(void)
     err = CreateDomainStatsList(&newDomainStatsList);
     require_noerr_quiet(err, exit);
 
-    domainStatsList = gDomainStatsList;
-
     KQueueLock(&mDNSStorage);
+    domainStatsList = gDomainStatsList;
     gDomainStatsList = newDomainStatsList;
     KQueueUnlock(&mDNSStorage, "SubmitAWDMetricQueryStats");
 
@@ -1611,10 +1578,9 @@ mDNSlocal mStatus SubmitAWDMetricResolveStats(void)
     err = CreateResolveStatsList(&newResolveStatsList);
     require_noerr_quiet(err, exit);
 
+    KQueueLock(&mDNSStorage);
     domainList = gResolveStatsList;
     serverList = gResolveStatsServerList;
-
-    KQueueLock(&mDNSStorage);
     gResolveStatsList           = newResolveStatsList;
     gResolveStatsServerList     = NULL;
     gResolveStatsNextServerID   = 0;
@@ -1762,14 +1728,6 @@ mDNSlocal mStatus AddAWDDNSDomainStats(AWDMDNSResponderDNSStatistics *inMetric,
     mStatus                 err;
     AWDDNSDomainStats *     awdStats;
 
-    if (inSet->histAny)
-    {
-        err = CreateAWDDNSDomainStats(inSet->histAny, inDomain, inForCell, AWDDNSDomainStats_RecordType_Any, &awdStats);
-        require_noerr_quiet(err, exit);
-
-        [inMetric addStats:awdStats];
-        [awdStats release];
-    }
     if (inSet->histA)
     {
         err = CreateAWDDNSDomainStats(inSet->histA, inDomain, inForCell, AWDDNSDomainStats_RecordType_A, &awdStats);
@@ -1798,7 +1756,6 @@ exit:
 
 mDNSlocal void LogDNSHistSet(const DNSHistSet *inSet, const char *inDomain, mDNSBool inForCell)
 {
-    if (inSet->histAny)     LogDNSHist(inSet->histAny,  inDomain, inForCell, "Any");
     if (inSet->histA)       LogDNSHist(inSet->histA,    inDomain, inForCell, "A");
     if (inSet->histAAAA)    LogDNSHist(inSet->histAAAA, inDomain, inForCell, "AAAA");
 }
diff --git a/mDNSResponder/mDNSMacOSX/mDNSMacOSX.c b/mDNSResponder/mDNSMacOSX/mDNSMacOSX.c
index c33c166..d8697fa 100644
--- a/mDNSResponder/mDNSMacOSX/mDNSMacOSX.c
+++ b/mDNSResponder/mDNSMacOSX/mDNSMacOSX.c
@@ -1835,7 +1835,7 @@ mDNSlocal int mDNSPlatformGetSocktFd(void *sockCxt, mDNSTransport_Type transType
     }
 }
 
-mDNSexport void mDNSPlatformSetSocktOpt(void *sockCxt, mDNSTransport_Type transType, mDNSAddr_Type addrType, DNSQuestion *q)
+mDNSexport void mDNSPlatformSetSocktOpt(void *sockCxt, mDNSTransport_Type transType, mDNSAddr_Type addrType, const DNSQuestion *q)
 {
     int sockfd;
     char unenc_name[MAX_ESCAPED_DOMAIN_NAME];
@@ -6966,7 +6966,19 @@ mDNSexport mDNSBool mDNSPlatformSetDNSConfig(mDNS *const m, mDNSBool setservers,
         else
         {
             LogInfo("mDNSPlatformSetDNSConfig: config->n_resolver = %d, generation %llu, last %llu", config->n_resolver, config->generation, m->p->LastConfigGeneration);
-            if (m->p->LastConfigGeneration == config->generation)
+
+            // For every network change, the search domain list is updated.
+            // This update is done without regard for generation number because it is
+            // not an expensive update and it keeps the search domain list in sync (even when
+            // a network change occurs, while currently processing a network
+            // change).
+            //
+            // For every DNS configuration change, the DNS server list is updated.
+            // This update is NOT done every network change because it may involve
+            // updating cache entries which worst-case is expensive. Setting the generation
+            // per DNS server list change keeps the list in sync with configd.
+
+            if (setservers &&  m->p->LastConfigGeneration == config->generation)
             {
                 LogInfo("mDNSPlatformSetDNSConfig: generation number %llu same, not processing", config->generation);
                 dns_configuration_free(config);
@@ -6992,21 +7004,13 @@ mDNSexport mDNSBool mDNSPlatformSetDNSConfig(mDNS *const m, mDNSBool setservers,
 
             ConfigResolvers(m, config, kScopeServiceID, setsearch, setservers, &sdc, resolverGroupID);
 
-            // Acking provides a hint that we processed this current configuration and
-            // we will use that from now on, assuming we don't get another one immediately
-            // after we return from here.
+            // Acking provides a hint to other processes that the current DNS configuration has completed
+            // its update.  When configd receives the ack, it publishes a notification.
+            // Applications monitoring the notification then know when to re-issue their DNS queries
+            // after a network change occurs.
             if (ackConfig)
             {
                 // Note: We have to set the generation number here when we are acking.
-                // For every DNS configuration change, we do the following:
-                //
-                // 1) Copy dns configuration, handle search domains change
-                // 2) Copy dns configuration, handle dns server change
-                //
-                // If we update the generation number at step (1), we won't process the
-                // DNS servers the second time because generation number would be the same.
-                // As we ack only when we process dns servers, we set the generation number
-                // during acking.
                 m->p->LastConfigGeneration = config->generation;
                 LogInfo("mDNSPlatformSetDNSConfig: Acking configuration setservers %d, setsearch %d", setservers, setsearch);
                 AckConfigd(m, config);
diff --git a/mDNSResponder/mDNSPosix/Responder.c b/mDNSResponder/mDNSPosix/Responder.c
index 3996b7b..7a77bcd 100755
--- a/mDNSResponder/mDNSPosix/Responder.c
+++ b/mDNSResponder/mDNSPosix/Responder.c
@@ -503,6 +503,7 @@ static mStatus RegisterServicesInFile(const char *filePath)
 {
     mStatus status = mStatus_NoError;
     FILE *      fp = fopen(filePath, "r");
+    int rv;
 
     if (fp == NULL) {
         return mStatus_UnknownErr;
@@ -603,7 +604,8 @@ static mStatus RegisterServicesInFile(const char *filePath)
         status = mStatus_UnknownErr;
     }
 
-    assert(0 == fclose(fp));
+    rv = fclose(fp);
+    assert(rv == 0);
 
     return status;
 }
diff --git a/mDNSResponder/mDNSPosix/mDNSPosix.c b/mDNSResponder/mDNSPosix/mDNSPosix.c
index 0763370..857c583 100755
--- a/mDNSResponder/mDNSPosix/mDNSPosix.c
+++ b/mDNSResponder/mDNSPosix/mDNSPosix.c
@@ -584,11 +584,20 @@ mDNSexport mDNSu32 mDNSPlatformInterfaceIndexfromInterfaceID(mDNS *const m, mDNS
 // interface must have already been deregistered with the mDNS core.
 mDNSlocal void FreePosixNetworkInterface(PosixNetworkInterface *intf)
 {
+    int rv;
     assert(intf != NULL);
     if (intf->intfName != NULL) free((void *)intf->intfName);
-    if (intf->multicastSocket4 != -1) assert(close(intf->multicastSocket4) == 0);
+    if (intf->multicastSocket4 != -1)
+    {
+        rv = close(intf->multicastSocket4);
+        assert(rv == 0);
+    }
 #if HAVE_IPV6
-    if (intf->multicastSocket6 != -1) assert(close(intf->multicastSocket6) == 0);
+    if (intf->multicastSocket6 != -1)
+    {
+        rv = close(intf->multicastSocket6);
+        assert(rv == 0);
+    }
 #endif
 
     // Move interface to the RecentInterfaces list for a minute
@@ -851,7 +860,13 @@ mDNSlocal int SetupSocket(struct sockaddr *intfAddr, mDNSIPPort port, int interf
     }
 
     // Clean up
-    if (err != 0 && *sktPtr != -1) { assert(close(*sktPtr) == 0); *sktPtr = -1; }
+    if (err != 0 && *sktPtr != -1)
+    {
+        int rv;
+        rv = close(*sktPtr);
+        assert(rv == 0);
+        *sktPtr = -1;
+    }
     assert((err == 0) == (*sktPtr != -1));
     return err;
 }
@@ -1353,11 +1368,20 @@ mDNSexport mStatus mDNSPlatformInit(mDNS *const m)
 // In our case all we need to do is to tear down every network interface.
 mDNSexport void mDNSPlatformClose(mDNS *const m)
 {
+    int rv;
     assert(m != NULL);
     ClearInterfaceList(m);
-    if (m->p->unicastSocket4 != -1) assert(close(m->p->unicastSocket4) == 0);
+    if (m->p->unicastSocket4 != -1)
+    {
+        rv = close(m->p->unicastSocket4);
+        assert(rv == 0);
+    }
 #if HAVE_IPV6
-    if (m->p->unicastSocket6 != -1) assert(close(m->p->unicastSocket6) == 0);
+    if (m->p->unicastSocket6 != -1)
+    {
+        rv = close(m->p->unicastSocket6);
+        assert(rv == 0);
+    }
 #endif
 }
 
@@ -1662,7 +1686,7 @@ mDNSexport mDNSBool mDNSPlatformInterfaceIsD2D(mDNSInterfaceID InterfaceID)
     return mDNSfalse;
 }
 
-mDNSexport void mDNSPlatformSetSocktOpt(void *sock, mDNSTransport_Type transType, mDNSAddr_Type addrType, DNSQuestion *q)
+mDNSexport void mDNSPlatformSetSocktOpt(void *sock, mDNSTransport_Type transType, mDNSAddr_Type addrType, const DNSQuestion *q)
 {
     (void) sock;
     (void) transType;
diff --git a/mDNSResponder/mDNSPosix/mDNSUNP.c b/mDNSResponder/mDNSPosix/mDNSUNP.c
index 3cfeac6..a7aafb2 100755
--- a/mDNSResponder/mDNSPosix/mDNSUNP.c
+++ b/mDNSResponder/mDNSPosix/mDNSUNP.c
@@ -199,7 +199,9 @@ gotError:
     }
 done:
     if (sockfd != -1) {
-        assert(close(sockfd) == 0);
+        int rv;
+        rv = close(sockfd);
+        assert(rv == 0);
     }
     if (fp != NULL) {
         fclose(fp);
diff --git a/mDNSResponder/mDNSShared/dns_sd.h b/mDNSResponder/mDNSShared/dns_sd.h
index 25a5347..e34c6d9 100644
--- a/mDNSResponder/mDNSShared/dns_sd.h
+++ b/mDNSResponder/mDNSShared/dns_sd.h
@@ -66,7 +66,7 @@
  */
 
 #ifndef _DNS_SD_H
-#define _DNS_SD_H 7652004
+#define _DNS_SD_H 7653011
 
 #ifdef  __cplusplus
 extern "C" {
diff --git a/mDNSResponder/mDNSWindows/mDNSWin32.c b/mDNSResponder/mDNSWindows/mDNSWin32.c
index 011125b..f2c4319 100755
--- a/mDNSResponder/mDNSWindows/mDNSWin32.c
+++ b/mDNSResponder/mDNSWindows/mDNSWin32.c
@@ -2152,7 +2152,7 @@ mDNSexport mStatus mDNSPlatformRetrieveTCPInfo(mDNS *const m, mDNSAddr *laddr, m
 	return mStatus_UnsupportedErr;
 }
 
-mDNSexport void mDNSPlatformSetSocktOpt(void *sock, mDNSTransport_Type transType, mDNSAddr_Type addrType, DNSQuestion *q)
+mDNSexport void mDNSPlatformSetSocktOpt(void *sock, mDNSTransport_Type transType, mDNSAddr_Type addrType, const DNSQuestion *q)
     {
     (void) sock;
     (void) transType;




More information about the vc mailing list