Author: zym
Date: Sat Dec 24 13:04:42 2011
New Revision: 1222967
URL: http://svn.apache.org/viewvc?rev=1222967&view=rev
Log:
TS-1029 DNS crash if we free the memory into system
Author: weijin
Review: zym
Modified:
trafficserver/traffic/trunk/iocore/dns/DNS.cc
Modified: trafficserver/traffic/trunk/iocore/dns/DNS.cc
URL:
http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/dns/DNS.cc?rev=1222967&r1=1222966&r2=1222967&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/dns/DNS.cc (original)
+++ trafficserver/traffic/trunk/iocore/dns/DNS.cc Sat Dec 24 13:04:42 2011
@@ -150,7 +150,7 @@ make_ipv4_ptr(in_addr_t addr, char *buff
*p++ = ((u[0] / 10) % 10) + '0';
*p++ = u[0] % 10 + '0';
*p++ = '.';
- ink_strlcpy(p, "in-addr.arpa", MAXDNAME - (p - buffer + 1));
+ ink_strlcpy(p, "in-addr.arpa", MAXDNAME - (p - buffer + 1));
}
void
@@ -1217,14 +1217,36 @@ dns_result(DNSHandler *h, DNSEntry *e, H
goto Lretry;
}
}
- if (!e->post(h, ent)) {
+
+ if (e->timeout) {
+ e->timeout->cancel(e);
+ e->timeout = NULL;
+ }
+ e->result_ent = ent;
+
+ if (h->mutex->thread_holding == e->submit_thread) {
+ MUTEX_TRY_LOCK(lock, e->action.mutex, h->mutex->thread_holding);
+ if (!lock) {
+ Debug("dns", "failed lock for result %s", e->qname);
+ goto Lretry;
+ }
for (int i = 0; i < MAX_DNS_RETRIES; i++) {
if (e->id[i] < 0)
break;
- h->release_query_id(e->id[i]);
+ h->release_query_id(e->id[i]);
}
- return;
+ e->postEvent(0, 0);
+ } else {
+ for (int i = 0; i < MAX_DNS_RETRIES; i++) {
+ if (e->id[i] < 0)
+ break;
+ h->release_query_id(e->id[i]);
+ }
+ e->mutex = e->action.mutex;
+ SET_CONTINUATION_HANDLER(e, &DNSEntry::postEvent);
+ e->submit_thread->schedule_imm_signal(e);
}
+ return;
Lretry:
e->result_ent = ent;
e->retries = 0;