From: Alexey Dobriyan <adobriyan@gmail.com>
To: Dan Carpenter <dan.carpenter@linaro.org>
Cc: Steffen Klassert <steffen.klassert@secunet.com>,
Herbert Xu <herbert@gondor.apana.org.au>,
"David S. Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@google.com>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
Simon Horman <horms@kernel.org>,
netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
kernel-janitors@vger.kernel.org
Subject: Re: less size_t please (was Re: [PATCH net] xfrm: fix integer overflow in xfrm_replay_state_esn_len())
Date: Thu, 6 Feb 2025 20:06:55 +0300 [thread overview]
Message-ID: <3c8d42ca-fcaf-497d-ac86-cc2fc9cf984f@p183> (raw)
In-Reply-To: <1ee57015-a2c3-4dd1-99c2-53e9ff50a09f@stanley.mountain>
On Thu, Jan 30, 2025 at 07:15:15PM +0300, Dan Carpenter wrote:
> On Thu, Jan 30, 2025 at 04:44:42PM +0300, Alexey Dobriyan wrote:
> > > -static inline unsigned int xfrm_replay_state_esn_len(struct xfrm_replay_state_esn *replay_esn)
> > > +static inline size_t xfrm_replay_state_esn_len(struct xfrm_replay_state_esn *replay_esn)
> > > {
> > > - return sizeof(*replay_esn) + replay_esn->bmp_len * sizeof(__u32);
> > > + return size_add(sizeof(*replay_esn), size_mul(replay_esn->bmp_len, sizeof(__u32)));
> >
> > Please don't do this.
> >
> > You can (and should!) make calculations and check for overflow at the
> > same time. It's very efficient.
> >
> > > 1) Use size_add() and size_mul(). This change is necessary for 32bit systems.
> >
> > This bloats code on 32-bit.
> >
>
> I'm not sure I understand. On 32-bit systems a size_t and an unsigned
> int are the same size. Did you mean to say 64-bit?
It looks like yes.
> Declaring sizes as u32 leads to integer overflows like this one.
No, the problem is unchecked C addition and mixing types which confuses
people (in the opposite direction too -- there were fake CVEs because
someone thought "size_t len" in write hooks could be big enough).
The answer is to use single type as much as possible and using checked
additions on-the-go at every binary operator if possible.
Of course one bug could be fixed in multiple ways.
> If you look at integer overflows with security implications there is a
> 5 to 1 ratio of bugs that only affect 32-bit vs bugs that affect
> everything because it's just so much easier to overflow a 32-bit size.
>
> aab98e2dbd64 ("ksmbd: fix integer overflows on 32 bit systems")
> 16ebb6f5b629 ("nfp: bpf: prevent integer overflow in nfp_bpf_event_output()")
> 09c4a6101532 ("rtc: tps6594: Fix integer overflow on 32bit systems")
> 55cf2f4b945f ("binfmt_flat: Fix integer overflow bug on 32 bit systems")
> fbbd84af6ba7 ("chelsio/chtls: prevent potential integer overflow on 32bit")
> bd96a3935e89 ("rdma/cxgb4: Prevent potential integer overflow on 32bit")
> d0257e089d1b ("RDMA/uverbs: Prevent integer overflow issue")
This one is good demonstration why BAO is better:
https://godbolt.org/z/14ofdfvhc
> 3c63d8946e57 ("svcrdma: Address an integer overflow")
> 7f33b92e5b18 ("NFSD: Prevent a potential integer overflow")
>
> > int len;
> > if (__builtin_mul_overflow(replay_esn->bmp_len, 4, &len)) {
> > return true;
> > }
> > if (__builtin_add_overflow(len, sizeof(*replay_esn), &len)) {
> > return true;
> > }
>
> This is so ugly... :/ I'd prefer to just do open code the check at
> that point.
>
> static inline int xfrm_replay_state_esn_len(struct xfrm_replay_state_esn *replay_esn)
> {
> if (replay_esn->bmp_len > (INT_MAX - sizeof(*replay_esn)) / sizeof(__u32))
> return -EINVAL;
> return sizeof(*replay_esn) + replay_esn->bmp_len * sizeof(__u32);
> }
You can't open code if you have something like this:
X = a * b + c;
Second, the code is now effectively duplicated, once in overflow check,
second time in actual calculation.
BAO and BMO may look chatty but they're doing the right thing.
next prev parent reply other threads:[~2025-02-06 17:06 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-30 13:44 less size_t please (was Re: [PATCH net] xfrm: fix integer overflow in xfrm_replay_state_esn_len()) Alexey Dobriyan
2025-01-30 16:15 ` Dan Carpenter
2025-02-06 17:06 ` Alexey Dobriyan [this message]
2025-02-07 7:46 ` Dan Carpenter
2025-03-07 13:43 ` Dan Carpenter
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=3c8d42ca-fcaf-497d-ac86-cc2fc9cf984f@p183 \
--to=adobriyan@gmail.com \
--cc=dan.carpenter@linaro.org \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=herbert@gondor.apana.org.au \
--cc=horms@kernel.org \
--cc=kernel-janitors@vger.kernel.org \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=steffen.klassert@secunet.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox