]> git.ipfire.org Git - thirdparty/libnftnl.git/commitdiff
obj/ct_timeout: Avoid array overrun in timeout_parse_attr_data()
authorPhil Sutter <phil@nwl.cc>
Fri, 4 Oct 2019 19:44:14 +0000 (21:44 +0200)
committerPhil Sutter <phil@nwl.cc>
Tue, 15 Oct 2019 17:34:12 +0000 (19:34 +0200)
Array 'tb' has only 'attr_max' elements, the loop overstepped its
boundary by one. Copy array_size() macro from include/utils.h in
nftables.git to make sure code does the right thing.

Fixes: 0adceeab1597a ("src: add ct timeout support")
Signed-off-by: Phil Sutter <phil@nwl.cc>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
include/utils.h
src/obj/ct_timeout.c

index 3cc659652fe2e1a3a20200e3155348f7d65b73ad..91fbebb1956fd35d740cd713baa758c3d32dd953 100644 (file)
@@ -58,6 +58,14 @@ void __nftnl_assert_attr_exists(uint16_t attr, uint16_t attr_max,
                ret = remain;                           \
        remain -= ret;                                  \
 
+
+#define BUILD_BUG_ON_ZERO(e)   (sizeof(char[1 - 2 * !!(e)]) - 1)
+
+#define __must_be_array(a) \
+       BUILD_BUG_ON_ZERO(__builtin_types_compatible_p(typeof(a), typeof(&a[0])))
+
+#define array_size(arr)                (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))
+
 const char *nftnl_family2str(uint32_t family);
 int nftnl_str2family(const char *family);
 
index a439432deee183df6c878d9663143aff3002d566..a09e25ae5d44f8f1d1cb07abc8d27e80ea510f32 100644 (file)
@@ -134,7 +134,7 @@ timeout_parse_attr_data(struct nftnl_obj *e,
        if (mnl_attr_parse_nested(nest, parse_timeout_attr_policy_cb, &cnt) < 0)
                return -1;
 
-       for (i = 1; i <= attr_max; i++) {
+       for (i = 1; i < array_size(tb); i++) {
                if (tb[i]) {
                        nftnl_timeout_policy_attr_set_u32(e, i-1,
                                ntohl(mnl_attr_get_u32(tb[i])));