summaryrefslogtreecommitdiffstats
path: root/mDNSResponder/mDNSCore
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2018-09-19 08:49:34 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2018-09-20 11:23:31 +0200
commite36ca101817ed47e788f1f2801190718736e834e (patch)
treefe04e4574145d3f6359e41690d7685093e762762 /mDNSResponder/mDNSCore
parentmDNSResponder: Update to v561.1.1 (diff)
downloadrtems-libbsd-e36ca101817ed47e788f1f2801190718736e834e.tar.bz2
mDNSResponder: Update to v567
The sources can be obtained via: https://opensource.apple.com/tarballs/mDNSResponder/mDNSResponder-567.tar.gz Update #3522.
Diffstat (limited to 'mDNSResponder/mDNSCore')
-rw-r--r--mDNSResponder/mDNSCore/DNSCommon.c11
-rwxr-xr-xmDNSResponder/mDNSCore/mDNS.c4
-rwxr-xr-xmDNSResponder/mDNSCore/mDNSEmbeddedAPI.h3
-rwxr-xr-xmDNSResponder/mDNSCore/uDNS.c12
4 files changed, 24 insertions, 6 deletions
diff --git a/mDNSResponder/mDNSCore/DNSCommon.c b/mDNSResponder/mDNSCore/DNSCommon.c
index 947607cf..3b2f2ceb 100644
--- a/mDNSResponder/mDNSCore/DNSCommon.c
+++ b/mDNSResponder/mDNSCore/DNSCommon.c
@@ -370,7 +370,7 @@ mDNSexport char *GetRRDisplayString_rdb(const ResourceRecord *const rr, const RD
char *ptr = buffer;
mDNSu32 length = mDNS_snprintf(buffer, MaxMsg-1, "%4d %##s %s ", rr->rdlength, rr->name->c, DNSTypeName(rr->rrtype));
if (rr->RecordType == kDNSRecordTypePacketNegative) return(buffer);
- if (!rr->rdlength) { mDNS_snprintf(buffer+length, RemSpc, "<< ZERO RDATA LENGTH >>"); return(buffer); }
+ if (!rr->rdlength && rr->rrtype != kDNSType_OPT) { mDNS_snprintf(buffer+length, RemSpc, "<< ZERO RDATA LENGTH >>"); return(buffer); }
switch (rr->rrtype)
{
@@ -408,6 +408,7 @@ mDNSexport char *GetRRDisplayString_rdb(const ResourceRecord *const rr, const RD
switch(opt->opt)
{
case kDNSOpt_LLQ:
+ length += mDNS_snprintf(buffer+length, RemSpc, " LLQ");
length += mDNS_snprintf(buffer+length, RemSpc, " Vers %d", opt->u.llq.vers);
length += mDNS_snprintf(buffer+length, RemSpc, " Op %d", opt->u.llq.llqOp);
length += mDNS_snprintf(buffer+length, RemSpc, " Err/Port %d", opt->u.llq.err);
@@ -418,6 +419,7 @@ mDNSexport char *GetRRDisplayString_rdb(const ResourceRecord *const rr, const RD
length += mDNS_snprintf(buffer+length, RemSpc, " Lease %d", opt->u.updatelease);
break;
case kDNSOpt_Owner:
+ length += mDNS_snprintf(buffer+length, RemSpc, " Owner");
length += mDNS_snprintf(buffer+length, RemSpc, " Vers %d", opt->u.owner.vers);
length += mDNS_snprintf(buffer+length, RemSpc, " Seq %3d", (mDNSu8)opt->u.owner.seq); // Display as unsigned
length += mDNS_snprintf(buffer+length, RemSpc, " MAC %.6a", opt->u.owner.HMAC.b);
@@ -429,6 +431,7 @@ mDNSexport char *GetRRDisplayString_rdb(const ResourceRecord *const rr, const RD
}
break;
case kDNSOpt_Trace:
+ length += mDNS_snprintf(buffer+length, RemSpc, " Trace");
length += mDNS_snprintf(buffer+length, RemSpc, " Platform %d", opt->u.tracer.platf);
length += mDNS_snprintf(buffer+length, RemSpc, " mDNSVers %d", opt->u.tracer.mDNSv);
break;
@@ -3201,6 +3204,12 @@ mDNSexport mDNSBool SetRData(const DNSMessage *const msg, const mDNSu8 *ptr, con
opt->u.tracer.mDNSv = (mDNSu32) ((mDNSu32)ptr[1] << 24 | (mDNSu32)ptr[2] << 16 | (mDNSu32)ptr[3] << 8 | ptr[4]);
opt++;
}
+ else
+ {
+ opt->u.tracer.platf = 0xFF;
+ opt->u.tracer.mDNSv = 0xFFFFFFFF;
+ opt++;
+ }
break;
}
ptr += currentopt->optlen;
diff --git a/mDNSResponder/mDNSCore/mDNS.c b/mDNSResponder/mDNSCore/mDNS.c
index 71c7a395..e15b7cf8 100755
--- a/mDNSResponder/mDNSCore/mDNS.c
+++ b/mDNSResponder/mDNSCore/mDNS.c
@@ -23,7 +23,7 @@
* routines, or types (which may or may not be present on any given platform).
*/
-#include "DNSCommon.h" // Defines general DNS untility routines
+#include "DNSCommon.h" // Defines general DNS utility routines
#include "uDNS.h" // Defines entry points into unicast-specific routines
#include "nsec.h"
#include "dnssec.h"
@@ -11170,7 +11170,7 @@ mDNSlocal mDNSBool CacheRecordRmvEventsForQuestion(mDNS *const m, DNSQuestion *q
mDNSlocal void SuppressStatusChanged(mDNS *const m, DNSQuestion *q, DNSQuestion **restart)
{
// NOTE: CacheRecordRmvEventsForQuestion will not generate RMV events for queries that have non-zero
- // LOddressAnswers. Hence it is important that we call CacheRecordRmvEventsForQuestion before
+ // LOAddressAnswers. Hence it is important that we call CacheRecordRmvEventsForQuestion before
// LocalRecordRmvEventsForQuestion (which decrements LOAddressAnswers)
if (q->SuppressQuery)
{
diff --git a/mDNSResponder/mDNSCore/mDNSEmbeddedAPI.h b/mDNSResponder/mDNSCore/mDNSEmbeddedAPI.h
index 785ed3fe..81b4192b 100755
--- a/mDNSResponder/mDNSCore/mDNSEmbeddedAPI.h
+++ b/mDNSResponder/mDNSCore/mDNSEmbeddedAPI.h
@@ -96,6 +96,9 @@ extern "C" {
#ifdef LIMITED_RESOURCES_TARGET
// Don't support jumbo frames
#define AbsoluteMaxDNSMessageData 1500
+// By the time you add IPv6 header (40 bytes) UDP header (8 bytes) and DNS message header (12 bytes)
+// this makes 1560 which is 60 bytes over the standard Ethernet MTU. D'oh!
+
// StandardAuthRDSize is 264 (256+8), which is large enough to hold a maximum-sized SRV record (6 + 256 bytes)
#define MaximumRDSize 264
// Don't cache anything
diff --git a/mDNSResponder/mDNSCore/uDNS.c b/mDNSResponder/mDNSCore/uDNS.c
index be7a5a32..8c7c3300 100755
--- a/mDNSResponder/mDNSCore/uDNS.c
+++ b/mDNSResponder/mDNSCore/uDNS.c
@@ -1329,7 +1329,8 @@ mDNSlocal void tcpCallback(TCPSocket *sock, void *context, mDNSBool ConnectionEs
else
{
long n;
- if (tcpInfo->nread < 2) // First read the two-byte length preceeding the DNS message
+ const mDNSBool Read_replylen = (tcpInfo->nread < 2); // Do we need to read the replylen field first?
+ if (Read_replylen) // First read the two-byte length preceeding the DNS message
{
mDNSu8 *lenptr = (mDNSu8 *)&tcpInfo->replylen;
n = mDNSPlatformReadTCP(sock, lenptr + tcpInfo->nread, 2 - tcpInfo->nread, &closed);
@@ -1377,8 +1378,13 @@ mDNSlocal void tcpCallback(TCPSocket *sock, void *context, mDNSBool ConnectionEs
if (n < 0)
{
- LogMsg("ERROR: tcpCallback - read returned %d", n);
- err = mStatus_ConnFailed;
+ // If this is our only read for this invokation, and it fails, then that's bad.
+ // But if we did successfully read some or all of the replylen field this time through,
+ // and this is now our second read from the socket, then it's expected that sometimes
+ // there may be no more data present, and that's perfectly okay.
+ // Assuming failure of the second read is a problem is what caused this bug:
+ // <rdar://problem/15043194> mDNSResponder fails to read DNS over TCP packet correctly
+ if (!Read_replylen) { LogMsg("ERROR: tcpCallback - read returned %d", n); err = mStatus_ConnFailed; }
goto exit;
}
else if (closed)