Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 19 Jul 2014 05:46:23 -0500
From:      Pedro Giffuni <pfg@freebsd.org>
To:        Bruce Evans <brde@optusnet.com.au>
Cc:        svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org
Subject:   Re: svn commit: r268867 - head/lib/libc/net
Message-ID:  <A66005FE-1A28-417A-8268-9690BC68EFD7@freebsd.org>
In-Reply-To: <20140719171552.W874@besplex.bde.org>
References:  <201407190153.s6J1rqBn027367@svn.freebsd.org> <20140719171552.W874@besplex.bde.org>

next in thread | previous in thread | raw e-mail | index | archive | help
Hello;

Il giorno 19/lug/2014, alle ore 02:36, Bruce Evans =
<brde@optusnet.com.au> ha scritto:

> On Sat, 19 Jul 2014, Pedro F. Giffuni wrote:
>=20
>> Log:
>> Use unsigned optlen in getsourcefilter()
>>=20
>> Sizes can not be negative and the functions that use it
>> expect an unsigned value anyways.
>>=20
>> Obtained from:	Apple (Libc-997.90.3)
>> MFC after:	1 week
>=20
> Most uses of unsigned types are bugs.  This one is an exception, but =
the
> change is still wrong.  The critical use of the type needs it to be
> socklen_t, not int or unsigned int.  socklen_t happens to have type
> uint32_t (unsigned due to old bugs).  It only accidentally has the
> same size as unsigned int.  It has a different type to plain int so
> compilers should warn about the type mismatch with certain warning
> flags.
>=20

Ah, yes, we have had this discussion before =85 in relation with ext2fs =
;).
The compiler doesn=92t have a way to tell if socklen_t is of a certain =
type "by accident=94.
I will use socklen_t in this case instead of unsigned int, but I will =
not MFC the changes
as the original change has no functional (end-user) effect.
=20

>> Modified:
>> head/lib/libc/net/sourcefilter.c
>>=20
>> Modified: head/lib/libc/net/sourcefilter.c
>> =
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
>> --- head/lib/libc/net/sourcefilter.c	Sat Jul 19 01:15:01 2014	=
(r268866)
>> +++ head/lib/libc/net/sourcefilter.c	Sat Jul 19 01:53:52 2014	=
(r268867)
>> @@ -337,7 +337,8 @@ getsourcefilter(int s, uint32_t interfac
>> {
>> 	struct __msfilterreq	 msfr;
>> 	sockunion_t		*psu;
>> -	int			 err, level, nsrcs, optlen, optname;
>> +	int			 err, level, nsrcs, optname;
>> +	unsigned int		 optlen;
>=20
> This has mounds of style bugs.  2 more now (unsorting, and not using
> u_int, except u_int is not just a style bug)
>=20

While aesthetically it may be better to keep the sorting, it doesn=92t =
seem correct to preserve it at the expense of setting the incorrect =
type. Would you really want me to set optname in another line?

> Other uses of this variable:
>=20
> % 	optlen =3D sizeof(struct __msfilterreq);
>=20
> The rvalue has type size_t.  Unsigned is actually correct for size_t.
> The lvalue has a smaller type in many cases and we need to know that
> the result fits.  We know that it is small, so if fits just as well
> in an int as in an u_int.  It is less clear that it fits in a =
socklen_t
> since that is supposed to be opaque.
>=20
> % 	memset(&msfr, 0, optlen);
>=20
> memset() takes a size_t for its 3rd arg, but any type that can =
represent
> the value works provided memset()'s prototype is in scope.
>=20
> % 	err =3D _getsockopt(s, level, optname, &msfr, &optlen);
>=20
> This use needs the correct type since the reference is indirect so the
> prototype can't adjust the type.  The arg had type "int *" in 4.4BSD
> but has suffered from typedef poisoning so it is now "socklen_t *"
> 4.4BSD also doesn't have socklen_t.  socklen_t is specified by POSIX
> as being an integer type with width at least 32 bits.  It is not
> required to be unsigned, and there are portability problems from this.
> POSIX recommends that applications not store values larger than =
2**31-1
> in socklen_t.  2**31 would only work if it is unsigned.
>=20

While locally the variable doesn=92t need to be unsigned, conceptually =
it will never be less than zero.
In this case, for the compiler, setting it to usigned int or to =
socklen_t makes no difference. In practice changing it from signed to =
unsigned has no effect either as the value will not be big enough to use =
the extra bit.

It=92s all just a waste of time I guess, so as I said, I won=92t MFC the =
change.

Pedro.
=20




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?A66005FE-1A28-417A-8268-9690BC68EFD7>