From: Pablo Neira Ayuso <pablo@netfilter.org>
To: Thomas Haller <thaller@redhat.com>
Cc: NetFilter <netfilter-devel@vger.kernel.org>
Subject: Re: [PATCH nft 7/9] expression: cleanup expr_ops_by_type() and handle u32 input
Date: Wed, 20 Sep 2023 20:13:18 +0200 [thread overview]
Message-ID: <ZQs2Pmq6J5ZdXDQb@calendula> (raw)
In-Reply-To: <20230920142958.566615-8-thaller@redhat.com>
On Wed, Sep 20, 2023 at 04:26:08PM +0200, Thomas Haller wrote:
> Be more careful about casting an uint32_t value to "enum expr_types" and
> make fewer assumptions about the underlying integer type of the enum.
> Instead, be clear about where we have an untrusted uint32_t from netlink
> and an enum. Rename expr_ops_by_type() to expr_ops_by_type_u32() to make
> this clearer. Later we might make the enum as packed, when this starts
> to matter more.
>
> Also, only the code path expr_ops() wants strict validation and assert
> against valid enum values. Move the assertion out of
> __expr_ops_by_type(). Then expr_ops_by_type_u32() does not need to
> duplicate the handling of EXPR_INVALID. We still need to duplicate the
> check against EXPR_MAX, to ensure that the uint32_t value can be cast to
> an enum value.
>
> Signed-off-by: Thomas Haller <thaller@redhat.com>
> ---
> include/expression.h | 2 +-
> src/expression.c | 23 +++++++++++------------
> src/netlink.c | 4 ++--
> 3 files changed, 14 insertions(+), 15 deletions(-)
>
> diff --git a/include/expression.h b/include/expression.h
> index 469f41ecd613..aede223db741 100644
> --- a/include/expression.h
> +++ b/include/expression.h
> @@ -189,7 +189,7 @@ struct expr_ops {
> };
>
> const struct expr_ops *expr_ops(const struct expr *e);
> -const struct expr_ops *expr_ops_by_type(enum expr_types etype);
> +const struct expr_ops *expr_ops_by_type_u32(uint32_t value);
>
> /**
> * enum expr_flags
> diff --git a/src/expression.c b/src/expression.c
> index 87d5a9fcbe09..320c02be522c 100644
> --- a/src/expression.c
> +++ b/src/expression.c
> @@ -995,7 +995,7 @@ static struct expr *concat_expr_parse_udata(const struct nftnl_udata *attr)
> goto err_free;
>
> etype = nftnl_udata_get_u32(nest_ud[NFTNL_UDATA_SET_KEY_CONCAT_SUB_TYPE]);
> - ops = expr_ops_by_type(etype);
> + ops = expr_ops_by_type_u32(etype);
> if (!ops || !ops->parse_udata)
> goto err_free;
>
> @@ -1509,9 +1509,7 @@ void range_expr_value_high(mpz_t rop, const struct expr *expr)
> static const struct expr_ops *__expr_ops_by_type(enum expr_types etype)
> {
> switch (etype) {
> - case EXPR_INVALID:
> - BUG("Invalid expression ops requested");
> - break;
> + case EXPR_INVALID: break;
> case EXPR_VERDICT: return &verdict_expr_ops;
> case EXPR_SYMBOL: return &symbol_expr_ops;
> case EXPR_VARIABLE: return &variable_expr_ops;
> @@ -1543,21 +1541,22 @@ static const struct expr_ops *__expr_ops_by_type(enum expr_types etype)
> case EXPR_FLAGCMP: return &flagcmp_expr_ops;
> }
>
> - BUG("Unknown expression type %d\n", etype);
> + return NULL;
> }
>
> const struct expr_ops *expr_ops(const struct expr *e)
> {
> - return __expr_ops_by_type(e->etype);
> + const struct expr_ops *ops;
> +
> + ops = __expr_ops_by_type(e->etype);
> + if (!ops)
> + BUG("Unknown expression type %d\n", e->etype);
> + return ops;
> }
>
> -const struct expr_ops *expr_ops_by_type(enum expr_types value)
> +const struct expr_ops *expr_ops_by_type_u32(uint32_t value)
> {
> - /* value might come from unreliable source, such as "udata"
> - * annotation of set keys. Avoid BUG() assertion.
> - */
> - if (value == EXPR_INVALID || value > EXPR_MAX)
> + if (value > (uint32_t) EXPR_MAX)
I think this still allows a third party to set EXPR_INVALID in the
netlink userdata attribute, right?
> return NULL;
> -
> return __expr_ops_by_type(value);
> }
> diff --git a/src/netlink.c b/src/netlink.c
> index 70ebf382b14f..8af579c7b778 100644
> --- a/src/netlink.c
> +++ b/src/netlink.c
> @@ -878,8 +878,8 @@ static struct expr *set_make_key(const struct nftnl_udata *attr)
> {
> const struct nftnl_udata *ud[NFTNL_UDATA_SET_TYPEOF_MAX + 1] = {};
> const struct expr_ops *ops;
> - enum expr_types etype;
> struct expr *expr;
> + uint32_t etype;
> int err;
>
> if (!attr)
> @@ -895,7 +895,7 @@ static struct expr *set_make_key(const struct nftnl_udata *attr)
> return NULL;
>
> etype = nftnl_udata_get_u32(ud[NFTNL_UDATA_SET_TYPEOF_EXPR]);
> - ops = expr_ops_by_type(etype);
> + ops = expr_ops_by_type_u32(etype);
> if (!ops)
> return NULL;
>
> --
> 2.41.0
>
next prev parent reply other threads:[~2023-09-20 18:13 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-09-20 14:26 [PATCH nft 0/9] various cleanups related to enums and struct datatype Thomas Haller
2023-09-20 14:26 ` [PATCH nft 1/9] src: fix indentation/whitespace Thomas Haller
2023-09-20 16:03 ` Pablo Neira Ayuso
2023-09-20 14:26 ` [PATCH nft 2/9] include: fix missing definitions in <cache.h>/<headers.h> Thomas Haller
2023-09-20 14:26 ` [PATCH nft 3/9] datatype: drop flags field from datatype Thomas Haller
2023-09-20 18:10 ` Pablo Neira Ayuso
2023-09-20 19:23 ` Thomas Haller
2023-09-21 14:23 ` Pablo Neira Ayuso
2023-09-22 8:51 ` Thomas Haller
2023-09-22 11:18 ` Pablo Neira Ayuso
2023-09-20 14:26 ` [PATCH nft 4/9] datatype: use "enum byteorder" instead of int in set_datatype_alloc() Thomas Haller
2023-09-20 16:27 ` Pablo Neira Ayuso
2023-09-20 14:26 ` [PATCH nft 5/9] payload: use enum icmp_hdr_field_type in payload_may_dependency_kill_icmp() Thomas Haller
2023-09-20 16:32 ` Pablo Neira Ayuso
2023-09-20 14:26 ` [PATCH nft 6/9] netlink: handle invalid etype in set_make_key() Thomas Haller
2023-09-20 16:22 ` Pablo Neira Ayuso
2023-09-20 16:24 ` Pablo Neira Ayuso
2023-09-20 14:26 ` [PATCH nft 7/9] expression: cleanup expr_ops_by_type() and handle u32 input Thomas Haller
2023-09-20 18:13 ` Pablo Neira Ayuso [this message]
2023-09-20 19:28 ` Thomas Haller
2023-09-21 14:19 ` Pablo Neira Ayuso
2023-09-22 8:54 ` Thomas Haller
2023-09-22 9:56 ` Pablo Neira Ayuso
2023-09-25 8:44 ` Pablo Neira Ayuso
2023-09-20 14:26 ` [PATCH nft 8/9] datatype: use __attribute__((packed)) instead of enum bitfields Thomas Haller
2023-09-20 16:02 ` Pablo Neira Ayuso
2023-09-20 17:48 ` Thomas Haller
2023-09-20 18:07 ` Pablo Neira Ayuso
2023-09-20 16:46 ` Pablo Neira Ayuso
2023-09-20 14:26 ` [PATCH nft 9/9] proto: add missing proto_definitions for PROTO_DESC_GENEVE Thomas Haller
2023-09-20 16:14 ` Pablo Neira Ayuso
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZQs2Pmq6J5ZdXDQb@calendula \
--to=pablo@netfilter.org \
--cc=netfilter-devel@vger.kernel.org \
--cc=thaller@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.