Skip to content

Commit 4e84493

Browse files
authored
Merge pull request #529 from zwx1995esp/fix/add_lock_for_mdns_common_api
fix(mdns): add lock for some common apis (IDFGH-12338)
2 parents 438449f + 21c84bf commit 4e84493

File tree

1 file changed

+60
-7
lines changed

1 file changed

+60
-7
lines changed

components/mdns/mdns.c

Lines changed: 60 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ static bool _mdns_append_host_list(mdns_out_answer_t **destination, bool flush,
7272
static void _mdns_remap_self_service_hostname(const char *old_hostname, const char *new_hostname);
7373
static esp_err_t mdns_post_custom_action_tcpip_if(mdns_if_t mdns_if, mdns_event_actions_t event_action);
7474

75+
static void _mdns_query_results_free(mdns_result_t *results);
7576
typedef enum {
7677
MDNS_IF_STA = 0,
7778
MDNS_IF_AP = 1,
@@ -5600,7 +5601,7 @@ void mdns_free(void)
56005601
free(h->proto);
56015602
vSemaphoreDelete(h->done_semaphore);
56025603
if (h->result) {
5603-
mdns_query_results_free(h->result);
5604+
_mdns_query_results_free(h->result);
56045605
}
56055606
free(h);
56065607
}
@@ -5748,7 +5749,11 @@ esp_err_t mdns_delegate_hostname_set_address(const char *hostname, const mdns_ip
57485749

57495750
bool mdns_hostname_exists(const char *hostname)
57505751
{
5751-
return _hostname_is_ours(hostname);
5752+
bool ret = false;
5753+
MDNS_SERVICE_LOCK();
5754+
ret = _hostname_is_ours(hostname);
5755+
MDNS_SERVICE_UNLOCK();
5756+
return ret;
57525757
}
57535758

57545759
esp_err_t mdns_instance_name_set(const char *instance)
@@ -5791,11 +5796,14 @@ esp_err_t mdns_service_add_for_host(const char *instance, const char *service, c
57915796
return ESP_ERR_INVALID_ARG;
57925797
}
57935798

5799+
MDNS_SERVICE_LOCK();
57945800
if (!_mdns_can_add_more_services()) {
5801+
MDNS_SERVICE_UNLOCK();
57955802
return ESP_ERR_NO_MEM;
57965803
}
57975804

57985805
mdns_srv_item_t *item = _mdns_get_service_item_instance(instance, service, proto, hostname);
5806+
MDNS_SERVICE_UNLOCK();
57995807
if (item) {
58005808
return ESP_ERR_INVALID_ARG;
58015809
}
@@ -5833,12 +5841,18 @@ esp_err_t mdns_service_add_for_host(const char *instance, const char *service, c
58335841

58345842
size_t start = xTaskGetTickCount();
58355843
size_t timeout_ticks = pdMS_TO_TICKS(MDNS_SERVICE_ADD_TIMEOUT_MS);
5836-
while (_mdns_get_service_item_instance(instance, service, proto, hostname) == NULL) {
5844+
MDNS_SERVICE_LOCK();
5845+
mdns_srv_item_t *target = _mdns_get_service_item_instance(instance, service, proto, hostname);
5846+
MDNS_SERVICE_UNLOCK();
5847+
while (target == NULL) {
58375848
uint32_t expired = xTaskGetTickCount() - start;
58385849
if (expired >= timeout_ticks) {
58395850
return ESP_FAIL; // Timeout
58405851
}
58415852
vTaskDelay(MIN(10 / portTICK_PERIOD_MS, timeout_ticks - expired));
5853+
MDNS_SERVICE_LOCK();
5854+
target = _mdns_get_service_item_instance(instance, service, proto, hostname);
5855+
MDNS_SERVICE_UNLOCK();
58425856
}
58435857

58445858
return ESP_OK;
@@ -5855,13 +5869,21 @@ esp_err_t mdns_service_add(const char *instance, const char *service, const char
58555869

58565870
bool mdns_service_exists(const char *service_type, const char *proto, const char *hostname)
58575871
{
5858-
return _mdns_get_service_item(service_type, proto, hostname) != NULL;
5872+
bool ret = false;
5873+
MDNS_SERVICE_LOCK();
5874+
ret = _mdns_get_service_item(service_type, proto, hostname) != NULL;
5875+
MDNS_SERVICE_UNLOCK();
5876+
return ret;
58595877
}
58605878

58615879
bool mdns_service_exists_with_instance(const char *instance, const char *service_type, const char *proto,
58625880
const char *hostname)
58635881
{
5864-
return _mdns_get_service_item_instance(instance, service_type, proto, hostname) != NULL;
5882+
bool ret = false;
5883+
MDNS_SERVICE_LOCK();
5884+
ret = _mdns_get_service_item_instance(instance, service_type, proto, hostname) != NULL;
5885+
MDNS_SERVICE_UNLOCK();
5886+
return ret;
58655887
}
58665888

58675889
static mdns_txt_item_t *_copy_mdns_txt_items(mdns_txt_linked_item_t *items, uint8_t **txt_value_len, size_t *txt_count)
@@ -6001,16 +6023,19 @@ static mdns_result_t *_mdns_lookup_service(const char *instance, const char *ser
60016023
}
60026024
return results;
60036025
handle_error:
6004-
mdns_query_results_free(results);
6026+
_mdns_query_results_free(results);
60056027
return NULL;
60066028
}
60076029

60086030
esp_err_t mdns_service_port_set_for_host(const char *instance, const char *service, const char *proto, const char *hostname, uint16_t port)
60096031
{
6032+
MDNS_SERVICE_LOCK();
60106033
if (!_mdns_server || !_mdns_server->services || _str_null_or_empty(service) || _str_null_or_empty(proto) || !port) {
6034+
MDNS_SERVICE_UNLOCK();
60116035
return ESP_ERR_INVALID_ARG;
60126036
}
60136037
mdns_srv_item_t *s = _mdns_get_service_item_instance(instance, service, proto, hostname);
6038+
MDNS_SERVICE_UNLOCK();
60146039
if (!s) {
60156040
return ESP_ERR_NOT_FOUND;
60166041
}
@@ -6041,10 +6066,13 @@ esp_err_t mdns_service_port_set(const char *service, const char *proto, uint16_t
60416066
esp_err_t mdns_service_txt_set_for_host(const char *instance, const char *service, const char *proto, const char *hostname,
60426067
mdns_txt_item_t txt[], uint8_t num_items)
60436068
{
6069+
MDNS_SERVICE_LOCK();
60446070
if (!_mdns_server || !_mdns_server->services || _str_null_or_empty(service) || _str_null_or_empty(proto) || (num_items && txt == NULL)) {
6071+
MDNS_SERVICE_UNLOCK();
60456072
return ESP_ERR_INVALID_ARG;
60466073
}
60476074
mdns_srv_item_t *s = _mdns_get_service_item_instance(instance, service, proto, hostname);
6075+
MDNS_SERVICE_UNLOCK();
60486076
if (!s) {
60496077
return ESP_ERR_NOT_FOUND;
60506078
}
@@ -6087,11 +6115,14 @@ esp_err_t mdns_service_txt_item_set_for_host_with_explicit_value_len(const char
60876115
const char *hostname, const char *key,
60886116
const char *value, uint8_t value_len)
60896117
{
6118+
MDNS_SERVICE_LOCK();
60906119
if (!_mdns_server || !_mdns_server->services || _str_null_or_empty(service) || _str_null_or_empty(proto) ||
60916120
_str_null_or_empty(key) || (!value && value_len)) {
6121+
MDNS_SERVICE_UNLOCK();
60926122
return ESP_ERR_INVALID_ARG;
60936123
}
60946124
mdns_srv_item_t *s = _mdns_get_service_item_instance(instance, service, proto, hostname);
6125+
MDNS_SERVICE_UNLOCK();
60956126
if (!s) {
60966127
return ESP_ERR_NOT_FOUND;
60976128
}
@@ -6160,10 +6191,13 @@ esp_err_t mdns_service_txt_item_set_with_explicit_value_len(const char *service,
61606191
esp_err_t mdns_service_txt_item_remove_for_host(const char *instance, const char *service, const char *proto, const char *hostname,
61616192
const char *key)
61626193
{
6194+
MDNS_SERVICE_LOCK();
61636195
if (!_mdns_server || !_mdns_server->services || _str_null_or_empty(service) || _str_null_or_empty(proto) || _str_null_or_empty(key)) {
6196+
MDNS_SERVICE_UNLOCK();
61646197
return ESP_ERR_INVALID_ARG;
61656198
}
61666199
mdns_srv_item_t *s = _mdns_get_service_item_instance(instance, service, proto, hostname);
6200+
MDNS_SERVICE_UNLOCK();
61676201
if (!s) {
61686202
return ESP_ERR_NOT_FOUND;
61696203
}
@@ -6199,11 +6233,14 @@ esp_err_t mdns_service_txt_item_remove(const char *service, const char *proto, c
61996233
esp_err_t mdns_service_subtype_add_for_host(const char *instance_name, const char *service, const char *proto,
62006234
const char *hostname, const char *subtype)
62016235
{
6236+
MDNS_SERVICE_LOCK();
62026237
if (!_mdns_server || !_mdns_server->services || _str_null_or_empty(service) || _str_null_or_empty(proto) ||
62036238
_str_null_or_empty(subtype)) {
6239+
MDNS_SERVICE_UNLOCK();
62046240
return ESP_ERR_INVALID_ARG;
62056241
}
62066242
mdns_srv_item_t *s = _mdns_get_service_item_instance(instance_name, service, proto, hostname);
6243+
MDNS_SERVICE_UNLOCK();
62076244
if (!s) {
62086245
return ESP_ERR_NOT_FOUND;
62096246
}
@@ -6232,13 +6269,17 @@ esp_err_t mdns_service_subtype_add_for_host(const char *instance_name, const cha
62326269
esp_err_t mdns_service_instance_name_set_for_host(const char *instance_old, const char *service, const char *proto, const char *hostname,
62336270
const char *instance)
62346271
{
6272+
MDNS_SERVICE_LOCK();
62356273
if (!_mdns_server || !_mdns_server->services || _str_null_or_empty(service) || _str_null_or_empty(proto)) {
6274+
MDNS_SERVICE_UNLOCK();
62366275
return ESP_ERR_INVALID_ARG;
62376276
}
62386277
if (_str_null_or_empty(instance) || strlen(instance) > (MDNS_NAME_BUF_LEN - 1)) {
6278+
MDNS_SERVICE_UNLOCK();
62396279
return ESP_ERR_INVALID_ARG;
62406280
}
62416281
mdns_srv_item_t *s = _mdns_get_service_item_instance(instance_old, service, proto, hostname);
6282+
MDNS_SERVICE_UNLOCK();
62426283
if (!s) {
62436284
return ESP_ERR_NOT_FOUND;
62446285
}
@@ -6274,10 +6315,13 @@ esp_err_t mdns_service_instance_name_set(const char *service, const char *proto,
62746315

62756316
esp_err_t mdns_service_remove_for_host(const char *instance, const char *service, const char *proto, const char *hostname)
62766317
{
6318+
MDNS_SERVICE_LOCK();
62776319
if (!_mdns_server || !_mdns_server->services || _str_null_or_empty(service) || _str_null_or_empty(proto)) {
6320+
MDNS_SERVICE_UNLOCK();
62786321
return ESP_ERR_INVALID_ARG;
62796322
}
62806323
mdns_srv_item_t *s = _mdns_get_service_item_instance(instance, service, proto, hostname);
6324+
MDNS_SERVICE_UNLOCK();
62816325
if (!s) {
62826326
return ESP_ERR_NOT_FOUND;
62836327
}
@@ -6309,9 +6353,12 @@ esp_err_t mdns_service_remove_all(void)
63096353
if (!_mdns_server) {
63106354
return ESP_ERR_INVALID_ARG;
63116355
}
6356+
MDNS_SERVICE_LOCK();
63126357
if (!_mdns_server->services) {
6358+
MDNS_SERVICE_UNLOCK();
63136359
return ESP_OK;
63146360
}
6361+
MDNS_SERVICE_UNLOCK();
63156362

63166363
mdns_action_t *action = (mdns_action_t *)malloc(sizeof(mdns_action_t));
63176364
if (!action) {
@@ -6329,8 +6376,14 @@ esp_err_t mdns_service_remove_all(void)
63296376
/*
63306377
* MDNS QUERY
63316378
* */
6332-
63336379
void mdns_query_results_free(mdns_result_t *results)
6380+
{
6381+
MDNS_SERVICE_LOCK();
6382+
_mdns_query_results_free(results);
6383+
MDNS_SERVICE_UNLOCK();
6384+
}
6385+
6386+
static void _mdns_query_results_free(mdns_result_t *results)
63346387
{
63356388
mdns_result_t *r;
63366389
mdns_ip_addr_t *a;

0 commit comments

Comments
 (0)