Skip to content

Commit f98e46b

Browse files
committed
Replace magic numbers in DNS implementation
1 parent 9547338 commit f98e46b

1 file changed

Lines changed: 44 additions & 26 deletions

File tree

src/wolfip.c

Lines changed: 44 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6633,11 +6633,25 @@ void wolfIP_recv_ex(struct wolfIP *s, unsigned int if_idx, void *buf, uint32_t l
66336633
#define DNS_RESPONSE 0x80
66346634
#define DNS_A 0x01 /* A record only */
66356635
#define DNS_PTR 0x0C
6636+
#define DNS_CLASS_IN 0x01
66366637
#define DNS_RD 0x0100 /* Recursion desired */
66376638
#define DNS_TC 0x0200 /* Truncated response */
6639+
#define DNS_RCODE_MASK 0x000F
6640+
#define DNS_FLAGS_RESPONSE_RD (DNS_RD | ((uint16_t)DNS_RESPONSE << 8))
6641+
#define DNS_ID_NONE 0
6642+
#define DNS_QUESTION_COUNT 1
6643+
#define DNS_MIN_ID 1
66386644
#define DNS_QUERY_TYPE_NONE 0
66396645
#define DNS_QUERY_TYPE_A 1
66406646
#define DNS_QUERY_TYPE_PTR 2
6647+
#define DNS_NAME_TERMINATOR 0x00
6648+
#define DNS_LABEL_SEPARATOR '.'
6649+
#define DNS_COMPRESSION_PTR_MASK 0xC0
6650+
#define DNS_COMPRESSION_PTR_VALUE 0xC0
6651+
#define DNS_COMPRESSION_OFFSET_MASK 0x3F
6652+
#define DNS_IPV4_RDATA_LEN 4
6653+
#define DNS_PTR_OCTET_COUNT 4
6654+
#define DNS_PTR_NAME_BUF_LEN 128
66416655
#define MAX_DNS_NAME_LEN 255
66426656
#define MAX_DNS_LABEL_LEN 63
66436657
#define DNS_QUERY_TIMEOUT 2000U
@@ -6688,7 +6702,7 @@ static size_t dns_write_u8(char *dst, uint8_t val)
66886702

66896703
static int dns_format_ptr_name(char *dst, size_t len, uint32_t ip)
66906704
{
6691-
uint8_t octets[4] = {
6705+
uint8_t octets[DNS_PTR_OCTET_COUNT] = {
66926706
(uint8_t)(ip & 0xFF),
66936707
(uint8_t)((ip >> 8) & 0xFF),
66946708
(uint8_t)((ip >> 16) & 0xFF),
@@ -6697,7 +6711,7 @@ static int dns_format_ptr_name(char *dst, size_t len, uint32_t ip)
66976711
size_t pos = 0;
66986712
size_t i;
66996713
static const char suffix[] = "in-addr.arpa";
6700-
for (i = 0; i < 4; i++) {
6714+
for (i = 0; i < DNS_PTR_OCTET_COUNT; i++) {
67016715
uint8_t val = octets[i];
67026716
size_t written;
67036717
if (pos + 3 >= len)
@@ -6706,15 +6720,15 @@ static int dns_format_ptr_name(char *dst, size_t len, uint32_t ip)
67066720
pos += written;
67076721
if (pos + 1 >= len)
67086722
return -1;
6709-
dst[pos++] = '.';
6723+
dst[pos++] = DNS_LABEL_SEPARATOR;
67106724
}
67116725
{
67126726
size_t suffix_len = sizeof(suffix);
67136727
if (pos + suffix_len >= len)
67146728
return -1;
67156729
memcpy(dst + pos, suffix, suffix_len);
67166730
pos += suffix_len - 1;
6717-
dst[pos] = '\0';
6731+
dst[pos] = DNS_NAME_TERMINATOR;
67186732
}
67196733
return 0;
67206734
}
@@ -6725,9 +6739,9 @@ static int dns_skip_name(const uint8_t *buf, int len, int offset)
67256739
int loop = 0;
67266740
while (pos < len && loop++ < len) {
67276741
uint8_t c = buf[pos++];
6728-
if (c == 0)
6742+
if (c == DNS_NAME_TERMINATOR)
67296743
break;
6730-
if ((c & 0xC0) == 0xC0) {
6744+
if ((c & DNS_COMPRESSION_PTR_MASK) == DNS_COMPRESSION_PTR_VALUE) {
67316745
if (pos >= len)
67326746
return -1;
67336747
pos++;
@@ -6751,20 +6765,21 @@ static int dns_copy_name(const uint8_t *buf, int len, int offset, char *out,
67516765
int jumped = 0;
67526766
while (pos < len && loop++ < len) {
67536767
uint8_t c = buf[pos];
6754-
if (c == 0) {
6768+
if (c == DNS_NAME_TERMINATOR) {
67556769
if (!jumped)
67566770
pos++;
67576771
if (o >= out_len)
67586772
return -1;
6759-
out[o] = '\0';
6773+
out[o] = DNS_NAME_TERMINATOR;
67606774
return 0;
67616775
}
6762-
if ((c & 0xC0) == 0xC0) {
6776+
if ((c & DNS_COMPRESSION_PTR_MASK) == DNS_COMPRESSION_PTR_VALUE) {
67636777
int ptr_pos = pos;
67646778
if (pos + 1 >= len)
67656779
return -1;
67666780
{
6767-
uint16_t ptr = ((c & 0x3F) << 8) | buf[pos + 1];
6781+
uint16_t ptr = ((c & DNS_COMPRESSION_OFFSET_MASK) << 8) |
6782+
buf[pos + 1];
67686783
if (ptr >= ptr_pos)
67696784
return -1;
67706785
pos = ptr;
@@ -6778,7 +6793,7 @@ static int dns_copy_name(const uint8_t *buf, int len, int offset, char *out,
67786793
if (o != 0) {
67796794
if (o + 1 >= out_len)
67806795
return -1;
6781-
out[o++] = '.';
6796+
out[o++] = DNS_LABEL_SEPARATOR;
67826797
}
67836798
if (o + c >= out_len)
67846799
return -1;
@@ -6903,13 +6918,13 @@ void dns_callback(int dns_sd, uint16_t ev, void *arg)
69036918
return;
69046919
flags = ee16(hdr->flags);
69056920
/* Parse DNS response */
6906-
if ((flags & 0x8100) == 0x8100) {
6921+
if ((flags & DNS_FLAGS_RESPONSE_RD) == DNS_FLAGS_RESPONSE_RD) {
69076922
if ((flags & DNS_TC) != 0) {
69086923
dns_abort_query(s);
69096924
return;
69106925
}
69116926
/* RFC 1035 s4.1.1: RCODE != 0 is an error; abort query. */
6912-
if ((flags & 0x000F) != 0) {
6927+
if ((flags & DNS_RCODE_MASK) != 0) {
69136928
dns_abort_query(s);
69146929
return;
69156930
}
@@ -6939,9 +6954,11 @@ void dns_callback(int dns_sd, uint16_t ev, void *arg)
69396954
dns_abort_query(s);
69406955
return;
69416956
}
6942-
if (s->dns_query_type == DNS_QUERY_TYPE_A && ee16(rr->type) == DNS_A && rdlen >= 4) {
6957+
if (s->dns_query_type == DNS_QUERY_TYPE_A &&
6958+
ee16(rr->type) == DNS_A &&
6959+
rdlen >= DNS_IPV4_RDATA_LEN) {
69436960
uint32_t ip;
6944-
if (pos + 4 > dns_len) {
6961+
if (pos + DNS_IPV4_RDATA_LEN > dns_len) {
69456962
dns_abort_query(s);
69466963
return;
69476964
}
@@ -6971,7 +6988,7 @@ void dns_callback(int dns_sd, uint16_t ev, void *arg)
69716988
static int dns_send_query(struct wolfIP *s, const char *dname, uint16_t *id,
69726989
uint16_t qtype)
69736990
{
6974-
uint8_t buf[512];
6991+
uint8_t buf[MAX_DNS_RESPONSE];
69756992
struct dns_header *hdr;
69766993
struct dns_question *q;
69776994
char *q_name, *tok_start, *tok_end;
@@ -6991,20 +7008,21 @@ static int dns_send_query(struct wolfIP *s, const char *dname, uint16_t *id,
69917008
}
69927009
s->dns_id = (uint16_t)(wolfIP_getrandom() & 0xFFFF);
69937010
if (s->dns_id == 0)
6994-
s->dns_id = 1;
7011+
s->dns_id = DNS_MIN_ID;
69957012
*id = s->dns_id;
6996-
memset(buf, 0, 512);
7013+
memset(buf, 0, sizeof(buf));
69977014
s->dns_query_type = (qtype == DNS_PTR) ? DNS_QUERY_TYPE_PTR : DNS_QUERY_TYPE_A;
69987015
hdr = (struct dns_header *)buf;
69997016
hdr->id = ee16(s->dns_id);
7000-
hdr->qdcount = ee16(1);
7017+
hdr->qdcount = ee16(DNS_QUESTION_COUNT);
70017018
hdr->flags = ee16(DNS_QUERY | DNS_RD);
70027019
/* Prepare the DNS query name */
70037020
q_name = (char *)(buf + sizeof(struct dns_header));
70047021
tok_start = (char *)dname;
70057022
while(*tok_start) {
70067023
tok_end = tok_start;
7007-
while ((*tok_end != '.') && (*tok_end != 0)) {
7024+
while ((*tok_end != DNS_LABEL_SEPARATOR) &&
7025+
(*tok_end != DNS_NAME_TERMINATOR)) {
70087026
tok_end++;
70097027
}
70107028
label_len = (uint32_t)(tok_end - tok_start);
@@ -7015,15 +7033,15 @@ static int dns_send_query(struct wolfIP *s, const char *dname, uint16_t *id,
70157033
memcpy(q_name, tok_start, label_len);
70167034
q_name += label_len;
70177035
tok_len += label_len + 1;
7018-
if (*tok_end == 0)
7036+
if (*tok_end == DNS_NAME_TERMINATOR)
70197037
break;
70207038
tok_start = tok_end + 1;
70217039
}
7022-
*q_name = 0;
7040+
*q_name = DNS_NAME_TERMINATOR;
70237041
tok_len++;
70247042
q = (struct dns_question *)(buf + sizeof(struct dns_header) + tok_len);
70257043
q->qtype = ee16(qtype);
7026-
q->qclass = ee16(1);
7044+
q->qclass = ee16(DNS_CLASS_IN);
70277045
s->dns_query_len = (uint16_t)(sizeof(struct dns_header) + tok_len + sizeof(struct dns_question));
70287046
memcpy(s->dns_query_buf, buf, s->dns_query_len);
70297047
s->dns_retry_count = 0;
@@ -7036,7 +7054,7 @@ static int dns_send_query(struct wolfIP *s, const char *dname, uint16_t *id,
70367054
if (ret < 0) {
70377055
/* Roll back the outstanding query state when the first send never queues. */
70387056
dns_abort_query(s);
7039-
*id = 0;
7057+
*id = DNS_ID_NONE;
70407058
return ret;
70417059
}
70427060
dns_schedule_timer(s);
@@ -7055,14 +7073,14 @@ int nslookup(struct wolfIP *s, const char *dname, uint16_t *id, void (*lookup_cb
70557073

70567074
int wolfIP_dns_ptr_lookup(struct wolfIP *s, uint32_t ip, uint16_t *id, void (*lookup_cb)(const char *name))
70577075
{
7058-
char ptr_name[128];
7076+
char ptr_name[DNS_PTR_NAME_BUF_LEN];
70597077
if (!s || !id || !lookup_cb)
70607078
return -22;
70617079
if (dns_format_ptr_name(ptr_name, sizeof(ptr_name), ip) < 0)
70627080
return -22;
70637081
s->dns_ptr_cb = lookup_cb;
70647082
s->dns_lookup_cb = NULL;
7065-
s->dns_ptr_name[0] = '\0';
7083+
s->dns_ptr_name[0] = DNS_NAME_TERMINATOR;
70667084
s->dns_query_type = DNS_QUERY_TYPE_PTR;
70677085
return dns_send_query(s, ptr_name, id, DNS_PTR);
70687086
}

0 commit comments

Comments
 (0)