diff options
author | Tom Gundersen <teg@jklm.no> | 2015-01-10 01:11:54 +0100 |
---|---|---|
committer | Tom Gundersen <teg@jklm.no> | 2015-01-12 18:19:16 +0100 |
commit | 9a4b012e43f23516373bf398dd9a458439d19939 (patch) | |
tree | afa55f4af80007a118f07ae42c928b923876157b /src/udev/net/link-config.c | |
parent | network-intenal: user _cleanup_ macro in parse_ifname (diff) | |
download | systemd-9a4b012e43f23516373bf398dd9a458439d19939.tar.xz systemd-9a4b012e43f23516373bf398dd9a458439d19939.zip |
udev: link_config - modernize a bit and fix leakes
Not all of the link_config struct was getting freed.
Diffstat (limited to 'src/udev/net/link-config.c')
-rw-r--r-- | src/udev/net/link-config.c | 86 |
1 files changed, 51 insertions, 35 deletions
diff --git a/src/udev/net/link-config.c b/src/udev/net/link-config.c index bf24f6a7f7..ad5b956358 100644 --- a/src/udev/net/link-config.c +++ b/src/udev/net/link-config.c @@ -63,49 +63,41 @@ static const char* const link_dirs[] = { #endif NULL}; -DEFINE_TRIVIAL_CLEANUP_FUNC(link_config_ctx*, link_config_ctx_free); -#define _cleanup_link_config_ctx_free_ _cleanup_(link_config_ctx_freep) - -int link_config_ctx_new(link_config_ctx **ret) { - _cleanup_link_config_ctx_free_ link_config_ctx *ctx = NULL; - - if (!ret) - return -EINVAL; - - ctx = new0(link_config_ctx, 1); - if (!ctx) - return -ENOMEM; - - LIST_HEAD_INIT(ctx->links); - - ctx->ethtool_fd = -1; - - ctx->enable_name_policy = true; - - *ret = ctx; - ctx = NULL; +static void link_config_free(link_config *link) { + if (!link) + return; - return 0; + free(link->filename); + + free(link->match_mac); + free(link->match_path); + free(link->match_driver); + free(link->match_type); + free(link->match_name); + free(link->match_host); + free(link->match_virt); + free(link->match_kernel); + free(link->match_arch); + + free(link->description); + free(link->mac); + free(link->name_policy); + free(link->name); + free(link->alias); + + free(link); } +DEFINE_TRIVIAL_CLEANUP_FUNC(link_config*, link_config_free); + static void link_configs_free(link_config_ctx *ctx) { link_config *link, *link_next; if (!ctx) return; - LIST_FOREACH_SAFE(links, link, link_next, ctx->links) { - free(link->filename); - free(link->name); - free(link->match_path); - free(link->match_driver); - free(link->match_type); - free(link->description); - free(link->alias); - free(link->name_policy); - - free(link); - } + LIST_FOREACH_SAFE(links, link, link_next, ctx->links) + link_config_free(link); } void link_config_ctx_free(link_config_ctx *ctx) { @@ -123,8 +115,32 @@ void link_config_ctx_free(link_config_ctx *ctx) { return; } +DEFINE_TRIVIAL_CLEANUP_FUNC(link_config_ctx*, link_config_ctx_free); + +int link_config_ctx_new(link_config_ctx **ret) { + _cleanup_(link_config_ctx_freep) link_config_ctx *ctx = NULL; + + if (!ret) + return -EINVAL; + + ctx = new0(link_config_ctx, 1); + if (!ctx) + return -ENOMEM; + + LIST_HEAD_INIT(ctx->links); + + ctx->ethtool_fd = -1; + + ctx->enable_name_policy = true; + + *ret = ctx; + ctx = NULL; + + return 0; +} + static int load_link(link_config_ctx *ctx, const char *filename) { - _cleanup_free_ link_config *link = NULL; + _cleanup_(link_config_freep) link_config *link = NULL; _cleanup_fclose_ FILE *file = NULL; int r; |