diff options
author | Benny Prijono <bennylp@teluu.com> | 2007-03-02 14:35:57 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2007-03-02 14:35:57 +0000 |
commit | c0ad24645c062d3ce27fc5c3e85b08cafe1d4ad1 (patch) | |
tree | 30c393db984530c9bd4963da5466db609e701f15 /pjlib-util/src | |
parent | 68446a09672bbb32172f7bebb0efb3a838a2d827 (diff) |
Fixed ticket #156: Not enough memory to parse DNS packets in resolver (thanks Frank Wiersma)
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1031 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjlib-util/src')
-rw-r--r-- | pjlib-util/src/pjlib-util/dns.c | 17 | ||||
-rw-r--r-- | pjlib-util/src/pjlib-util/dns_dump.c | 5 | ||||
-rw-r--r-- | pjlib-util/src/pjlib-util/resolver.c | 16 |
3 files changed, 18 insertions, 20 deletions
diff --git a/pjlib-util/src/pjlib-util/dns.c b/pjlib-util/src/pjlib-util/dns.c index 71bad5b6..a3c3217b 100644 --- a/pjlib-util/src/pjlib-util/dns.c +++ b/pjlib-util/src/pjlib-util/dns.c @@ -340,11 +340,7 @@ static pj_status_t parse_rr(pj_dns_parsed_rr *rr, pj_pool_t *pool, /* Parse some well known records */ if (rr->type == PJ_DNS_TYPE_A) { - pj_in_addr ip_addr; - - pj_memcpy(&ip_addr, p, 4); - pj_strdup2(pool, &rr->rdata.a.ip_addr, pj_inet_ntoa(ip_addr)); - + pj_memcpy(&rr->rdata.a.ip_addr, p, 4); p += 4; } else if (rr->type == PJ_DNS_TYPE_CNAME || @@ -587,7 +583,7 @@ static void copy_rr(pj_pool_t *pool, pj_dns_parsed_rr *dst, apply_name_table(nametable_count, nametable, &src->rdata.srv.target, pool, &dst->rdata.srv.target); } else if (src->type == PJ_DNS_TYPE_A) { - pj_strdup(pool, &dst->rdata.a.ip_addr, &src->rdata.a.ip_addr); + dst->rdata.a.ip_addr.s_addr = src->rdata.a.ip_addr.s_addr; } else if (src->type == PJ_DNS_TYPE_CNAME) { pj_strdup(pool, &dst->rdata.cname.name, &src->rdata.cname.name); } else if (src->type == PJ_DNS_TYPE_NS) { @@ -602,6 +598,7 @@ static void copy_rr(pj_pool_t *pool, pj_dns_parsed_rr *dst, */ PJ_DEF(void) pj_dns_packet_dup(pj_pool_t *pool, const pj_dns_parsed_packet*p, + unsigned options, pj_dns_parsed_packet **p_dst) { pj_dns_parsed_packet *dst; @@ -630,7 +627,7 @@ PJ_DEF(void) pj_dns_packet_dup(pj_pool_t *pool, /* Copy query section */ - if (p->hdr.qdcount) { + if (p->hdr.qdcount && (options & PJ_DNS_NO_QD)==0) { dst->q = pj_pool_alloc(pool, p->hdr.qdcount * sizeof(pj_dns_parsed_query)); for (i=0; i<p->hdr.qdcount; ++i) { @@ -641,7 +638,7 @@ PJ_DEF(void) pj_dns_packet_dup(pj_pool_t *pool, } /* Copy answer section */ - if (p->hdr.anscount) { + if (p->hdr.anscount && (options & PJ_DNS_NO_ANS)==0) { dst->ans = pj_pool_alloc(pool, p->hdr.anscount * sizeof(pj_dns_parsed_rr)); for (i=0; i<p->hdr.anscount; ++i) { @@ -652,7 +649,7 @@ PJ_DEF(void) pj_dns_packet_dup(pj_pool_t *pool, } /* Copy NS section */ - if (p->hdr.nscount) { + if (p->hdr.nscount && (options & PJ_DNS_NO_NS)==0) { dst->ns = pj_pool_alloc(pool, p->hdr.nscount * sizeof(pj_dns_parsed_rr)); for (i=0; i<p->hdr.nscount; ++i) { @@ -663,7 +660,7 @@ PJ_DEF(void) pj_dns_packet_dup(pj_pool_t *pool, } /* Copy additional info section */ - if (p->hdr.arcount) { + if (p->hdr.arcount && (options & PJ_DNS_NO_AR)==0) { dst->arr = pj_pool_alloc(pool, p->hdr.arcount * sizeof(pj_dns_parsed_rr)); for (i=0; i<p->hdr.arcount; ++i) { diff --git a/pjlib-util/src/pjlib-util/dns_dump.c b/pjlib-util/src/pjlib-util/dns_dump.c index 2a3e803d..d493323a 100644 --- a/pjlib-util/src/pjlib-util/dns_dump.c +++ b/pjlib-util/src/pjlib-util/dns_dump.c @@ -115,9 +115,8 @@ static void dump_answer(unsigned index, const pj_dns_parsed_rr *rr) (int)rr->rdata.cname.name.slen, rr->rdata.cname.name.ptr)); } else if (rr->type == PJ_DNS_TYPE_A) { - PJ_LOG(3,(THIS_FILE, " IP address: %.*s", - (int)rr->rdata.a.ip_addr.slen, - rr->rdata.a.ip_addr.ptr)); + PJ_LOG(3,(THIS_FILE, " IP address: %s", + pj_inet_ntoa(rr->rdata.a.ip_addr))); } } diff --git a/pjlib-util/src/pjlib-util/resolver.c b/pjlib-util/src/pjlib-util/resolver.c index 24304482..d4a950e2 100644 --- a/pjlib-util/src/pjlib-util/resolver.c +++ b/pjlib-util/src/pjlib-util/resolver.c @@ -51,6 +51,7 @@ #define RES_BUF_SZ PJ_DNS_RESOLVER_RES_BUF_SIZE #define UDPSZ PJ_DNS_RESOLVER_MAX_UDP_SIZE +#define TMP_SZ PJ_DNS_RESOLVER_TMP_BUF_SIZE /* Nameserver state */ @@ -161,7 +162,7 @@ struct pj_dns_resolver pj_timer_heap_t *timer; /**< Timer instance. */ pj_bool_t own_ioqueue; /**< Do we own ioqueue? */ pj_ioqueue_t *ioqueue; /**< Ioqueue instance. */ - char tmp_pool[1500];/**< Temporary pool buffer. */ + char tmp_pool[TMP_SZ];/**< Temporary pool buffer. */ /* Socket */ pj_sock_t udp_sock; /**< UDP socket. */ @@ -993,11 +994,16 @@ static void update_res_cache(pj_dns_resolver *resolver, } } - /* Duplicate the packet */ + /* Duplicate the packet. + * We don't need to keep the query, NS, and AR sections from the packet, + * so exclude from duplication. + */ res_pool = pj_pool_create_on_buf("respool", cache->buf, sizeof(cache->buf)); PJ_TRY { cache->pkt = NULL; - pj_dns_packet_dup(res_pool, pkt, &cache->pkt); + pj_dns_packet_dup(res_pool, pkt, + PJ_DNS_NO_QD | PJ_DNS_NO_NS | PJ_DNS_NO_AR, + &cache->pkt); } PJ_CATCH_ANY { PJ_LOG(1,(THIS_FILE, @@ -1223,10 +1229,6 @@ static void on_read_complete(pj_ioqueue_key_t *key, } } - /* We don't need NS and query section in the packet, so trim them. */ - dns_pkt->hdr.qdcount = 0; - dns_pkt->hdr.nscount = 0; - /* Save/update response cache. */ update_res_cache(resolver, &q->key, status, PJ_TRUE, dns_pkt); |