Changeset 595116


Ignore:
Timestamp:
09/20/09 17:41:24 (3 years ago)
Author:
Erik Ekman <yarrick@…>
Branches:
master
Children:
8f2c21
Parents:
d4d88d
git-author:
Erik Ekman <yarrick@…> (09/20/09 17:41:24)
git-committer:
Erik Ekman <erik@…> (02/04/12 20:34:04)
Message:

Fix data length in encoding dns queries

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/dns.c

    r90e25e r595116  
    9191                putlong(&p, 0);         /* TTL */ 
    9292 
    93               if (q->type == T_CNAME || q->type == T_A || q->type == T_MX) 
    94               { 
    95                 /* data is expected to be like "Hblabla.host.name.com\0" */ 
    96  
    97                 char *startp = p; 
    98                 int namelen; 
    99  
    100                 p += 2;                 /* skip 2 bytes length */ 
    101                 CHECKLEN(2); 
    102                 if (q->type == T_MX) 
    103                         putshort(&p, 10);       /* preference */ 
    104                 putname(&p, buflen - (p - buf), data); 
    105                 CHECKLEN(0); 
    106                 namelen = p - startp; 
    107                 namelen -= 2; 
    108                 putshort(&startp, namelen); 
    109               } 
    110               else if (q->type == T_TXT) 
    111               { 
    112                 /* TXT has binary or base-X data */ 
    113                 char *startp = p; 
    114                 int txtlen; 
    115  
    116                 p += 2;                 /* skip 2 bytes length */ 
    117                 puttxtbin(&p, buflen - (p - buf), data, datalen); 
    118                 CHECKLEN(0); 
    119                 txtlen = p - startp; 
    120                 txtlen -= 2; 
    121                 putshort(&startp, txtlen); 
    122               } 
    123               else 
    124               { 
    125                 /* NULL has raw binary data */ 
    126                 datalen = MIN(datalen, buflen - (p - buf)); 
    127                 CHECKLEN(2); 
    128                 putshort(&p, datalen); 
    129                 CHECKLEN(datalen); 
    130                 putdata(&p, data, datalen); 
    131                 CHECKLEN(0); 
    132               } 
    133  
     93                if (q->type == T_CNAME || q->type == T_A || q->type == T_MX) { 
     94                        /* data is expected to be like "Hblabla.host.name.com\0" */ 
     95 
     96                        char *startp = p; 
     97                        int namelen; 
     98 
     99                        p += 2;                 /* skip 2 bytes length */ 
     100                        CHECKLEN(2); 
     101                        if (q->type == T_MX) 
     102                                putshort(&p, 10);       /* preference */ 
     103                        putname(&p, buflen - (p - buf), data); 
     104                        CHECKLEN(0); 
     105                        namelen = p - startp; 
     106                        namelen -= 2; 
     107                        putshort(&startp, namelen); 
     108                } else if (q->type == T_TXT) { 
     109                        /* TXT has binary or base-X data */ 
     110                        char *startp = p; 
     111                        int txtlen; 
     112 
     113                        p += 2;                 /* skip 2 bytes length */ 
     114                        puttxtbin(&p, buflen - (p - buf), data, datalen); 
     115                        CHECKLEN(0); 
     116                        txtlen = p - startp; 
     117                        txtlen -= 2; 
     118                        putshort(&startp, txtlen); 
     119                } else { 
     120                        /* NULL has raw binary data */ 
     121                        datalen = MIN(datalen, buflen - (p - buf)); 
     122                        CHECKLEN(2); 
     123                        putshort(&p, datalen); 
     124                        CHECKLEN(datalen); 
     125                        putdata(&p, data, datalen); 
     126                        CHECKLEN(0); 
     127                } 
    134128                break; 
    135129        case QR_QUERY: 
     
    139133                header->arcount = htons(1); 
    140134         
    141                 putname(&p, buflen - (p - buf), data); 
     135                datalen = MIN(datalen, buflen - (p - buf)); 
     136                putname(&p, datalen, data); 
    142137 
    143138                CHECKLEN(4); 
  • tests/dns.c

    rb6fc3f r595116  
    7070        size_t len; 
    7171        int ret; 
    72  
    73         len = sizeof(buf); 
     72        int enclen; 
     73 
     74        enclen = sizeof(resolv); 
    7475        memset(&buf, 0, sizeof(buf)); 
    7576        memset(&resolv, 0, sizeof(resolv)); 
     
    8182 
    8283        *d++ = 'A'; 
    83         enc->encode(d, &len, innerData, strlen(innerData)); 
     84        enc->encode(d, &enclen, innerData, strlen(innerData)); 
    8485        d = resolv + strlen(resolv); 
    8586        if (*d != '.') { 
     
    8788        } 
    8889        strcpy(d, topdomain); 
     90        len = sizeof(buf); 
    8991        ret = dns_encode(buf, len, &q, QR_QUERY, resolv, strlen(resolv)); 
    9092        len = sizeof(query_packet) - 1; /* Skip extra null character */ 
Note: See TracChangeset for help on using the changeset viewer.