Merge branch 'bugfix/mdns_fix_discard_packet_on_invalid_name' into 'master'

mdns: fix ignoring mdns packet if contained an invalid name entries in question field

See merge request espressif/esp-idf!5307
This commit is contained in:
Angus Gratton 2019-07-27 17:25:25 +08:00
commit 1b6010bedf
2 changed files with 6 additions and 4 deletions

View file

@ -174,7 +174,7 @@ static const uint8_t * _mdns_read_fqdn(const uint8_t * packet, const uint8_t * s
size_t index = 0; size_t index = 0;
while (start[index]) { while (start[index]) {
if (name->parts == 4) { if (name->parts == 4) {
return NULL; name->invalid = true;
} }
uint8_t len = start[index++]; uint8_t len = start[index++];
if (len < 0xC0) { if (len < 0xC0) {
@ -195,7 +195,7 @@ static const uint8_t * _mdns_read_fqdn(const uint8_t * packet, const uint8_t * s
strlcat(name->host, buf, sizeof(name->host)); strlcat(name->host, buf, sizeof(name->host));
} else if (strcasecmp(buf, MDNS_SUB_STR) == 0) { } else if (strcasecmp(buf, MDNS_SUB_STR) == 0) {
name->sub = 1; name->sub = 1;
} else { } else if (!name->invalid) {
char* mdns_name_ptrs[]={name->host, name->service, name->proto, name->domain}; char* mdns_name_ptrs[]={name->host, name->service, name->proto, name->domain};
memcpy(mdns_name_ptrs[name->parts++], buf, len+1); memcpy(mdns_name_ptrs[name->parts++], buf, len+1);
} }
@ -2316,6 +2316,7 @@ static const uint8_t * _mdns_parse_fqdn(const uint8_t * packet, const uint8_t *
name->service[0] = 0; name->service[0] = 0;
name->proto[0] = 0; name->proto[0] = 0;
name->domain[0] = 0; name->domain[0] = 0;
name->invalid = false;
static char buf[MDNS_NAME_BUF_LEN]; static char buf[MDNS_NAME_BUF_LEN];
@ -2323,7 +2324,7 @@ static const uint8_t * _mdns_parse_fqdn(const uint8_t * packet, const uint8_t *
if (!next_data) { if (!next_data) {
return 0; return 0;
} }
if (!name->parts) { if (!name->parts || name->invalid) {
return next_data; return next_data;
} }
if (name->parts == 3) { if (name->parts == 3) {
@ -2621,7 +2622,7 @@ void mdns_parse_packet(mdns_rx_packet_t * packet)
clas &= 0x7FFF; clas &= 0x7FFF;
content = content + 4; content = content + 4;
if (clas != 0x0001) {//bad class if (clas != 0x0001 || name->invalid) {//bad class or invalid name for this question entry
continue; continue;
} }

View file

@ -184,6 +184,7 @@ typedef struct {
char domain[MDNS_NAME_BUF_LEN]; char domain[MDNS_NAME_BUF_LEN];
uint8_t parts; uint8_t parts;
uint8_t sub; uint8_t sub;
bool invalid;
} mdns_name_t; } mdns_name_t;
typedef struct mdns_parsed_question_s { typedef struct mdns_parsed_question_s {