Changeset 1031


Ignore:
Timestamp:
Mar 2, 2007 2:35:57 PM (13 years ago)
Author:
bennylp
Message:

Fixed ticket #156: Not enough memory to parse DNS packets in resolver (thanks Frank Wiersma)

Location:
pjproject/trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjlib-util/include/pjlib-util/config.h

    r1003 r1031  
    170170 
    171171 
     172/** 
     173 * Size of temporary pool buffer for parsing DNS packets in resolver. 
     174 * 
     175 * default: 4000 
     176 */ 
     177#ifndef PJ_DNS_RESOLVER_TMP_BUF_SIZE 
     178#   define PJ_DNS_RESOLVER_TMP_BUF_SIZE             4000 
     179#endif 
     180 
    172181 
    173182/* ************************************************************************** 
  • pjproject/trunk/pjlib-util/include/pjlib-util/dns.h

    r974 r1031  
    2626 */ 
    2727#include <pjlib-util/types.h> 
    28  
     28#include <pj/sock.h> 
    2929 
    3030PJ_BEGIN_DECL 
     
    259259        /** A Resource Data (PJ_DNS_TYPE_A, 1) */ 
    260260        struct a { 
    261             pj_str_t    ip_addr;/**< IP host address string.                */ 
     261            //pj_str_t  ip_addr;/**< IP host address string.                */ 
     262            pj_in_addr  ip_addr; 
    262263        } a; 
    263264 
     
    280281    pj_dns_parsed_rr    *arr;   /**< Array of additional RR answer.         */ 
    281282} pj_dns_parsed_packet; 
     283 
     284 
     285/** 
     286 * Option flags to be specified when calling #pj_dns_packet_dup() function. 
     287 * These flags can be combined with bitwise OR operation. 
     288 */ 
     289enum pj_dns_dup_options 
     290{ 
     291    PJ_DNS_NO_QD    = 1, /**< Do not duplicate the query section.           */ 
     292    PJ_DNS_NO_ANS   = 2, /**< Do not duplicate the answer section.          */ 
     293    PJ_DNS_NO_NS    = 4, /**< Do not duplicate the NS section.              */ 
     294    PJ_DNS_NO_AR    = 8  /**< Do not duplicate the additional rec section   */ 
     295}; 
    282296 
    283297 
     
    332346 * @param pool          The pool to allocate memory for the duplicated packet. 
    333347 * @param p             The DNS packet to be cloned. 
     348 * @param options       Option flags, from pj_dns_dup_options. 
    334349 * @param p_dst         Pointer to store the cloned DNS packet. 
    335350 */ 
    336351PJ_DECL(void) pj_dns_packet_dup(pj_pool_t *pool, 
    337352                                const pj_dns_parsed_packet*p, 
     353                                unsigned options, 
    338354                                pj_dns_parsed_packet **p_dst); 
    339355 
  • pjproject/trunk/pjlib-util/src/pjlib-util/dns.c

    r974 r1031  
    341341    /* Parse some well known records */ 
    342342    if (rr->type == PJ_DNS_TYPE_A) { 
    343         pj_in_addr ip_addr; 
    344  
    345         pj_memcpy(&ip_addr, p, 4); 
    346         pj_strdup2(pool, &rr->rdata.a.ip_addr, pj_inet_ntoa(ip_addr)); 
    347  
     343        pj_memcpy(&rr->rdata.a.ip_addr, p, 4); 
    348344        p += 4; 
    349345 
     
    588584                         pool, &dst->rdata.srv.target); 
    589585    } else if (src->type == PJ_DNS_TYPE_A) { 
    590         pj_strdup(pool, &dst->rdata.a.ip_addr, &src->rdata.a.ip_addr); 
     586        dst->rdata.a.ip_addr.s_addr =  src->rdata.a.ip_addr.s_addr; 
    591587    } else if (src->type == PJ_DNS_TYPE_CNAME) { 
    592588        pj_strdup(pool, &dst->rdata.cname.name, &src->rdata.cname.name); 
     
    603599PJ_DEF(void) pj_dns_packet_dup(pj_pool_t *pool, 
    604600                               const pj_dns_parsed_packet*p, 
     601                               unsigned options, 
    605602                               pj_dns_parsed_packet **p_dst) 
    606603{ 
     
    631628 
    632629    /* Copy query section */ 
    633     if (p->hdr.qdcount) { 
     630    if (p->hdr.qdcount && (options & PJ_DNS_NO_QD)==0) { 
    634631        dst->q = pj_pool_alloc(pool, p->hdr.qdcount *  
    635632                                     sizeof(pj_dns_parsed_query)); 
     
    642639 
    643640    /* Copy answer section */ 
    644     if (p->hdr.anscount) { 
     641    if (p->hdr.anscount && (options & PJ_DNS_NO_ANS)==0) { 
    645642        dst->ans = pj_pool_alloc(pool, p->hdr.anscount *  
    646643                                       sizeof(pj_dns_parsed_rr)); 
     
    653650 
    654651    /* Copy NS section */ 
    655     if (p->hdr.nscount) { 
     652    if (p->hdr.nscount && (options & PJ_DNS_NO_NS)==0) { 
    656653        dst->ns = pj_pool_alloc(pool, p->hdr.nscount *  
    657654                                      sizeof(pj_dns_parsed_rr)); 
     
    664661 
    665662    /* Copy additional info section */ 
    666     if (p->hdr.arcount) { 
     663    if (p->hdr.arcount && (options & PJ_DNS_NO_AR)==0) { 
    667664        dst->arr = pj_pool_alloc(pool, p->hdr.arcount *  
    668665                                       sizeof(pj_dns_parsed_rr)); 
  • pjproject/trunk/pjlib-util/src/pjlib-util/dns_dump.c

    r974 r1031  
    116116                  rr->rdata.cname.name.ptr)); 
    117117    } else if (rr->type == PJ_DNS_TYPE_A) { 
    118         PJ_LOG(3,(THIS_FILE, "    IP address: %.*s", 
    119                   (int)rr->rdata.a.ip_addr.slen, 
    120                   rr->rdata.a.ip_addr.ptr)); 
     118        PJ_LOG(3,(THIS_FILE, "    IP address: %s", 
     119                  pj_inet_ntoa(rr->rdata.a.ip_addr))); 
    121120    } 
    122121} 
  • pjproject/trunk/pjlib-util/src/pjlib-util/resolver.c

    r974 r1031  
    5252#define RES_BUF_SZ          PJ_DNS_RESOLVER_RES_BUF_SIZE 
    5353#define UDPSZ               PJ_DNS_RESOLVER_MAX_UDP_SIZE 
     54#define TMP_SZ              PJ_DNS_RESOLVER_TMP_BUF_SIZE 
    5455 
    5556 
     
    162163    pj_bool_t            own_ioqueue;   /**< Do we own ioqueue?             */ 
    163164    pj_ioqueue_t        *ioqueue;       /**< Ioqueue instance.              */ 
    164     char                 tmp_pool[1500];/**< Temporary pool buffer.         */ 
     165    char                 tmp_pool[TMP_SZ];/**< Temporary pool buffer.       */ 
    165166 
    166167    /* Socket */ 
     
    994995    } 
    995996 
    996     /* Duplicate the packet */ 
     997    /* Duplicate the packet. 
     998     * We don't need to keep the query, NS, and AR sections from the packet, 
     999     * so exclude from duplication. 
     1000     */ 
    9971001    res_pool = pj_pool_create_on_buf("respool", cache->buf, sizeof(cache->buf)); 
    9981002    PJ_TRY { 
    9991003        cache->pkt = NULL; 
    1000         pj_dns_packet_dup(res_pool, pkt, &cache->pkt); 
     1004        pj_dns_packet_dup(res_pool, pkt,  
     1005                          PJ_DNS_NO_QD | PJ_DNS_NO_NS | PJ_DNS_NO_AR, 
     1006                          &cache->pkt); 
    10011007    } 
    10021008    PJ_CATCH_ANY { 
     
    12231229        } 
    12241230    } 
    1225  
    1226     /* We don't need NS and query section in the packet, so trim them. */ 
    1227     dns_pkt->hdr.qdcount = 0; 
    1228     dns_pkt->hdr.nscount = 0; 
    12291231 
    12301232    /* Save/update response cache. */ 
  • pjproject/trunk/pjsip/src/pjsip/sip_resolve.c

    r974 r1031  
    536536            if (pj_stricmp(&rr->name, &query->srv[j].target_name)==0) { 
    537537                unsigned cnt = query->srv[j].addr_cnt; 
    538                 query->srv[j].addr[cnt] = pj_inet_addr(&rr->rdata.a.ip_addr); 
     538                query->srv[j].addr[cnt].s_addr = rr->rdata.a.ip_addr.s_addr; 
    539539                ++query->srv[j].addr_cnt; 
    540540                ++query->host_resolved; 
     
    778778                unsigned j; 
    779779 
    780                 query->srv[i].addr[query->srv[i].addr_cnt++] = 
    781                     pj_inet_addr(&pkt->ans[0].rdata.a.ip_addr); 
     780                query->srv[i].addr[query->srv[i].addr_cnt++].s_addr = 
     781                    pkt->ans[0].rdata.a.ip_addr.s_addr; 
    782782 
    783783                PJ_LOG(5,(query->objname,  
    784                           "DNS A for %.*s: %.*s", 
     784                          "DNS A for %.*s: %s", 
    785785                          (int)query->srv[i].target_name.slen,  
    786786                          query->srv[i].target_name.ptr, 
    787                           (int)pkt->ans[0].rdata.a.ip_addr.slen, 
    788                           pkt->ans[0].rdata.a.ip_addr.ptr)); 
     787                          pj_inet_ntoa(pkt->ans[0].rdata.a.ip_addr))); 
    789788 
    790789                /* Check for multiple IP addresses */ 
     
    792791                            query->srv[i].addr_cnt < ADDR_MAX_COUNT; ++j) 
    793792                { 
    794                     query->srv[i].addr[query->srv[i].addr_cnt++] =  
    795                         pj_inet_addr(&pkt->ans[j].rdata.a.ip_addr); 
     793                    query->srv[i].addr[query->srv[i].addr_cnt++].s_addr =  
     794                        pkt->ans[j].rdata.a.ip_addr.s_addr; 
    796795 
    797796                    PJ_LOG(5,(query->objname,  
    798                               "Additional DNS A for %.*s: %.*s", 
     797                              "Additional DNS A for %.*s: %s", 
    799798                              (int)query->srv[i].target_name.slen,  
    800799                              query->srv[i].target_name.ptr, 
    801                               (int)pkt->ans[j].rdata.a.ip_addr.slen, 
    802                               pkt->ans[j].rdata.a.ip_addr.ptr)); 
     800                              pj_inet_ntoa(pkt->ans[j].rdata.a.ip_addr))); 
    803801                } 
    804802            } 
Note: See TracChangeset for help on using the changeset viewer.