Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 4 Sep 2001 11:00:03 -0700 (PDT)
From:      Jin Guojun <j_guojun@lbl.gov>
To:        freebsd-bugs@FreeBSD.org
Subject:   Re: kern/16644: Bad comparsion expression in bpf_filter.c
Message-ID:  <200109041800.f84I03r03259@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/16644; it has been noted by GNATS.

From: Jin Guojun <j_guojun@lbl.gov>
To: Bruce Evans <bde@zeta.org.au>, mike@FreeBSD.ORG,
	freebsd-gnats-submit@FreeBSD.ORG
Cc:  
Subject: Re: kern/16644: Bad comparsion expression in bpf_filter.c
Date: Tue, 04 Sep 2001 11:01:44 -0700

 There was a typo in the previous message I sent.
 < It fixed the undefined overflow problem. Signed K does not work correctly,
 
 ^^^^^
 should be
 > It fixed the undefined overflow problem. Unsigned K does not work correctly,
 
 ^^^^^^^
 
     -Jin
 
 Jin Guojun wrote:
 
 > Bruce Evans wrote:
 >
 > > On Fri, 31 Aug 2001, Jin Guojun[ITG] wrote:
 > >
 > > > It is still there. I have replied this to the discussion and
 > > > got no response. For example, in line 220, ">" line is equal to
 > > > if (k > buflen || k + sizeof(int32_t) > buflen) {
 > > > or
 > > > if (k > buflen || k > buflen - sizeof(int32_t)) {
 > > >
 > > > if K > BUFLEN then K must > BUFLEN - 4
 > >
 > > This doesn't follow.  Example: K = 4U, BUFLEN = 2U, BUFLEN - 4 = UINT_MAX - 2.
 > > BUFLEN - 4 overflows.  I'm not sure if this overflow can give undefined
 > > behaviour instead of UINT_MAX - 2.
 > >
 > > > so we only want to judge if (k > buflen - sizeof(int32_t)) {
 > > > which is the "<" of line 220 -- if (k + sizeof(int32_t) > buflen) {
 > > >
 > > > Right? rests are ditto. The original design is correct.
 > >
 > > No.  Examples:
 > >
 > > (1) k = UINT_MAX - 2, buflen = 8U.  Then k + sizeof(int32_t) = 2U, which
 > >     is <= buflen.  But k is much larger than buflen - sizeof(int32_t).
 > >     Here arithmetic overflow occurs in the buffer overflow check and
 > >     the buffer overflow check gives the wrong result.  The overflow
 > >     checks were rewritten in FreeBSD to avoid arithmetic overflow.
 > > (2) k = -2 (signed int, as in the original design), buflen = 8U.  Then
 > >     k + sizeof(int32_t) = 2U (no change).  This is the same overflow as
 > >     in (1).  k first gets promoted to UINT_MAX - 2, then the addition
 > >     overflows.
 > >
 > > > The real problem is at line 550. K is outside 0-BPF_MEMWORDS, not just >.
 > > > ...
 > > > 547c550
 > > > <                   (p->k >= BPF_MEMWORDS || p->k < 0))
 > > > ---
 > > > >                   p->k >= BPF_MEMWORDS)
 > >
 > > This patch is reversed (it gives the FreeBSD change).  Here FreeBSD
 > > simplified the check instead of complicating it.  p->k < 0 can't happen
 > > because p->k is unsigned.  The compiler should optimize away the
 > > complication and generate identical code, but it migh warn about a
 > > bogus comparison of an unsigned value with 0.
 > >
 > > Bruce
 >
 > The entire thing is messed up because the k is revised in the lastest BPF
 > release.
 > k is signed in the lastest release, and all above explanation is beased on signed
 > K.
 > It fixed the undefined overflow problem. Signed K does not work correctly,
 > that is why you had above overflow issue. Overflow is wrong (not intended).
 > Below is I explained to someone who asked about is:
 >
 > -------- original message -----------
 >
 > Jonathan Lemon wrote:
 >
 > > Hello -
 > >
 > >    I'm looking at bpf in FreeBSD, and it appears that our current
 > > definition for the bpf_insn structure is:
 > >
 > >         struct bpf_insn {
 > >                 u_short         code;
 > >                 u_char          jt;
 > >                 u_char          jf;
 > >                 bpf_u_int32     k;
 > >         };
 > >
 > > Note the last line has ``k'' being unsigned.  In the LBL releases,
 > > it seems that there was a bit of confusion on the definition of
 > > this field:
 > >
 > >         original berkeley release:      long
 > >         LBL rev 1.34:                   bpf_u_int32
 > >         LBL rev 1.36:                   bpf_int32
 > >
 > > Not having the RCS logs for the file, its not entirely clear
 > > for the differing definitions here.  Is it intended that 'k'
 > > may be negative in the bpf_insn structure?
 > > --
 > > Jonathan
 >
 > Yes, k may have negtive  value. I cannot recall when FreeBSD changed it,
 > but I remember I read the email about it regarding some expression.
 > They claimed make k non-negtive can fix their problem, I do not know what.
 >
 > Later sometime, I checked their expression which is bogus, so I send email
 > to the bugs@freebsd.org, and explained that expression has nothing to do
 > with int k or uint k. I asked them to change back because uint k breaks the
 > kernel BPF functioning. No one was responsed.
 > So, I put Kernel BPF patch on my web site in case some encounts problems.
 >
 >     -Jin
 

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200109041800.f84I03r03259>