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>
