Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 17 Jan 2012 16:11:57 +1100 (EST)
From:      Bruce Evans <brde@optusnet.com.au>
To:        Andriy Gapon <avg@FreeBSD.org>
Cc:        Kevin Lo <kevlo@FreeBSD.org>, svn-src-all@FreeBSD.org, src-committers@FreeBSD.org, svn-src-stable-8@FreeBSD.org, svn-src-stable@FreeBSD.org
Subject:   Re: svn commit: r230217 - stable/8/sys/kern
Message-ID:  <20120117150710.W1086@besplex.bde.org>
In-Reply-To: <4F143843.9020505@FreeBSD.org>
References:  <201201161440.q0GEeNYI038439@svn.freebsd.org> <4F143843.9020505@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, 16 Jan 2012, Andriy Gapon wrote:

> on 16/01/2012 16:40 Kevin Lo said the following:
>> Log:
>>   Fix build breakage by adding missing mb_put_padbyte()
>>
>> Modified:
>>   stable/8/sys/kern/subr_mchain.c
>>
>> Modified: stable/8/sys/kern/subr_mchain.c
>> ==============================================================================
>> --- stable/8/sys/kern/subr_mchain.c	Mon Jan 16 14:31:01 2012	(r230216)
>> +++ stable/8/sys/kern/subr_mchain.c	Mon Jan 16 14:40:22 2012	(r230217)
>> @@ -125,6 +125,21 @@ mb_reserve(struct mbchain *mbp, int size
>>  }
>>
>>  int
>> +mb_put_padbyte(struct mbchain *mbp)
>> +{
>> +	caddr_t dst;
>> +	char x = 0;
>> +
>> +	dst = mtod(mbp->mb_cur, caddr_t) + mbp->mb_cur->m_len;
>> +
>> +	/* only add padding if address is odd */
>> +	if ((unsigned long)dst & 1)
>> +		return mb_put_mem(mbp, (caddr_t)&x, 1, MB_MSYSTEM);
>> +	else
>> +	return 0;
>
> Broken style above?

No.  Broken style in almost all of the above.  Also a technical bug which
give brokenness on some as yet unsupported arches:

1. Use of caddr_t for dst.  caddr_t was endemic in mbuf code, but has
    been mostly eradicated there, except in a couple of APIs where it
    may be needed for backwards compatibility, and in all of subr_mchain.c.
    So here it is bug for bug compatible with nearby code.

    Here and probably mostly elsewhere, caddr_t is used mainly to do
    pointer arithmetic on it.  It is assumed that caddr_t is precisely
    `char *', so that the pointer arithmetic increases it by 1 per
    increment.  For that use, `char *' should be used directly.

2. Initialization in declaration for x.

3. Meaningless variable name for x.  This bug is endemic in subr_mchain.c.
    This at first confused me into thinking that x was a dummy not-really
    used variable.  It actually holds the padding byte.  Generally in
    subr_mchain.c, for calls to mb_put_mem(), it holds the source data in
    a uintN_t variable.  Here we should also use uint8_t for the variable
    and spell the size of the variable as sizeof(x), so that we look like
    other calls.

    mb_put_mem() has many style bugs too.  It takes a caddr_t source address,
    but should take a `void *' source address.  Its case statement has
    misindented labels...  I had to look at it to see what x does.

4. Non-capitalized comment.

5. Non-terminated comment.

    The last 2 bugs are not endemic in subr_mchain.c, partly because
    subr_mchain.c has very few comments and even fewer comments for
    individual statements (only 8, including 1 for the copyright; no
    others are for individual statements; 1 is banal; all except the
    copyright have style bugs).

6. `unsigned long' is not abbreviated as u_long.

7. `unsigned long' is a logically and possibly physically wrong type
    to use here.  We really want dst to be an integer so that we can
    mask it.  But mtod() starts with a pointer and produces a pointer.
    We should have used it to produce a `char *', but we actually used
    it to produce a caddr_t.  We already assumed that caddr_t is
    precisely `char *'.  Now we only need to assume that it is a
    pointer.  We want to convert it to an integer.  For that, we
    should cast it to uintptr_t.  Instead, we cast it to `unsigned long'.
    This assumes that either uintptr_t is unsigned long (as happens on
    all supported 64-bit arches) or that uintptr_t has the same size as
    unsigned long and the compiler doesn't warn about this type mismatch
    (as happens on all supported 32-bit arches).

    Perhaps we should actually use an alignment macro to do this, but I
    don't know of any suitable one.  _ALIGN() is the main one, and it
    only rounds up.  And its implementation has lots of style bugs (*).

8. Missing parentheses around return value of mb_put_mem().  This bug
    was never common in mbuf code, but it is endemic in subr_mchain.c

9. Missing parentheses around return value of 0.

10. Missing indentation of return of value of 0.

These bugs were all copied from -current.  The last one has been fixed,
at least in -current.  It is the smallest one with the smallest closure.
Another 1000 commits to all branches should be enough to fix them all.

Bruce



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