static void idnsGrokReply(const char *buf, size_t sz) { int n; int valid; rfc1035_rr *answers = NULL; unsigned short rid = 0xFFFF; idns_query *q; n = rfc1035AnswersUnpack(buf, sz, &answers, &rid); debug(78, 3) ("idnsGrokReply: ID %#hx, %d answers\n", rid, n); if (rid == 0xFFFF) { debug(78, 1) ("idnsGrokReply: Unknown error\n"); /* XXX leak answers? */ return; } q = idnsFindQuery(rid); if (q == NULL) { debug(78, 3) ("idnsGrokReply: Late response\n"); rfc1035RRDestroy(answers, n); return; } dlinkDelete(&q->lru, &lru_list); idnsRcodeCount(n, q->attempt); if (n < 0) { debug(78, 3) ("idnsGrokReply: error %d\n", rfc1035_errno); if (-2 == n && ++q->attempt < MAX_ATTEMPT) { /* * RCODE 2 is "Server failure - The name server was * unable to process this query due to a problem with * the name server." */ assert(NULL == answers); q->start_t = current_time; q->id = rfc1035RetryQuery(q->buf); idnsSendQuery(q); return; } } valid = cbdataValid(q->callback_data); cbdataUnlock(q->callback_data); if (valid) q->callback(q->callback_data, answers, n); rfc1035RRDestroy(answers, n); memFree(q, MEM_IDNS_QUERY); }
void rfc1035MessageDestroy(rfc1035_message * msg) { if (!msg) return; if (msg->query) acl_myfree(msg->query); if (msg->answer) rfc1035RRDestroy(msg->answer, msg->ancount); acl_myfree(msg); }