diff options
author | nichel Chen <nichelnich@gmail.com> | 2023-06-08 08:04:56 +0800 |
---|---|---|
committer | Christian Marangi <ansuelsmth@gmail.com> | 2023-06-11 02:42:31 +0200 |
commit | 2b0b28f479a3aae58f0eae7032481b298ac520f8 (patch) | |
tree | 8f6c388fa644771f95cff6a9f1f2641d4bb6e935 /package/network/config | |
parent | 79844637df50b0f6547a6206d1aa397b2aae9706 (diff) | |
download | openwrt-2b0b28f479a3aae58f0eae7032481b298ac520f8.tar.gz openwrt-2b0b28f479a3aae58f0eae7032481b298ac520f8.tar.bz2 openwrt-2b0b28f479a3aae58f0eae7032481b298ac520f8.zip |
swconfig: fix memory leak when cli call swlib_get_attr()
The cli is a one-time run, and memory leaks would have been irrelevant. But people call libsw with cli programs as samples.
Doing a good job of memory management calls means that people who call libsw are not so easy to make mistakes.
Signed-off-by: nichel Chen <nichelnich@gmail.com>
Diffstat (limited to 'package/network/config')
-rw-r--r-- | package/network/config/swconfig/src/cli.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/package/network/config/swconfig/src/cli.c b/package/network/config/swconfig/src/cli.c index eab6c64742..2601f346db 100644 --- a/package/network/config/swconfig/src/cli.c +++ b/package/network/config/swconfig/src/cli.c @@ -102,6 +102,24 @@ speed_str(int speed) } static void +free_attr_val(const struct switch_attr *attr, const struct switch_val *val) +{ + switch (attr->type) { + case SWITCH_TYPE_STRING: + free(val->value.s); + break; + case SWITCH_TYPE_PORTS: + free(val->value.ports); + break; + case SWITCH_TYPE_LINK: + free(val->value.link); + break; + default: + break; + } +} + +static void print_attr_val(const struct switch_attr *attr, const struct switch_val *val) { struct switch_port_link *link; @@ -150,8 +168,10 @@ show_attrs(struct switch_dev *dev, struct switch_attr *attr, struct switch_val * printf("\t%s: ", attr->name); if (swlib_get_attr(dev, attr, val) < 0) printf("???"); - else + else { print_attr_val(attr, val); + free_attr_val(attr, val); + } putchar('\n'); } attr = attr->next; @@ -354,6 +374,7 @@ int main(int argc, char **argv) goto out; } print_attr_val(a, &val); + free_attr_val(a, &val); putchar('\n'); break; case CMD_LOAD: |