]> git.ipfire.org Git - thirdparty/libnftnl.git/commitdiff
obj/tunnel: Fix for undefined behaviour
authorPhil Sutter <phil@nwl.cc>
Fri, 4 Oct 2019 19:53:53 +0000 (21:53 +0200)
committerPhil Sutter <phil@nwl.cc>
Tue, 15 Oct 2019 16:29:17 +0000 (18:29 +0200)
Cppcheck complains: Shifting signed 32-bit value by 31 bits is undefined
behaviour.

Indeed, NFTNL_OBJ_TUNNEL_ERSPAN_V2_DIR enum value is 31. Make sure
behaviour is as intended by shifting unsigned 1.

Fixes: ea63a05272f54 ("obj: add tunnel support")
Signed-off-by: Phil Sutter <phil@nwl.cc>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
src/obj/tunnel.c

index 7ffade8c46ae7d5478a329cdda7a24d8e3963764..100aa099c6e970095b494801b067779873e20b92 100644 (file)
@@ -227,7 +227,7 @@ nftnl_obj_tunnel_build(struct nlmsghdr *nlh, const struct nftnl_obj *e)
        if (e->flags & (1 << NFTNL_OBJ_TUNNEL_ERSPAN_VERSION) &&
            (e->flags & (1 << NFTNL_OBJ_TUNNEL_ERSPAN_V1_INDEX) ||
             (e->flags & (1 << NFTNL_OBJ_TUNNEL_ERSPAN_V2_HWID) &&
-             e->flags & (1 << NFTNL_OBJ_TUNNEL_ERSPAN_V2_DIR)))) {
+             e->flags & (1u << NFTNL_OBJ_TUNNEL_ERSPAN_V2_DIR)))) {
                struct nlattr *nest_inner;
 
                nest = mnl_attr_nest_start(nlh, NFTA_TUNNEL_KEY_OPTS);
@@ -240,7 +240,7 @@ nftnl_obj_tunnel_build(struct nlmsghdr *nlh, const struct nftnl_obj *e)
                if (e->flags & (1 << NFTNL_OBJ_TUNNEL_ERSPAN_V2_HWID))
                        mnl_attr_put_u8(nlh, NFTA_TUNNEL_KEY_ERSPAN_V2_HWID,
                                        tun->u.tun_erspan.u.v2.hwid);
-               if (e->flags & (1 << NFTNL_OBJ_TUNNEL_ERSPAN_V2_DIR))
+               if (e->flags & (1u << NFTNL_OBJ_TUNNEL_ERSPAN_V2_DIR))
                        mnl_attr_put_u8(nlh, NFTA_TUNNEL_KEY_ERSPAN_V2_DIR,
                                        tun->u.tun_erspan.u.v2.dir);
                mnl_attr_nest_end(nlh, nest_inner);
@@ -430,7 +430,7 @@ nftnl_obj_tunnel_parse_erspan(struct nftnl_obj *e, struct nlattr *attr,
        if (tb[NFTA_TUNNEL_KEY_ERSPAN_V2_DIR]) {
                tun->u.tun_erspan.u.v2.dir =
                        mnl_attr_get_u8(tb[NFTA_TUNNEL_KEY_ERSPAN_V2_DIR]);
-               e->flags |= (1 << NFTNL_OBJ_TUNNEL_ERSPAN_V2_DIR);
+               e->flags |= (1u << NFTNL_OBJ_TUNNEL_ERSPAN_V2_DIR);
        }
 
        return 0;