Changeset d531bd6 in mainline
- Timestamp:
- 2013-05-08T09:24:24Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 9f029aa
- Parents:
- 06fe3b6
- Location:
- uspace/srv/net/dnsrsrv
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/dnsrsrv/dns_msg.c
r06fe3b6 rd531bd6 135 135 } 136 136 137 staticint dns_name_decode(uint8_t *buf, size_t size, size_t boff, char **rname,137 int dns_name_decode(uint8_t *buf, size_t size, size_t boff, char **rname, 138 138 size_t *eoff) 139 139 { … … 405 405 406 406 memcpy(rr->rdata, bp, rdlength); 407 rr->roff = bp - buf; 407 408 bp += rdlength; 408 409 bsz -= rdlength; … … 491 492 return ENOMEM; 492 493 493 if (size < sizeof(dns_header_t)) 494 return EINVAL; 494 if (size < sizeof(dns_header_t)) { 495 rc = EINVAL; 496 goto error; 497 } 498 499 /* Store a copy of raw message data for string decompression */ 500 501 msg->raw = malloc(size); 502 if (msg->raw == NULL) { 503 rc = EINVAL; 504 goto error; 505 } 506 507 memcpy(msg->raw, data, size); 508 msg->raw_size = size; 509 log_msg(LOG_DEFAULT, LVL_NOTE, "dns_message_decode: msg->raw = %p, msg->raw_size=%zu", 510 msg->raw, msg->raw_size); 495 511 496 512 hdr = data; … … 605 621 } 606 622 623 free(msg->raw); 607 624 free(msg); 608 625 } -
uspace/srv/net/dnsrsrv/dns_msg.h
r06fe3b6 rd531bd6 47 47 extern dns_message_t *dns_message_new(void); 48 48 extern void dns_message_destroy(dns_message_t *); 49 extern int dns_name_decode(uint8_t *, size_t, size_t, char **, size_t *); 49 50 extern uint32_t dns_uint32_t_decode(uint8_t *, size_t); 50 51 -
uspace/srv/net/dnsrsrv/dns_type.h
r06fe3b6 rd531bd6 43 43 #include "dns_std.h" 44 44 45 /** UnencodedDNS message */45 /** DNS message */ 46 46 typedef struct { 47 /** Raw message data */ 48 void *raw; 49 /** Raw message size */ 50 size_t raw_size; 51 47 52 /** Identifier */ 48 53 uint16_t id; … … 95 100 /** Number of bytes in @c *rdata */ 96 101 size_t rdata_size; 102 /** Offset in the raw message */ 103 size_t roff; 97 104 } dns_rr_t; 98 105 -
uspace/srv/net/dnsrsrv/query.c
r06fe3b6 rd531bd6 54 54 dns_question_t *question; 55 55 dns_host_info_t *info; 56 char *sname, *cname; 57 size_t eoff; 56 58 int rc; 57 59 … … 83 85 } 84 86 87 /* Start with the caller-provided name */ 88 sname = str_dup(name); 89 85 90 list_foreach(amsg->answer, link) { 86 91 dns_rr_t *rr = list_get_instance(link, dns_rr_t, msg); … … 89 94 rr->name, rr->rtype, rr->rclass, rr->rdata_size); 90 95 96 if (rr->rtype == DTYPE_CNAME && rr->rclass == DC_IN && 97 str_cmp(rr->name, sname) == 0) { 98 log_msg(LOG_DEFAULT, LVL_DEBUG, "decode cname (%p, %zu, %zu)", 99 amsg->raw, amsg->raw_size, rr->roff); 100 rc = dns_name_decode(amsg->raw, amsg->raw_size, rr->roff, 101 &cname, &eoff); 102 if (rc != EOK) { 103 log_msg(LOG_DEFAULT, LVL_DEBUG, 104 "error decoding cname"); 105 assert(rc == EINVAL || rc == ENOMEM); 106 dns_message_destroy(msg); 107 dns_message_destroy(amsg); 108 return rc; 109 } 110 111 log_msg(LOG_DEFAULT, LVL_DEBUG, "name = '%s' " 112 "cname = '%s'", sname, cname); 113 114 free(sname); 115 /* Continue looking for the more canonical name */ 116 sname = cname; 117 } 118 91 119 if (rr->rtype == DTYPE_A && rr->rclass == DC_IN && 92 rr->rdata_size == sizeof(uint32_t)) { 120 rr->rdata_size == sizeof(uint32_t) && 121 str_cmp(rr->name, sname) == 0) { 93 122 94 123 info = calloc(1, sizeof(dns_host_info_t)); 95 124 if (info == NULL) { 125 dns_message_destroy(msg); 96 126 dns_message_destroy(amsg); 97 127 return ENOMEM; … … 100 130 info->name = str_dup(rr->name); 101 131 info->addr.ipv4 = dns_uint32_t_decode(rr->rdata, rr->rdata_size); 102 log_msg(LOG_DEFAULT, LVL_DEBUG, "info-> addr = %x",103 info->addr.ipv4);132 log_msg(LOG_DEFAULT, LVL_DEBUG, "info->name = '%s' " 133 "info->addr = %x", info->name, info->addr.ipv4); 104 134 105 135 dns_message_destroy(msg); … … 112 142 dns_message_destroy(msg); 113 143 dns_message_destroy(amsg); 114 log_msg(LOG_DEFAULT, LVL_DEBUG, " No A/IN found, fail");144 log_msg(LOG_DEFAULT, LVL_DEBUG, "'%s' not resolved, fail", sname); 115 145 116 146 return EIO;
Note:
See TracChangeset
for help on using the changeset viewer.