From 5c20e6d505a361a841b40ee00a78871e135d8db3 Mon Sep 17 00:00:00 2001 From: Tomasz Kazimierz Motyl Date: Wed, 21 Aug 2024 15:23:10 +0100 Subject: [PATCH] Merge pull request #59 from se-apc/bugfix/out_of_resources_error_on_cov_address_list_depletion (#734) We report an error: resources, no-space-to-add-list-element on reachng MAX_COV_ADDRESSES limit with COV subsriptions Co-authored-by: Tomasz Kazimierz Motyl --- src/bacnet/basic/service/h_cov.c | 40 +++++++++++++++++++------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/src/bacnet/basic/service/h_cov.c b/src/bacnet/basic/service/h_cov.c index e6d30679..82003448 100644 --- a/src/bacnet/basic/service/h_cov.c +++ b/src/bacnet/basic/service/h_cov.c @@ -381,22 +381,30 @@ static bool cov_list_subscribe(BACNET_ADDRESS *src, } } if (!existing_entry && (first_invalid_index >= 0) && - (!cov_data->cancellationRequest)) { - index = first_invalid_index; - found = true; - COV_Subscriptions[index].flag.valid = true; - COV_Subscriptions[index].dest_index = cov_address_add(src); - COV_Subscriptions[index].monitoredObjectIdentifier.type = - cov_data->monitoredObjectIdentifier.type; - COV_Subscriptions[index].monitoredObjectIdentifier.instance = - cov_data->monitoredObjectIdentifier.instance; - COV_Subscriptions[index].subscriberProcessIdentifier = - cov_data->subscriberProcessIdentifier; - COV_Subscriptions[index].flag.issueConfirmedNotifications = - cov_data->issueConfirmedNotifications; - COV_Subscriptions[index].invokeID = 0; - COV_Subscriptions[index].lifetime = cov_data->lifetime; - COV_Subscriptions[index].flag.send_requested = true; + (!cov_data->cancellationRequest)) { + const int addr_add_ret = cov_address_add(src); + + if(addr_add_ret < 0) { + *error_class = ERROR_CLASS_RESOURCES; + *error_code = ERROR_CODE_NO_SPACE_TO_ADD_LIST_ELEMENT; + found = false; + } else { + COV_Subscriptions[index].dest_index = addr_add_ret; + index = first_invalid_index; + found = true; + COV_Subscriptions[index].flag.valid = true; + COV_Subscriptions[index].monitoredObjectIdentifier.type = + cov_data->monitoredObjectIdentifier.type; + COV_Subscriptions[index].monitoredObjectIdentifier.instance = + cov_data->monitoredObjectIdentifier.instance; + COV_Subscriptions[index].subscriberProcessIdentifier = + cov_data->subscriberProcessIdentifier; + COV_Subscriptions[index].flag.issueConfirmedNotifications = + cov_data->issueConfirmedNotifications; + COV_Subscriptions[index].invokeID = 0; + COV_Subscriptions[index].lifetime = cov_data->lifetime; + COV_Subscriptions[index].flag.send_requested = true; + } } else if (!existing_entry) { if (first_invalid_index < 0) { /* Out of resources */