Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 2 Oct 2014 09:32:34 +0200
From:      Michael Tuexen <Michael.Tuexen@lurchi.franken.de>
To:        Bryan Venteicher <bryanv@daemoninthecloset.org>
Cc:        FreeBSD Net <freebsd-net@freebsd.org>
Subject:   Re: UDP/IPv6 handling
Message-ID:  <6AF1921D-BAFB-4969-80EF-C1CE37446D65@lurchi.franken.de>
In-Reply-To: <CAMo0n6Q56yvHYp8XUG499gkkxL0=QRdTVDvph9jA=kNL4%2BS-1A@mail.gmail.com>
References:  <B30E0A41-51B0-442C-9476-0D9E99C0D37C@lurchi.franken.de> <CAMo0n6Q56yvHYp8XUG499gkkxL0=QRdTVDvph9jA=kNL4%2BS-1A@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On 02 Oct 2014, at 05:51, Bryan Venteicher =
<bryanv@daemoninthecloset.org> wrote:

>=20
>=20
> On Wed, Oct 1, 2014 at 11:58 AM, Michael Tuexen =
<Michael.Tuexen@lurchi.franken.de> wrote:
> Dear all,
>=20
> in udp6_input() we have the following code:
>=20
>         if (nxt =3D=3D IPPROTO_UDP && plen !=3D ulen) {
>                 UDPSTAT_INC(udps_badlen);
>                 goto badunlocked;
>         }
>         /*
>          * Checksum extended UDP header and data.
>          */
>         if (uh->uh_sum =3D=3D 0) {
>                 if (ulen > plen || ulen < sizeof(struct udphdr)) {
>                         UDPSTAT_INC(udps_nosum);
>                         goto badunlocked;
>                 }
>         }
>=20
> I'm trying to understand the UDP code path...
>=20
>=20
> =E2=80=8BI too was recently confused by this code. =E2=80=8BI pointed =
out one issue to kevlo@ recently, but it still kind of seemed like the =
UDP-Lite was mismerged to IPv6.
I have a patch (to be committed soon which fixes UDPLite/IPv6).
>=20
> So (ulen > plen) can't be true. I'm wondering why do we only check the =
ulen is not too
> short only in the case when the UDP checksum is zero. A zero checksum =
should also never happen.
Yepp.
>=20
>=20
> =E2=80=8BI hope to have a patch for =E2=80=8BRFC6935 [1] soon so a =
zero checksum may be allowed if the inp/udpcb is configured for it.
Great. However, we need to check that ulen is at least sizeof(struct =
udphdr) in any case.
>=20
>=20
> I think we should check for ulen < sizeof(struct udphdr) in any case.
>=20
>=20
> =E2=80=8BI think previously, the checks in ip6_input(), =
IP6_EXTHDR_CHECK(), and plen =3D=3D ulen made this unnecessary. I think =
we'd want to do it for UDP-Lite if ulen was not initially zero.
But IP6_EXTHDR_CHECK doesn't check any fields in the packet. So it can =
happen that plen =3D=3D ulen and ulen < sizeof(struct udphdr)...

Best regards
Michael
> =E2=80=8B[1]  - http://tools.ietf.org/html/rfc6935=E2=80=8B
> =20
> Opinions?
>=20
> Best regards
> Michael
> _______________________________________________
> freebsd-net@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-net
> To unsubscribe, send any mail to "freebsd-net-unsubscribe@freebsd.org"
>=20




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?6AF1921D-BAFB-4969-80EF-C1CE37446D65>