Date: Wed, 11 Oct 2000 10:41:49 -0700 (PDT) From: Archie Cobbs <archie@whistle.com> To: Ruslan Ermilov <ru@FreeBSD.org> Cc: bmilekic@FreeBSD.org, freebsd-net@FreeBSD.org Subject: Re: ip_input.c patch Message-ID: <200010111741.e9BHfnA45588@bubba.whistle.com> In-Reply-To: <20001011105823.C56373@sunbay.com> "from Ruslan Ermilov at Oct 11, 2000 10:58:23 am"
next in thread | previous in thread | raw e-mail | index | archive | help
Ruslan Ermilov writes:
> > +#if BYTE_ORDER != BIG_ENDIAN
> > /*
> > - * Convert fields to host representation.
> > + * Convert fields to host representation. But first make
> > + * sure we don't write into a multiply-referenced mbuf.
> > */
> > + if ((m->m_flags & M_EXT) != 0 && MEXT_IS_REF(m)
> > + && (m = m_pullup(m, sizeof(*ip))) == NULL) {
> > + ipstat.ips_badhlen++;
> > + return;
> > + }
> > NTOHS(ip->ip_len);
> > + NTOHS(ip->ip_off);
> > +#endif /* !BIG_ENDIAN */
> > if (ip->ip_len < hlen) {
> > ipstat.ips_badlen++;
> > goto bad;
> > }
> > - NTOHS(ip->ip_off);
> >
> > /*
> > * Check that the amount of data in the buffers
>
> This hunk does not look fine to me. Firstly, there is no need for
> BYTE_ORDER check; endian.h'es already handle this. Secondly, if you
> m_pullup(), `m' may become realloced thus invalidating the `ip' pointer.
> And lastly, it does not do anything useful, since at this point `m' is
> already pulled up to hlen >= sizeof(struct ip). Or maybe I am just
> overlooking something...
You are right about not updating `ip'. Here is the justification
for the other stuff:
- #if BYTE_ORDER is used because the entire `if ((m->m_flags & M_EXT) ...'
statement can be omitted on big endian machines, because we don't
need to modify the mbuf
- Secondly, `it does not do anything useful' is incorrect.. the point
it to insure the mbuf is writable. The hlen >= sizeof(struct ip)
pullup only happens if the first mbuf was < sizeof(struct ip),
and in particular in the case of a shared cluster this will not
be the case.
Now, having said all that, I agree that the best solution is to forget
my patches and instead change ip_input() to not modify the mbuf at all.
Thanks,
-Archie
___________________________________________________________________________
Archie Cobbs * Whistle Communications, Inc. * http://www.whistle.com
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-net" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200010111741.e9BHfnA45588>
