]> git.ipfire.org Git - thirdparty/libnftnl.git/commitdiff
obj: Respect data_len when setting attributes
authorPhil Sutter <phil@nwl.cc>
Thu, 7 Mar 2024 13:34:18 +0000 (14:34 +0100)
committerPhil Sutter <phil@nwl.cc>
Wed, 10 Apr 2024 23:27:07 +0000 (01:27 +0200)
With attr_policy in place, data_len has an upper boundary. Use it for
memcpy() calls to cover for caller passing data with lower size than the
attribute's storage.

Signed-off-by: Phil Sutter <phil@nwl.cc>
src/obj/counter.c
src/obj/ct_expect.c
src/obj/ct_helper.c
src/obj/ct_timeout.c
src/obj/limit.c
src/obj/quota.c
src/obj/tunnel.c

index 44524d71b1698dd3b7b3abe431a86381ef9d86e5..19e09ed41a94aaa7b23e49fa7e1f28848e9f8f86 100644 (file)
@@ -29,10 +29,10 @@ nftnl_obj_counter_set(struct nftnl_obj *e, uint16_t type,
 
        switch(type) {
        case NFTNL_OBJ_CTR_BYTES:
-               memcpy(&ctr->bytes, data, sizeof(ctr->bytes));
+               memcpy(&ctr->bytes, data, data_len);
                break;
        case NFTNL_OBJ_CTR_PKTS:
-               memcpy(&ctr->pkts, data, sizeof(ctr->pkts));
+               memcpy(&ctr->pkts, data, data_len);
                break;
        }
        return 0;
index 978af152c5a8e5fc33d1316128c53f74fda27b5e..b4d6faa810eab66e914e975b8cfdd6cf53859445 100644 (file)
@@ -21,19 +21,19 @@ static int nftnl_obj_ct_expect_set(struct nftnl_obj *e, uint16_t type,
 
        switch (type) {
        case NFTNL_OBJ_CT_EXPECT_L3PROTO:
-               memcpy(&exp->l3proto, data, sizeof(exp->l3proto));
+               memcpy(&exp->l3proto, data, data_len);
                break;
        case NFTNL_OBJ_CT_EXPECT_L4PROTO:
-               memcpy(&exp->l4proto, data, sizeof(exp->l4proto));
+               memcpy(&exp->l4proto, data, data_len);
                break;
        case NFTNL_OBJ_CT_EXPECT_DPORT:
-               memcpy(&exp->dport, data, sizeof(exp->dport));
+               memcpy(&exp->dport, data, data_len);
                break;
        case NFTNL_OBJ_CT_EXPECT_TIMEOUT:
-               memcpy(&exp->timeout, data, sizeof(exp->timeout));
+               memcpy(&exp->timeout, data, data_len);
                break;
        case NFTNL_OBJ_CT_EXPECT_SIZE:
-               memcpy(&exp->size, data, sizeof(exp->size));
+               memcpy(&exp->size, data, data_len);
                break;
        }
        return 0;
index aa8e9262ec5aaf2250bb5a4d97481a3c5c06e26a..1feccf20b01b2813aec27e9736d99d7c4dcc7695 100644 (file)
@@ -32,10 +32,10 @@ static int nftnl_obj_ct_helper_set(struct nftnl_obj *e, uint16_t type,
                snprintf(helper->name, sizeof(helper->name), "%s", (const char *)data);
                break;
        case NFTNL_OBJ_CT_HELPER_L3PROTO:
-               memcpy(&helper->l3proto, data, sizeof(helper->l3proto));
+               memcpy(&helper->l3proto, data, data_len);
                break;
        case NFTNL_OBJ_CT_HELPER_L4PROTO:
-               memcpy(&helper->l4proto, data, sizeof(helper->l4proto));
+               memcpy(&helper->l4proto, data, data_len);
                break;
        }
        return 0;
index 88522d8c89bce7d89eb8f5c800fd540915ef5b2d..b9b688ec7c4bce445349c0b53585c082130da2f6 100644 (file)
@@ -150,10 +150,10 @@ static int nftnl_obj_ct_timeout_set(struct nftnl_obj *e, uint16_t type,
 
        switch (type) {
        case NFTNL_OBJ_CT_TIMEOUT_L3PROTO:
-               memcpy(&timeout->l3proto, data, sizeof(timeout->l3proto));
+               memcpy(&timeout->l3proto, data, data_len);
                break;
        case NFTNL_OBJ_CT_TIMEOUT_L4PROTO:
-               memcpy(&timeout->l4proto, data, sizeof(timeout->l4proto));
+               memcpy(&timeout->l4proto, data, data_len);
                break;
        case NFTNL_OBJ_CT_TIMEOUT_ARRAY:
                if (data_len < sizeof(uint32_t) * NFTNL_CTTIMEOUT_ARRAY_MAX)
index 0c7362e55e682e14362b735c1c0667eb0240a5a3..cbf30b480b8faa447995cd937f68e20bd1201426 100644 (file)
@@ -28,19 +28,19 @@ static int nftnl_obj_limit_set(struct nftnl_obj *e, uint16_t type,
 
        switch (type) {
        case NFTNL_OBJ_LIMIT_RATE:
-               memcpy(&limit->rate, data, sizeof(limit->rate));
+               memcpy(&limit->rate, data, data_len);
                break;
        case NFTNL_OBJ_LIMIT_UNIT:
-               memcpy(&limit->unit, data, sizeof(limit->unit));
+               memcpy(&limit->unit, data, data_len);
                break;
        case NFTNL_OBJ_LIMIT_BURST:
-               memcpy(&limit->burst, data, sizeof(limit->burst));
+               memcpy(&limit->burst, data, data_len);
                break;
        case NFTNL_OBJ_LIMIT_TYPE:
-               memcpy(&limit->type, data, sizeof(limit->type));
+               memcpy(&limit->type, data, data_len);
                break;
        case NFTNL_OBJ_LIMIT_FLAGS:
-               memcpy(&limit->flags, data, sizeof(limit->flags));
+               memcpy(&limit->flags, data, data_len);
                break;
        }
        return 0;
index b48ba91a4df110a60d6c1927dc9f9c1d4f33ab35..526db8e42caa8f16264b9344e7f7a05c48ab29d7 100644 (file)
@@ -28,13 +28,13 @@ static int nftnl_obj_quota_set(struct nftnl_obj *e, uint16_t type,
 
        switch (type) {
        case NFTNL_OBJ_QUOTA_BYTES:
-               memcpy(&quota->bytes, data, sizeof(quota->bytes));
+               memcpy(&quota->bytes, data, data_len);
                break;
        case NFTNL_OBJ_QUOTA_CONSUMED:
-               memcpy(&quota->consumed, data, sizeof(quota->consumed));
+               memcpy(&quota->consumed, data, data_len);
                break;
        case NFTNL_OBJ_QUOTA_FLAGS:
-               memcpy(&quota->flags, data, sizeof(quota->flags));
+               memcpy(&quota->flags, data, data_len);
                break;
        }
        return 0;
index 07b3b2ac0cb8625add7f022d7fa9992cbcc142d0..03094109db442e690384a7b969916f18b5a8610e 100644 (file)
@@ -29,52 +29,52 @@ nftnl_obj_tunnel_set(struct nftnl_obj *e, uint16_t type,
 
        switch (type) {
        case NFTNL_OBJ_TUNNEL_ID:
-               memcpy(&tun->id, data, sizeof(tun->id));
+               memcpy(&tun->id, data, data_len);
                break;
        case NFTNL_OBJ_TUNNEL_IPV4_SRC:
-               memcpy(&tun->src_v4, data, sizeof(tun->src_v4));
+               memcpy(&tun->src_v4, data, data_len);
                break;
        case NFTNL_OBJ_TUNNEL_IPV4_DST:
-               memcpy(&tun->dst_v4, data, sizeof(tun->dst_v4));
+               memcpy(&tun->dst_v4, data, data_len);
                break;
        case NFTNL_OBJ_TUNNEL_IPV6_SRC:
-               memcpy(&tun->src_v6, data, sizeof(struct in6_addr));
+               memcpy(&tun->src_v6, data, data_len);
                break;
        case NFTNL_OBJ_TUNNEL_IPV6_DST:
-               memcpy(&tun->dst_v6, data, sizeof(struct in6_addr));
+               memcpy(&tun->dst_v6, data, data_len);
                break;
        case NFTNL_OBJ_TUNNEL_IPV6_FLOWLABEL:
-               memcpy(&tun->flowlabel, data, sizeof(tun->flowlabel));
+               memcpy(&tun->flowlabel, data, data_len);
                break;
        case NFTNL_OBJ_TUNNEL_SPORT:
-               memcpy(&tun->sport, data, sizeof(tun->sport));
+               memcpy(&tun->sport, data, data_len);
                break;
        case NFTNL_OBJ_TUNNEL_DPORT:
-               memcpy(&tun->dport, data, sizeof(tun->dport));
+               memcpy(&tun->dport, data, data_len);
                break;
        case NFTNL_OBJ_TUNNEL_FLAGS:
-               memcpy(&tun->tun_flags, data, sizeof(tun->tun_flags));
+               memcpy(&tun->tun_flags, data, data_len);
                break;
        case NFTNL_OBJ_TUNNEL_TOS:
-               memcpy(&tun->tun_tos, data, sizeof(tun->tun_tos));
+               memcpy(&tun->tun_tos, data, data_len);
                break;
        case NFTNL_OBJ_TUNNEL_TTL:
-               memcpy(&tun->tun_ttl, data, sizeof(tun->tun_ttl));
+               memcpy(&tun->tun_ttl, data, data_len);
                break;
        case NFTNL_OBJ_TUNNEL_VXLAN_GBP:
-               memcpy(&tun->u.tun_vxlan.gbp, data, sizeof(tun->u.tun_vxlan.gbp));
+               memcpy(&tun->u.tun_vxlan.gbp, data, data_len);
                break;
        case NFTNL_OBJ_TUNNEL_ERSPAN_VERSION:
-               memcpy(&tun->u.tun_erspan.version, data, sizeof(tun->u.tun_erspan.version));
+               memcpy(&tun->u.tun_erspan.version, data, data_len);
                break;
        case NFTNL_OBJ_TUNNEL_ERSPAN_V1_INDEX:
-               memcpy(&tun->u.tun_erspan.u.v1_index, data, sizeof(tun->u.tun_erspan.u.v1_index));
+               memcpy(&tun->u.tun_erspan.u.v1_index, data, data_len);
                break;
        case NFTNL_OBJ_TUNNEL_ERSPAN_V2_HWID:
-               memcpy(&tun->u.tun_erspan.u.v2.hwid, data, sizeof(tun->u.tun_erspan.u.v2.hwid));
+               memcpy(&tun->u.tun_erspan.u.v2.hwid, data, data_len);
                break;
        case NFTNL_OBJ_TUNNEL_ERSPAN_V2_DIR:
-               memcpy(&tun->u.tun_erspan.u.v2.dir, data, sizeof(tun->u.tun_erspan.u.v2.dir));
+               memcpy(&tun->u.tun_erspan.u.v2.dir, data, data_len);
                break;
        }
        return 0;