Date: Wed, 4 Jul 2007 05:52:28 +1000 From: Peter Jeremy <peterjeremy@optushome.com.au> To: Robert Watson <rwatson@freebsd.org> Cc: cvs-src@freebsd.org, src-committers@freebsd.org, cvs-all@freebsd.org Subject: Re: cvs commit: src/sys/sys socketvar.h Message-ID: <20070703195228.GP15680@turion.vk2pj.dyndns.org> In-Reply-To: <200707031014.l63AEE9Y026819@repoman.freebsd.org> References: <200707031014.l63AEE9Y026819@repoman.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
--pE2VAHO2njSJCslu Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On 2007-Jul-03 10:14:13 +0000, Robert Watson <rwatson@freebsd.org> wrote: > Fix a bug in sblock() that has existed since revision 1.1 from BSD: > correctly return an error if M_NOWAIT is passed to sblock() and the > operation might block. This remarkably subtle macro bug appears to > be responsible for quite a few undiagnosed socket buffer corruption > and mbuf-related kernel panics. This bug would appear to be a classic example of the dangers of trying to force force multiple C statements into a single statement. IMHO, it (and many of the other macros in socketvar.h) should be inline functions, rather than macros. IMHO, the following is far more legible: static __inline int sblock(struct sockbuf *sb, int wf) { if (sb->sb_flags & SB_LOCK) return ((wf =3D=3D M_WAITOK) ? sb_lock(sb) : EWOULDBLOCK); else { sb->sb_flags |=3D SB_LOCK; return (0); } } --=20 Peter Jeremy --pE2VAHO2njSJCslu Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.7 (FreeBSD) iD8DBQFGiqj8/opHv/APuIcRArpaAKC2NEu4WSZCp1SfpMQMZtZkeOyB6wCeNpKM rLx8sl952WKNhYYL4aSercU= =UNvf -----END PGP SIGNATURE----- --pE2VAHO2njSJCslu--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20070703195228.GP15680>