Skip to content

Commit 5b3346f

Browse files
authored
Merge pull request #225 from david-cermak/bugfix/mdns_wrong_name_collision
fix(mdns): Incorrect name collision
2 parents 2e607e8 + a06fb77 commit 5b3346f

File tree

2 files changed

+37
-12
lines changed

2 files changed

+37
-12
lines changed

components/mdns/mdns.c

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3059,6 +3059,29 @@ static bool _mdns_name_is_discovery(mdns_name_t *name, uint16_t type)
30593059
);
30603060
}
30613061

3062+
/**
3063+
* @brief Check if the parsed name is self-hosted, i.e. we should resolve conflicts
3064+
*/
3065+
static bool _mdns_name_is_selfhosted(mdns_name_t *name)
3066+
{
3067+
if (_str_null_or_empty(_mdns_server->hostname)) { // self-hostname needs to be defined
3068+
return false;
3069+
}
3070+
3071+
// hostname only -- check if selfhosted name
3072+
if (_str_null_or_empty(name->service) && _str_null_or_empty(name->proto) &&
3073+
strcasecmp(name->host, _mdns_server->hostname) == 0 ) {
3074+
return true;
3075+
}
3076+
3077+
// service -- check if selfhosted service
3078+
mdns_srv_item_t *srv = _mdns_get_service_item(name->service, name->proto, NULL);
3079+
if (srv && strcasecmp(_mdns_server->hostname, srv->service->hostname) == 0) {
3080+
return true;
3081+
}
3082+
return false;
3083+
}
3084+
30623085
/**
30633086
* @brief Check if the parsed name is ours (matches service or host name)
30643087
*/
@@ -3667,7 +3690,7 @@ void mdns_parse_packet(mdns_rx_packet_t *packet)
36673690
}
36683691
}
36693692
}
3670-
3693+
bool is_selfhosted = _mdns_name_is_selfhosted(name);
36713694
if (!_mdns_parse_fqdn(data, data_ptr + MDNS_SRV_FQDN_OFFSET, name, len)) {
36723695
continue;//error
36733696
}
@@ -3695,6 +3718,9 @@ void mdns_parse_packet(mdns_rx_packet_t *packet)
36953718
_mdns_remove_scheduled_answer(packet->tcpip_if, packet->ip_protocol, type, service);
36963719
continue;
36973720
}
3721+
if (!is_selfhosted) {
3722+
continue;
3723+
}
36983724
//detect collision (-1=won, 0=none, 1=lost)
36993725
int col = 0;
37003726
if (mdns_class > 1) {
@@ -3785,6 +3811,9 @@ void mdns_parse_packet(mdns_rx_packet_t *packet)
37853811
_mdns_remove_parsed_question(parsed_packet, type, service);
37863812
continue;
37873813
}
3814+
if (!_mdns_name_is_selfhosted(name)) {
3815+
continue;
3816+
}
37883817
//detect collision (-1=won, 0=none, 1=lost)
37893818
int col = 0;
37903819
if (mdns_class > 1) {
@@ -3819,6 +3848,9 @@ void mdns_parse_packet(mdns_rx_packet_t *packet)
38193848
_mdns_remove_parsed_question(parsed_packet, type, NULL);
38203849
continue;
38213850
}
3851+
if (!_mdns_name_is_selfhosted(name)) {
3852+
continue;
3853+
}
38223854
//detect collision (-1=won, 0=none, 1=lost)
38233855
int col = 0;
38243856
if (mdns_class > 1) {
@@ -3869,6 +3901,9 @@ void mdns_parse_packet(mdns_rx_packet_t *packet)
38693901
_mdns_remove_parsed_question(parsed_packet, type, NULL);
38703902
continue;
38713903
}
3904+
if (!_mdns_name_is_selfhosted(name)) {
3905+
continue;
3906+
}
38723907
//detect collision (-1=won, 0=none, 1=lost)
38733908
int col = 0;
38743909
if (mdns_class > 1) {
@@ -5349,16 +5384,10 @@ esp_err_t mdns_init(void)
53495384
s_esp_netifs[i].netif = NULL;
53505385
}
53515386

5352-
_mdns_server->lock = xSemaphoreCreateMutex();
5353-
if (!_mdns_server->lock) {
5354-
err = ESP_ERR_NO_MEM;
5355-
goto free_server;
5356-
}
5357-
53585387
_mdns_server->action_queue = xQueueCreate(MDNS_ACTION_QUEUE_LEN, sizeof(mdns_action_t *));
53595388
if (!_mdns_server->action_queue) {
53605389
err = ESP_ERR_NO_MEM;
5361-
goto free_lock;
5390+
goto free_server;
53625391
}
53635392

53645393
_mdns_server->action_sema = xSemaphoreCreateBinary();
@@ -5425,8 +5454,6 @@ esp_err_t mdns_init(void)
54255454
vSemaphoreDelete(_mdns_server->action_sema);
54265455
free_queue:
54275456
vQueueDelete(_mdns_server->action_queue);
5428-
free_lock:
5429-
vSemaphoreDelete(_mdns_server->lock);
54305457
free_server:
54315458
free(_mdns_server);
54325459
_mdns_server = NULL;
@@ -5474,7 +5501,6 @@ void mdns_free(void)
54745501
free(h);
54755502
}
54765503
vSemaphoreDelete(_mdns_server->action_sema);
5477-
vSemaphoreDelete(_mdns_server->lock);
54785504
free(_mdns_server);
54795505
_mdns_server = NULL;
54805506
}

components/mdns/private_include/mdns_private.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -382,7 +382,6 @@ typedef struct mdns_server_s {
382382
const char *hostname;
383383
const char *instance;
384384
mdns_srv_item_t *services;
385-
SemaphoreHandle_t lock;
386385
QueueHandle_t action_queue;
387386
SemaphoreHandle_t action_sema;
388387
mdns_tx_packet_t *tx_queue_head;

0 commit comments

Comments
 (0)