]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
alloc-util: make mfree() typesafe
authorLennart Poettering <lennart@poettering.net>
Tue, 10 Aug 2021 12:36:00 +0000 (14:36 +0200)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 10 Aug 2021 19:47:10 +0000 (04:47 +0900)
Make sure we return the same type as we accept.

One incorrect use of mfree() is discovered and fixed this way.

src/basic/alloc-util.h
src/resolve/resolved-dns-rr.c

index 0af425e4914ffc31ef1e3cf3dc7816ec969990bc..e587fe79e7a90903fc4fa477b5ca04351d4b8912 100644 (file)
@@ -44,10 +44,11 @@ typedef void (*free_func_t)(void *p);
 
 #define malloc0(n) (calloc(1, (n) ?: 1))
 
-static inline void *mfree(void *memory) {
-        free(memory);
-        return NULL;
-}
+#define mfree(memory)                           \
+        ({                                      \
+                free(memory);                   \
+                (typeof(memory)) NULL;          \
+        })
 
 #define free_and_replace(a, b)                  \
         ({                                      \
index 4a0327a19dcbf7eec16847ac762027be501e97b8..d98914e8b817ea94e31182100f468d86b6b87a6d 100644 (file)
@@ -47,8 +47,8 @@ DnsResourceKey* dns_resource_key_new_redirect(const DnsResourceKey *key, const D
         if (cname->key->type == DNS_TYPE_CNAME)
                 return dns_resource_key_new(key->class, key->type, cname->cname.name);
         else {
+                _cleanup_free_ char *destination = NULL;
                 DnsResourceKey *k;
-                char *destination = NULL;
 
                 r = dns_name_change_suffix(dns_resource_key_name(key), dns_resource_key_name(cname->key), cname->dname.name, &destination);
                 if (r < 0)
@@ -58,8 +58,9 @@ DnsResourceKey* dns_resource_key_new_redirect(const DnsResourceKey *key, const D
 
                 k = dns_resource_key_new_consume(key->class, key->type, destination);
                 if (!k)
-                        return mfree(destination);
+                        return NULL;
 
+                TAKE_PTR(destination);
                 return k;
         }
 }