From: Jesper Dangaard Brouer <jbrouer@redhat.com>
To: Eric Dumazet <eric.dumazet@gmail.com>
Cc: Jesper Dangaard Brouer <brouer@redhat.com>,
netdev@vger.kernel.org,
"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>,
Dave Taht <dave.taht@gmail.com>
Subject: Re: [net-next PATCH] net: codel: Avoid undefined behavior from signed overflow
Date: Thu, 31 Oct 2013 15:15:51 +0100 [thread overview]
Message-ID: <20131031151551.675ab908@redhat.com> (raw)
In-Reply-To: <1383156104.4857.49.camel@edumazet-glaptop.roam.corp.google.com>
On Wed, 30 Oct 2013 11:01:44 -0700
Eric Dumazet <eric.dumazet@gmail.com> wrote:
> On Wed, 2013-10-30 at 18:23 +0100, Jesper Dangaard Brouer wrote:
> > From: Jesper Dangaard Brouer <netoptimizer@brouer.com>
> >
> > As described in commit 5a581b367 (jiffies: Avoid undefined
> > behavior from signed overflow), according to the C standard
> > 3.4.3p3, overflow of a signed integer results in undefined
> > behavior.
> >
> > To fix this, do as the above commit, and do an unsigned
> > subtraction, and interpreting the result as a signed
> > two's-complement number. This is based on the theory from
> > RFC 1982 and is nicely described in wikipedia here:
> > https://en.wikipedia.org/wiki/Serial_number_arithmetic#General_Solution
> >
> > A side-note, I have seen practical issues with the previous logic
> > when dealing with 16-bit, on a 64-bit machine (gcc version
> > 4.4.5). This were 32-bit, which I have not observed issues with.
> >
> > Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
> > Signed-off-by: Jesper Dangaard Brouer <netoptimizer@brouer.com>
> > ---
> >
> > include/net/codel.h | 8 ++++----
> > 1 files changed, 4 insertions(+), 4 deletions(-)
> >
> > diff --git a/include/net/codel.h b/include/net/codel.h
> > index 389cf62..700fcdf 100644
> > --- a/include/net/codel.h
> > +++ b/include/net/codel.h
> > @@ -72,10 +72,10 @@ static inline codel_time_t codel_get_time(void)
> > return ns >> CODEL_SHIFT;
> > }
> >
> > -#define codel_time_after(a, b) ((s32)(a) - (s32)(b) > 0)
> > -#define codel_time_after_eq(a, b) ((s32)(a) - (s32)(b) >= 0)
> > -#define codel_time_before(a, b) ((s32)(a) - (s32)(b) < 0)
> > -#define codel_time_before_eq(a, b) ((s32)(a) - (s32)(b) <= 0)
> > +#define codel_time_after(a, b) ((s32)((a) - (b)) > 0)
> > +#define codel_time_after_eq(a, b) ((s32)((a) - (b)) >= 0)
> > +#define codel_time_before(a, b) ((s32)((a) - (b)) < 0)
> > +#define codel_time_before_eq(a, b) ((s32)((a) - (b)) <= 0)
> >
>
> I see nothing enforcing an unsigned subtraction as claimed in your
> changelog.
>
> a / b could be signed.
>
> Paul commit 5a581b367b5 was OK because of existing typecheck(unsigned
> long, ....)
Okay, I'll cook up another patch, after work.
Adding all the typecheck() stuff, just bloats the code.
Would it be better/okay just to do?:
(s32)((u32)(a) - (u32)(b)) > 0)
--
Best regards,
Jesper Dangaard Brouer
MSc.CS, Sr. Network Kernel Developer at Red Hat
Author of http://www.iptv-analyzer.org
LinkedIn: http://www.linkedin.com/in/brouer
next prev parent reply other threads:[~2013-10-31 14:16 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-10-30 17:23 [net-next PATCH] net: codel: Avoid undefined behavior from signed overflow Jesper Dangaard Brouer
2013-10-30 18:01 ` Eric Dumazet
2013-10-31 14:15 ` Jesper Dangaard Brouer [this message]
2013-10-31 15:10 ` Eric Dumazet
2013-10-31 20:40 ` Jesper Dangaard Brouer
2013-10-30 19:35 ` Ben Hutchings
2013-10-30 20:13 ` Paul E. McKenney
2013-10-30 20:19 ` Ben Hutchings
2013-10-31 4:55 ` Paul E. McKenney
2013-10-31 21:53 ` Jesper Dangaard Brouer
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=20131031151551.675ab908@redhat.com \
--to=jbrouer@redhat.com \
--cc=brouer@redhat.com \
--cc=dave.taht@gmail.com \
--cc=eric.dumazet@gmail.com \
--cc=netdev@vger.kernel.org \
--cc=paulmck@linux.vnet.ibm.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.