version 258.14
diff --git a/Makefile b/Makefile
index d112435..89f009d 100644
--- a/Makefile
+++ b/Makefile
@@ -16,7 +16,7 @@
include /Developer/Makefiles/pb_makefiles/platform.make
-MVERS = "mDNSResponder-258.13"
+MVERS = "mDNSResponder-258.14"
DDNSWRITECONFIG = "$(DSTROOT)/Library/Application Support/Bonjour/ddnswriteconfig"
diff --git a/mDNSCore/mDNS.c b/mDNSCore/mDNS.c
index 3b69ecc..91f37de 100755
--- a/mDNSCore/mDNS.c
+++ b/mDNSCore/mDNS.c
@@ -2858,6 +2858,15 @@
mDNS_StopQuery_internal(m, q); // Stop old query
AssignDomainName(&q->qname, &rr->resrec.rdata->u.name); // Update qname
q->qnamehash = DomainNameHashValue(&q->qname); // and namehash
+ // If a unicast query results in a CNAME that points to a .local, we need to re-try
+ // this as unicast. Setting the mDNSInterface_Unicast tells mDNS_StartQuery_internal
+ // to try this as unicast query even though it is a .local name
+ if (!mDNSOpaque16IsZero(q->TargetQID) && IsLocalDomain(&q->qname))
+ {
+ LogInfo("AnswerCurrentQuestionWithResourceRecord: Resolving a .local CNAME %p %##s (%s) CacheRecord %s",
+ q, q->qname.c, DNSTypeName(q->qtype), CRDisplayString(m, rr));
+ q->InterfaceID = mDNSInterface_Unicast;
+ }
mDNS_StartQuery_internal(m, q); // start new query
// Record how many times we've done this. We need to do this *after* mDNS_StartQuery_internal,
// because mDNS_StartQuery_internal re-initializes CNAMEReferrals to zero
@@ -7067,7 +7076,7 @@
// We still want the ability to be able to listen to the local services and hence
// don't fail .local requests. We always have a loopback interface which we don't
// check here.
- if (IsLocalDomain(qname)) { LogInfo("ShouldSuppressQuery: Query not suppressed for %##s, qtype %s, Local question", qname, DNSTypeName(qtype)); return mDNSfalse; }
+ if (InterfaceID != mDNSInterface_Unicast && IsLocalDomain(qname)) { LogInfo("ShouldSuppressQuery: Query not suppressed for %##s, qtype %s, Local question", qname, DNSTypeName(qtype)); return mDNSfalse; }
// Skip Private domains as we have special addresses to get the hosts in the Private domain
AuthInfo = GetAuthInfoForName_internal(m, qname);
@@ -7083,7 +7092,7 @@
if (i->ip.type != iptype) continue;
if (!InterfaceID || (InterfaceID == mDNSInterface_LocalOnly) || (InterfaceID == mDNSInterface_P2P) ||
- (i->InterfaceID == InterfaceID))
+ (InterfaceID == mDNSInterface_Unicast) || (i->InterfaceID == InterfaceID))
{
if (iptype == mDNSAddrType_IPv4 && !mDNSv4AddressIsLoopback(&i->ip.ip.v4) && !mDNSv4AddressIsLinkLocal(&i->ip.ip.v4))
{
diff --git a/mDNSShared/dns_sd.h b/mDNSShared/dns_sd.h
index 2ed91f0..7632a22 100644
--- a/mDNSShared/dns_sd.h
+++ b/mDNSShared/dns_sd.h
@@ -77,7 +77,7 @@
*/
#ifndef _DNS_SD_H
-#define _DNS_SD_H 2581300
+#define _DNS_SD_H 2581400
#ifdef __cplusplus
extern "C" {