From 406a2f4c8a51d251c88f42154b6f57619a22ef3b Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Thu, 23 Jan 2014 14:59:37 +0100 Subject: mDNS: AnonInfoAnswersQuestion: Fix stack usage The mDNSexport is normally defined to be empty, thus mDNSStorage is a huge stack variable (roughly 50KiB) with random data. Asuming a global mDNSStorage variable in the mDNSCore makes no sense. --- mDNSResponder/mDNSCore/anonymous.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) (limited to 'mDNSResponder') diff --git a/mDNSResponder/mDNSCore/anonymous.c b/mDNSResponder/mDNSCore/anonymous.c index 94b102ec..55a83175 100644 --- a/mDNSResponder/mDNSCore/anonymous.c +++ b/mDNSResponder/mDNSCore/anonymous.c @@ -249,12 +249,17 @@ mDNSexport void SetAnonData(DNSQuestion *q, ResourceRecord *rr, mDNSBool ForQues } } +mDNSlocal char *RRDisplayStringBuf(const ResourceRecord *const rr, char *const buffer) +{ + return GetRRDisplayString_rdb(rr, &rr->rdata->u, buffer); +} + // returns -1 if the caller should ignore the result // returns 1 if the record answers the question // returns 0 if the record does not answer the question mDNSexport int AnonInfoAnswersQuestion(const ResourceRecord *const rr, const DNSQuestion *const q) { - mDNSexport mDNS mDNSStorage; + char MsgBuffer[MaxMsg]; // Temp storage used while building error log messages ResourceRecord *nsec3RR; int i; AnonymousInfo *qai, *rai; @@ -337,7 +342,7 @@ mDNSexport int AnonInfoAnswersQuestion(const ResourceRecord *const rr, const DNS mDNSPlatformMemCmp(qai->AnonData, rai->AnonData, qai->AnonDataLen) != 0) { debugf("AnonInfoAnswersQuestion: AnonData mis-match for record %s question %##s ", - RRDisplayString(&mDNSStorage, rr), q->qname.c); + RRDisplayStringBuf(rr, MsgBuffer), q->qname.c); return 0; } // AnonData matches i.e they belong to the same group and the same service. @@ -375,10 +380,10 @@ mDNSexport int AnonInfoAnswersQuestion(const ResourceRecord *const rr, const DNS // AnonData can be NULL for the cache entry and if we are hearing our own question back, AnonData is NULL for // that too and we can end up here for that case. debugf("AnonInfoAnswersQuestion: AnonData %p or nsec3RR %p, NULL for question %##s, record %s", AnonData, nsec3RR, - q->qname.c, RRDisplayString(&mDNSStorage, rr)); + q->qname.c, RRDisplayStringBuf(rr, MsgBuffer)); return 0; } - debugf("AnonInfoAnswersQuestion: Validating question %##s, ResourceRecord %s", q->qname.c, RRDisplayString(&mDNSStorage, nsec3RR)); + debugf("AnonInfoAnswersQuestion: Validating question %##s, ResourceRecord %s", q->qname.c, RRDisplayStringBuf(nsec3RR, MsgBuffer)); nsec3 = (rdataNSEC3 *)nsec3RR->rdata->u.data; @@ -410,7 +415,7 @@ mDNSexport int AnonInfoAnswersQuestion(const ResourceRecord *const rr, const DNS return 0; } } - LogInfo("AnonInfoAnswersQuestion: ResourceRecord %s matched question %##s (%s)", RRDisplayString(&mDNSStorage, nsec3RR), q->qname.c, DNSTypeName(q->qtype)); + LogInfo("AnonInfoAnswersQuestion: ResourceRecord %s matched question %##s (%s)", RRDisplayStringBuf(nsec3RR, MsgBuffer), q->qname.c, DNSTypeName(q->qtype)); return 1; } -- cgit v1.2.3