]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
src: add xzalloc_array() and use it to allocate the expression hashtable
authorPablo Neira Ayuso <pablo@netfilter.org>
Mon, 14 Jun 2021 12:47:47 +0000 (14:47 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Mon, 14 Jun 2021 17:24:44 +0000 (19:24 +0200)
Otherwise, assertion to ensure that no colission occur is hit due to
uninitialized hashtable memory area:

nft: netlink_delinearize.c:1741: expr_handler_init: Assertion `expr_handle_ht[hash] == NULL' failed.

Fixes: c4058f96c6a5 ("netlink_delinearize: Fix suspicious calloc() call")
Acked-by: Phil Sutter <phil@nwl.cc>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
include/utils.h
src/netlink_delinearize.c
src/utils.c

index f45f25132d18dac9b1b2bb9ae95f10f0f24251f7..ffbe2cbb75be57c64fb3d59233ab8efaebb285d3 100644 (file)
@@ -133,6 +133,7 @@ extern void *xmalloc(size_t size);
 extern void *xmalloc_array(size_t nmemb, size_t size);
 extern void *xrealloc(void *ptr, size_t size);
 extern void *xzalloc(size_t size);
+extern void *xzalloc_array(size_t nmemb, size_t size);
 extern char *xstrdup(const char *s);
 extern void xstrunescape(const char *in, char *out);
 
index 9a1cf3c4f7d9022f1ed62bf85a353a7e09a375ee..57af71a75609acbe70a5ee6d3a50e6f995b8128a 100644 (file)
@@ -1733,7 +1733,7 @@ void expr_handler_init(void)
        unsigned int i;
        uint32_t hash;
 
-       expr_handle_ht = xmalloc_array(NFT_EXPR_HSIZE,
+       expr_handle_ht = xzalloc_array(NFT_EXPR_HSIZE,
                                       sizeof(expr_handle_ht[0]));
 
        for (i = 0; i < array_size(netlink_parsers); i++) {
index 47f5b791547b1c6272df16b56aab64eff1cee33d..925841c571f5d8536b24f8bf84866fd142ddf317 100644 (file)
@@ -50,6 +50,16 @@ void *xmalloc_array(size_t nmemb, size_t size)
        return xmalloc(nmemb * size);
 }
 
+void *xzalloc_array(size_t nmemb, size_t size)
+{
+       void *ptr;
+
+       ptr = xmalloc_array(nmemb, size);
+       memset(ptr, 0, nmemb * size);
+
+       return ptr;
+}
+
 void *xrealloc(void *ptr, size_t size)
 {
        ptr = realloc(ptr, size);