From 2f1c353b654a508cbd2dce874ea913eeeb82d25c Mon Sep 17 00:00:00 2001 From: Jakob Olsson <jakob.olsson@iopsys.eu> Date: Mon, 7 Dec 2020 11:21:21 +0100 Subject: [PATCH] map-controller: misc memory management and error handling --- src/core/cntlr_ubus.c | 15 +++++++++------ src/core/config.c | 25 +++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/core/cntlr_ubus.c b/src/core/cntlr_ubus.c index b1706340..ed10aaa9 100644 --- a/src/core/cntlr_ubus.c +++ b/src/core/cntlr_ubus.c @@ -610,7 +610,7 @@ static int cntlr_sta_caps(struct ubus_context *ctx, struct ubus_object *obj, strncpy(agent, blobmsg_data(tb[AP_POLICY_AGENT]), sizeof(agent) - 1); if (!hwaddr_aton(agent, cmdu_data->origin)) - return UBUS_STATUS_UNKNOWN_ERROR; + goto fail_cmdu; } // TODO: ff:ff:ff:ff:ff:ff = send to all agents @@ -621,19 +621,19 @@ static int cntlr_sta_caps(struct ubus_context *ctx, struct ubus_object *obj, p = calloc(1, sizeof(struct tlv_client_info)); if (!p) { fprintf(stderr, "failed to malloc cmdu\n"); - return UBUS_STATUS_UNKNOWN_ERROR; + goto fail_cmdu; } if (!hwaddr_aton(sta, hw_sta)) { fprintf(stderr, "STA Capability Query: provide STA " \ "address in format 11:22:33...\n"); - return UBUS_STATUS_INVALID_ARGUMENT; + goto fail_p; } if (!hwaddr_aton(bssid, hw_bssid)) { fprintf(stderr, "STA Capability Query: provide BSSID " \ "address in format 11:22:33...\n"); - return UBUS_STATUS_INVALID_ARGUMENT; + goto fail_p; } p->tlv_type = MAP_TLV_CLIENT_INFO; @@ -648,10 +648,13 @@ static int cntlr_sta_caps(struct ubus_context *ctx, struct ubus_object *obj, cmdu_data->tlvs[0] = (uint8_t *)p; send_cmdu(c, cmdu_data); - map_free_cmdu(cmdu_data); - return 0; +fail_p: + map_free_tlv_cstruct((uint8_t *) p); +fail_cmdu: + map_free_cmdu(cmdu_data); + return UBUS_STATUS_UNKNOWN_ERROR; } static int cntlr_teardown_ap(struct ubus_context *ctx, struct ubus_object *obj, diff --git a/src/core/config.c b/src/core/config.c index e6e6f822..293494f6 100644 --- a/src/core/config.c +++ b/src/core/config.c @@ -425,11 +425,36 @@ int cntlr_config_reload(struct controller_config *cfg) return 0; } +static int clean_steer_btm_excl(struct agent_policy *p) +{ + struct stax *n, *tmp; + + list_for_each_entry_safe(n, tmp, &p->btmsteer_exlist, list) { + list_del(&n->list); + free(n); + } + + return 0; +} +static int clean_steer_excl(struct agent_policy *p) +{ + struct stax *n, *tmp; + + list_for_each_entry_safe(n, tmp, &p->steer_exlist, list) { + list_del(&n->list); + free(n); + } + + return 0; +} + int clean_agent_policies(struct controller_config *cfg) { struct agent_policy *p, *tmp; list_for_each_entry_safe(p, tmp, &cfg->policylist, list) { + clean_steer_btm_excl(p); + clean_steer_excl(p); list_del(&p->list); free(p); } -- GitLab