public inbox for passt-dev@passt.top
 help / color / mirror / code / Atom feed
From: David Gibson <david@gibson.dropbear.id.au>
To: Stefano Brivio <sbrivio@redhat.com>
Cc: passt-dev@passt.top, Jon Maloy <jmaloy@redhat.com>,
	Laurent Vivier <lvivier@redhat.com>
Subject: Re: [PATCH v7 18/18] fwd_rule: Fix static checkers warnings in fwd_rule_add()
Date: Wed, 6 May 2026 00:41:15 +1000	[thread overview]
Message-ID: <afoBi-YRcgQLM4s3@zatzit> (raw)
In-Reply-To: <20260505121340.3a548603@elisabeth>

[-- Attachment #1: Type: text/plain, Size: 4564 bytes --]

On Tue, May 05, 2026 at 12:13:41PM +0200, Stefano Brivio wrote:
> On Tue, 5 May 2026 16:22:43 +1000
> David Gibson <david@gibson.dropbear.id.au> wrote:
> 
> > On Tue, May 05, 2026 at 01:11:42AM +0200, Stefano Brivio wrote:
> > > The new checks are actually sufficient but not enough for Coverity
> > > Scan. Now that fwd->sock_count and new->last are affected or supplied
> > > by clients, we need explicit (albeit redundant) checks on them.
> > > 
> > > Signed-off-by: Stefano Brivio <sbrivio@redhat.com>  
> > 
> > I'm assuming this does squash the warnings, but I think it does so in
> > a somewhat confusing way.
> 
> You don't need to assume that, you could try yourself without this
> patch and you'll see exactly two warnings with a lot of details.

I'm getting better, but I'm by no means well yet.  Some emails were
within my capacity.  Sorting out the new license key and doing a
Coverity run, not so much.

> 
> > > ---
> > >  fwd_rule.c | 9 +++++++++
> > >  1 file changed, 9 insertions(+)
> > > 
> > > diff --git a/fwd_rule.c b/fwd_rule.c
> > > index b55e4df..03e8e80 100644
> > > --- a/fwd_rule.c
> > > +++ b/fwd_rule.c
> > > @@ -271,13 +271,22 @@ int fwd_rule_add(struct fwd_table *fwd, const struct fwd_rule *new)
> > >  		warn("Too many rules (maximum %d)", ARRAY_SIZE(fwd->rules));
> > >  		return -ENOSPC;
> > >  	}
> > > +
> > >  	if ((fwd->sock_count + num) > ARRAY_SIZE(fwd->socks)) {
> > >  		warn("Rules require too many listening sockets (maximum %d)",
> > >  		     ARRAY_SIZE(fwd->socks));
> > >  		return -ENOSPC;
> > >  	}
> > > +	/* Redundant, to make static checkers happy */
> > > +	if (fwd->sock_count > ARRAY_SIZE(fwd->socks))
> > > +		return -ENOSPC;  
> > 
> > So there's actually two conditions that this is kind of relevant to:
> > 
> >  1) (fwd->sock_count > ARRAY_SIZE(fwd->socks)) on entry
> > 
> > That means something is horribly wrong before we were even called.
> > So, I think that would be better as an assert().
> > 
> >   2) (fwd->sock_count + num) overflows
> > 
> > That's a closer-to-real concern.  I'm pretty sure we can't hit it for
> > real, because num is necessarily <= 65536, so as long as (1) is true
> > this can't overflow.  But that relies on the specific value of
> > ARRAY_SIZE(fwd->socks), so it's kind of fragile.
> > 
> > I think an explicit check for this is a good idea, but it should
> > actually check for this, not just side-effects of it, so:
> > 	if (fwd->sock_count + num <= fwd->sock_count) {
> > 		warn("Blah blah overflow");
> > 		return -EFAULT; /* or whatever */
> > 	}
> > 
> > >  	fwd->rulesocks[fwd->count] = &fwd->socks[fwd->sock_count];
> > > +
> > > +	/* Redundant ('num' checked above), but not for static checkers */
> > > +	if (new->last > ARRAY_SIZE(fwd->socks) + new->first)
> > > +		return -ENOSPC;  
> > 
> > This way of organising the check is very confusing to me.  I'm not
> > really sure what it's trying to catch.
> 
> Same as above.

I'm not sure which "above" you mean.

> > We've already checked that
> > last >= first, so using num is safer to deal with at this
> > point than ARRAY_SIZE() + first, which could in principle overflow
> > even if sock_count + num is perfectly ok.
> 
> Using 'num' won't work. It shouldn't overflow anyway because the
> addition happens in 'int'.

It shouldn't overflow, but proving that requires knowing that:
	a. sock_count is bounded by ARRAY_SIZE(socks)
	b. first, last and num are bounded by 2^16
	c. ARRAY_SIZE(socks) + 2^16 won't overflow (in unsigned int)

I'm not sure which part coverity is missing.  (c) at least requires
knowledge which is not found in immediately adjacent code.

Oh... and... I just remembered that ARRAY_SIZE() is int, not unsigned
(or size_t).  I thought about changing that at some point, but it
seemed to cause more trouble than it was worth.  Does keep tripping me
though, since it seems like it logically ought to be unsigned.  Signed
overflows are much nastier (UB) that unsigned overflows.

> I'll try to change the rest if I find some time but it doesn't really
> look that critical to me.
> 
> > >  	for (port = new->first; port <= new->last; port++)
> > >  		fwd->rulesocks[fwd->count][port - new->first] = -1;
> > >  
> > > -- 
> > > 2.43.0
> > >   
> > 
> 
> -- 
> Stefano
> 

-- 
David Gibson (he or they)	| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you, not the other way
				| around.
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

  reply	other threads:[~2026-05-05 14:41 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-04 23:11 [PATCH v7 00/18] Dynamic configuration update implementation Stefano Brivio
2026-05-04 23:11 ` [PATCH v7 01/18] conf, fwd: Stricter rule checking in fwd_rule_add() Stefano Brivio
2026-05-04 23:11 ` [PATCH v7 02/18] fwd_rule: Move ephemeral port probing to fwd_rule.c Stefano Brivio
2026-05-04 23:11 ` [PATCH v7 03/18] fwd, conf: Move rule parsing code to fwd_rule.[ch] Stefano Brivio
2026-05-04 23:11 ` [PATCH v7 04/18] fwd_rule: Move conflict checking back within fwd_rule_add() Stefano Brivio
2026-05-04 23:11 ` [PATCH v7 05/18] fwd: Generalise fwd_rules_info() Stefano Brivio
2026-05-04 23:11 ` [PATCH v7 06/18] pif: Limit pif names to 128 bytes Stefano Brivio
2026-05-04 23:11 ` [PATCH v7 07/18] fwd_rule: Fix some format specifiers Stefano Brivio
2026-05-04 23:11 ` [PATCH v7 08/18] pesto: Introduce stub configuration tool Stefano Brivio
2026-05-05  7:06   ` Laurent Vivier
2026-05-04 23:11 ` [PATCH v7 09/18] pesto, log: Share log.h (but not log.c) with pesto tool Stefano Brivio
2026-05-04 23:11 ` [PATCH v7 10/18] pesto, conf: Have pesto connect to passt and check versions Stefano Brivio
2026-05-04 23:11 ` [PATCH v7 11/18] pesto: Expose list of pifs to pesto and display them Stefano Brivio
2026-05-04 23:11 ` [PATCH v7 12/18] ip: Prepare ip.[ch] for sharing with pesto tool Stefano Brivio
2026-05-04 23:11 ` [PATCH v7 13/18] inany: Prepare inany.[ch] " Stefano Brivio
2026-05-04 23:11 ` [PATCH v7 14/18] pesto: Read current ruleset from passt/pasta and optionally display it Stefano Brivio
2026-05-04 23:11 ` [PATCH v7 15/18] pesto: Parse and add new rules from command line Stefano Brivio
2026-05-05  7:31   ` Laurent Vivier
2026-05-05 23:47     ` Stefano Brivio
2026-05-04 23:11 ` [PATCH v7 16/18] pesto, conf: Send updated rules from pesto back to passt/pasta Stefano Brivio
2026-05-05  7:53   ` Laurent Vivier
2026-05-05  9:58     ` David Gibson
2026-05-05 10:04     ` Stefano Brivio
2026-05-04 23:11 ` [PATCH v7 17/18] conf, fwd: Allow switching to new rules received from pesto Stefano Brivio
2026-05-05  9:08   ` Laurent Vivier
2026-05-05  9:53     ` David Gibson
2026-05-05 10:15       ` Stefano Brivio
2026-05-05 10:20         ` Laurent Vivier
2026-05-05 14:29         ` David Gibson
2026-05-05 10:04     ` Stefano Brivio
2026-05-05 14:32       ` David Gibson
2026-05-05 23:47     ` Stefano Brivio
2026-05-04 23:11 ` [PATCH v7 18/18] fwd_rule: Fix static checkers warnings in fwd_rule_add() Stefano Brivio
2026-05-05  6:22   ` David Gibson
2026-05-05 10:13     ` Stefano Brivio
2026-05-05 14:41       ` David Gibson [this message]
2026-05-06  7:46         ` Stefano Brivio
2026-05-06  8:00           ` David Gibson
2026-05-06  8:25             ` Stefano Brivio

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=afoBi-YRcgQLM4s3@zatzit \
    --to=david@gibson.dropbear.id.au \
    --cc=jmaloy@redhat.com \
    --cc=lvivier@redhat.com \
    --cc=passt-dev@passt.top \
    --cc=sbrivio@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.
Code repositories for project(s) associated with this public inbox

	https://passt.top/passt

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 IMAP folder(s).