Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset 20c82e3 in mainline


Ignore:
Timestamp:
2017-09-04T15:49:07Z (3 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master
Children:
42f61f01
Parents:
1ddbf81
Message:

Fix DNS resolver bugs: Possible write via stale pointer, bad decoding pointer-compressed name, bad decoding of multiple-pointer-compressed name.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/net/dnsrsrv/dns_msg.c

    r1ddbf81 r20c82e3  
    7777                return ENOMEM;
    7878
    79         str_cpy((*dstr) + s1, nsize - s1, suff);
     79        str_cpy(nstr + s1, nsize - s1, suff);
    8080
    8181        *dstr = nstr;
     
    195195                        break;
    196196
    197                 if (!first) {
    198                         rc = dns_dstr_ext(&name, ".");
    199                         if (rc != EOK) {
    200                                 rc = ENOMEM;
    201                                 goto error;
    202                         }
    203                 }
    204 
    205197                if ((lsize & 0xc0) == 0xc0) {
    206198                        /* Pointer */
     
    233225                         * the message continues
    234226                         */
    235                         *eoff = eptr;
     227                        if (*eoff == 0)
     228                                *eoff = eptr;
    236229
    237230                        bp = pdu->data + ptr;
     
    243236                        rc = EINVAL;
    244237                        goto error;
     238                }
     239
     240                if (!first) {
     241                        rc = dns_dstr_ext(&name, ".");
     242                        if (rc != EOK) {
     243                                rc = ENOMEM;
     244                                goto error;
     245                        }
    245246                }
    246247
     
    413414        rc = dns_name_decode(pdu, boff, &rr->name, &name_eoff);
    414415        if (rc != EOK) {
    415                 log_msg(LOG_DEFAULT, LVL_DEBUG, "Error decoding name");
     416                log_msg(LOG_DEFAULT, LVL_DEBUG, "dns_rr_decode: error decoding name");
    416417                free(rr);
    417418                return ENOMEM;
     
    421422                free(rr->name);
    422423                free(rr);
     424                log_msg(LOG_DEFAULT, LVL_DEBUG, "dns_rr_decode: error name_off");
    423425                return EINVAL;
    424426        }
     
    430432                free(rr->name);
    431433                free(rr);
     434                log_msg(LOG_DEFAULT, LVL_DEBUG, "dns_rr_decode: error bsz");
    432435                return EINVAL;
    433436        }
     
    445448        bsz -= sizeof(uint32_t);
    446449
     450        log_msg(LOG_DEFAULT, LVL_DEBUG2, "dns_rr_decode: rtype=0x%x, rclass=0x%x, ttl=0x%x",
     451            rr->rtype, rr->rclass, rr->ttl );
     452
    447453        rdlength = dns_uint16_t_decode(bp, bsz);
    448454        bp += sizeof(uint16_t);
     
    452458                free(rr->name);
    453459                free(rr);
     460                log_msg(LOG_DEFAULT, LVL_DEBUG, "dns_rr_decode: Error rdlength %zu > bsz %zu", rdlength, bsz);
    454461                return EINVAL;
    455462        }
    456463
    457464        rr->rdata_size = rdlength;
    458         rr->rdata = calloc(1, sizeof(rdlength));
     465        log_msg(LOG_DEFAULT, LVL_DEBUG2, "dns_rr_decode: rdlength=%zu", rdlength);
     466        rr->rdata = calloc(1, rdlength);
    459467        if (rr->rdata == NULL) {
    460468                free(rr->name);
    461469                free(rr);
     470                log_msg(LOG_DEFAULT, LVL_DEBUG, "dns_rr_decode: Error memory");
    462471                return ENOMEM;
    463472        }
     
    470479        *eoff = bp - pdu->data;
    471480        *retrr = rr;
     481        log_msg(LOG_DEFAULT, LVL_DEBUG2, "dns_rr_decode: done");
    472482        return EOK;
    473483}
     
    586596        memcpy(msg->pdu.data, data, size);
    587597        msg->pdu.size = size;
    588         log_msg(LOG_DEFAULT, LVL_NOTE, "dns_message_decode: pdu->data = %p, "
     598        log_msg(LOG_DEFAULT, LVL_DEBUG2, "dns_message_decode: pdu->data = %p, "
    589599            "pdu->size=%zu", msg->pdu.data, msg->pdu.size);
    590600
     
    605615
    606616        qd_count = uint16_t_be2host(hdr->qd_count);
     617        log_msg(LOG_DEFAULT, LVL_DEBUG2, "qd_count=%zu", qd_count);
     618
    607619
    608620        for (i = 0; i < qd_count; i++) {
     
    618630
    619631        an_count = uint16_t_be2host(hdr->an_count);
     632        log_msg(LOG_DEFAULT, LVL_DEBUG2, "an_count=%zu", an_count);
    620633
    621634        for (i = 0; i < an_count; i++) {
Note: See TracChangeset for help on using the changeset viewer.