From: Thomas Haller <thaller@redhat.com>
To: Pablo Neira Ayuso <pablo@netfilter.org>
Cc: NetFilter <netfilter-devel@vger.kernel.org>
Subject: Re: [PATCH nft 5/5] datatype: check against negative "type" argument in datatype_lookup()
Date: Wed, 30 Aug 2023 10:08:50 +0200 [thread overview]
Message-ID: <29aee24e1fb3e7b273b48ee3d735f182c62a0d92.camel@redhat.com> (raw)
In-Reply-To: <ZO7zuKiWk3x7E5bS@calendula>
On Wed, 2023-08-30 at 09:46 +0200, Pablo Neira Ayuso wrote:
> On Tue, Aug 29, 2023 at 09:58:53PM +0200, Thomas Haller wrote:
> > On Tue, 2023-08-29 at 21:14 +0200, Pablo Neira Ayuso wrote:
> > > On Tue, Aug 29, 2023 at 09:10:26PM +0200, Pablo Neira Ayuso
> > > wrote:
> > > > On Tue, Aug 29, 2023 at 08:54:11PM +0200, Thomas Haller wrote:
> > > > > An enum can be either signed or unsigned (implementation
> > > > > defined).
> > > > >
> > > > > datatype_lookup() checks for invalid type arguments. Also
> > > > > check,
> > > > > whether
> > > > > the argument is not negative (which, depending on the
> > > > > compiler it
> > > > > may
> > > > > never be).
> > > > >
> > > > > Signed-off-by: Thomas Haller <thaller@redhat.com>
> > > > > ---
> > > > > src/datatype.c | 2 +-
> > > > > 1 file changed, 1 insertion(+), 1 deletion(-)
> > > > >
> > > > > diff --git a/src/datatype.c b/src/datatype.c
> > > > > index ba1192c83595..91735ff8b360 100644
> > > > > --- a/src/datatype.c
> > > > > +++ b/src/datatype.c
> > > > > @@ -87,7 +87,7 @@ const struct datatype *datatype_lookup(enum
> > > > > datatypes type)
> > > > > {
> > > > > BUILD_BUG_ON(TYPE_MAX & ~TYPE_MASK);
> > > > >
> > > > > - if (type > TYPE_MAX)
> > > > > + if ((uintmax_t) type > TYPE_MAX)
> > > >
> > > > uint32_t ?
> >
> > The more straight forward way would be
> >
> > if (type < 0 || type > TYPE_MAX)
> >
> > However, if the enum is unsigned, then the compiler might see that
> > the
> > condition is never true and warn against that. It does warn, if
> > "type"
> > were just an "unsigned int". I cannot actually reproduce a compiler
> > warning with the enum (for now).
>
> Then, better keep it back?
>
> > The size of the enum is most likely int/unsigned (or smaller, with
> > "-
> > fshort-enums" or packed). Is it on POSIX/Linux always guaranteed
> > that
> > an int is 32bit? I think not, but I cannot find an architecture
> > where
> > int is larger either. Also, if someone would add an enum value
> > larger
> > than the 32 bit range, then the behavior is compiler dependent, but
> > most likely the enum type would be a 64 bit integer and
> > "uint"/"uint32_t" would not be the right check.
>
> I don't expect to ever have such a large number of types.
> Specifically
> because there are API restrictions that apply in this case.
>
> > All of this is highly theoretical. But "uintmax_t" avoids all those
> > problems and makes fewer assumptions on what the enum actually is.
> > Is
> > there a hypothetical scenario where it wouldn't work correctly?
>
> I was trying to figure out what this is fixing.
>
> > > Another question: What warning does clang print on this one?
> > > Description does not specify.
> >
> > this one isn't about a compiler warning. Sorry, I should not have
> > included it in this set.
>
> This TYPE_MAX will not ever become very large to require 64-bits.
TYPE_MAX is not relevant.
> With an implementation where enum is taken as signed, then this
> should
> be sufficient too:
>
> if (type > TYPE_MAX)
>
> If this is not fixing up anything right now, I would prefer to keep
> this back.
I don't think it suffices. The following fail the assertion (or would
access out of bounds).
diff --git c/include/datatype.h i/include/datatype.h
index 9ce7359cd340..7d3b6b20d27c 100644
--- c/include/datatype.h
+++ i/include/datatype.h
@@ -98,7 +98,8 @@ enum datatypes {
TYPE_TIME_HOUR,
TYPE_TIME_DAY,
TYPE_CGROUPV2,
- __TYPE_MAX
+ __TYPE_MAX,
+ __TYPE_FORCE_SIGNED = -1,
};
#define TYPE_MAX (__TYPE_MAX - 1)
diff --git c/src/datatype.c i/src/datatype.c
index ba1192c83595..1ff8a4a08551 100644
--- c/src/datatype.c
+++ i/src/datatype.c
@@ -89,6 +89,7 @@ const struct datatype *datatype_lookup(enum datatypes
type)
if (type > TYPE_MAX)
return NULL;
+ assert(type != (enum datatypes) -1);
return datatypes[type];
}
diff --git c/src/libnftables.c i/src/libnftables.c
index 9c802ec95f27..7e60d1a18d39 100644
--- c/src/libnftables.c
+++ i/src/libnftables.c
@@ -203,6 +203,8 @@ struct nft_ctx *nft_ctx_new(uint32_t flags)
#endif
}
+ datatype_lookup(-1);
+
ctx = xzalloc(sizeof(struct nft_ctx));
nft_init(ctx);
If you expect that "type" is always valid, then there is no need to
check against >TYPE_MAX. If you expect that it might be invalid, it
seems prudent to also check against negative values.
Thomas
next prev parent reply other threads:[~2023-08-30 18:43 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-29 18:54 [PATCH nft 0/5] fix compiler warnings with clang and "-Wextra" Thomas Haller
2023-08-29 18:54 ` [PATCH nft 1/5] rule: fix "const static" declaration Thomas Haller
2023-08-29 18:54 ` [PATCH nft 2/5] utils: call abort() after BUG() macro Thomas Haller
2023-08-29 18:54 ` [PATCH nft 3/5] src: silence "implicit-fallthrough" warnings Thomas Haller
2023-08-29 18:54 ` [PATCH nft 4/5] xt: avoid "-Wmissing-field-initializers" for "original_opts" Thomas Haller
2023-08-29 18:54 ` [PATCH nft 5/5] datatype: check against negative "type" argument in datatype_lookup() Thomas Haller
2023-08-29 19:10 ` Pablo Neira Ayuso
2023-08-29 19:14 ` Pablo Neira Ayuso
2023-08-29 19:58 ` Thomas Haller
2023-08-30 7:46 ` Pablo Neira Ayuso
2023-08-30 8:08 ` Thomas Haller [this message]
2023-08-30 8:23 ` 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=29aee24e1fb3e7b273b48ee3d735f182c62a0d92.camel@redhat.com \
--to=thaller@redhat.com \
--cc=netfilter-devel@vger.kernel.org \
--cc=pablo@netfilter.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).