Date: Tue, 10 Oct 2000 18:14:00 -0700 (PDT) From: Archie Cobbs <archie@whistle.com> To: Bosko Milekic <bmilekic@dsuper.net> Cc: freebsd-net@freebsd.org Subject: Re: ip_input.c patch Message-ID: <200010110114.e9B1E0J40614@bubba.whistle.com> In-Reply-To: <Pine.BSF.4.21.0010101850530.8597-100000@jehovah.technokratis.com> "from Bosko Milekic at Oct 10, 2000 07:11:05 pm"
next in thread | previous in thread | raw e-mail | index | archive | help
Bosko Milekic writes: > > /* > > - * 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) { > > Assuming that you only want to attempt to pullup into a "multiply" > referenced mbuf, this check is OK. Right.. we only need to pullup if (a) we're going to write into the mbuf and (b) it's multiply referenced. > > - if (m->m_flags & M_EXT) { /* XXX */ > > + if ((m->m_flags & M_EXT) != 0 && MEXT_IS_REF(m)) { > > if ((m = m_pullup(m, hlen)) == 0) { > > ipstat.ips_toosmall++; > > How about collapsing that m_pullup into the same if() statement, to > remain consistent with the above? The reason I'm suggesting you be picky > about this is that those relatively repetetive extensive checks on the > "readability" of the mbuf will likely soon be replaced ... as soon as I > merge a few diffs ( :-) ) and it will be simpler to search and replace > this way. I think I'll wait for your diffs. Uh oh.. I just thought of a plan.. :-) 1. Add a new macro to make an mbuf writable: #define M_MKWRITABLE(m, len) do { if ((m)->m_len < (len) || (((m)->m_flags & M_EXT) != 0 && MEXT_IS_REF(m))) { (m) = m_pullup((m), (len)); } } while (0) 2. Temporarily change the definition of mtod() as follows: BEFORE ------ #define mtod(m, t) ((t)((m)->m_data)) AFTER ----- #define mtod(m, t) ((const t)((m)->m_data)) 3. Compile LINT and find and fix every place that generates an error from the const-cast in mtod(): (A) If the code doesn't need to modify the mbuf (probably 99% of the time), then change it like so: BEFORE ------ struct ip *ip; ip = mtod(m, struct ip *); AFTER ------ const struct ip *ip; ip = mtod(m, struct ip *); (B) If the code does modify the mbuf, insert M_MKWRITABLE() at the appropriate point. 4. Put mtod() back the way it was -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?200010110114.e9B1E0J40614>