chiark / gitweb /
udev: link_config - modernize a bit and fix leakes
authorTom Gundersen <teg@jklm.no>
Sat, 10 Jan 2015 00:11:54 +0000 (01:11 +0100)
committerTom Gundersen <teg@jklm.no>
Mon, 12 Jan 2015 17:19:16 +0000 (18:19 +0100)
Not all of the link_config struct was getting freed.

src/udev/net/link-config.c

index bf24f6a..ad5b956 100644 (file)
@@ -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;