From: Tom Gundersen Date: Sat, 10 Jan 2015 00:11:54 +0000 (+0100) Subject: udev: link_config - modernize a bit and fix leakes X-Git-Tag: v219~546 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=9a4b012e43f23516373bf398dd9a458439d19939 udev: link_config - modernize a bit and fix leakes Not all of the link_config struct was getting freed. --- diff --git a/src/udev/net/link-config.c b/src/udev/net/link-config.c index bf24f6a7f..ad5b95635 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;