Date: Thu, 24 Oct 2002 13:42:05 +1000 (EST) From: Bruce Evans <bde@zeta.org.au> To: Mark Murray <mark@grondar.za> Cc: cvs-committers@FreeBSD.org, <cvs-all@FreeBSD.org> Subject: Re: cvs commit: src/include stdlib.h src/lib/libc/gen getbsize.3 getbsize.c Message-ID: <20021024132124.O25492-100000@gamplex.bde.org> In-Reply-To: <200210231856.g9NIuIks095533@grimreaper.grondar.org>
index | next in thread | previous in thread | raw e-mail
On Wed, 23 Oct 2002, Mark Murray wrote:
> > > Make the first argument of getbsize a size_t* instead of an int*, as this is what the quantity actually is. Fix an easy const while I'm here.
> >
> > This breaks binary compatibility on 64-bit machines.
>
> So we perhaps need to bump ${MAJ}?
Of course not. We need to back out this change.
Another reason to back it out is that it is just wrong. The header length
is not a size but a field width that needs to be passed to printf via %*.
Field widths have type int. Bogus conversions are needed to convert it
back to the correct type. E.g., in the collaterally damaged df.c:
% Index: df.c
% ===================================================================
% RCS file: /home/ncvs/src/bin/df/df.c,v
% retrieving revision 1.43
% retrieving revision 1.44
% diff -u -2 -r1.43 -r1.44
% --- df.c 26 Aug 2002 04:56:23 -0000 1.43
% +++ df.c 23 Oct 2002 22:09:05 -0000 1.44
% @@ -382,5 +382,6 @@
% {
% static long blocksize;
% - static int headerlen, timesthrough;
% + static int timesthrough;
% + static size_t headerlen;
Convert to a wrong type.
% static const char *header;
% long used, availblks, inodes;
% @@ -393,5 +394,5 @@
% } else {
% header = getbsize(&headerlen, &blocksize);
% - mwp->total = imax(mwp->total, headerlen);
% + mwp->total = imax(mwp->total, (int)headerlen);
Explicitly cast the wrong type back to int. If we didn't cast it
explicitly then imax()'s protootype would convert it. imax() returns
the correct type (int) and mwp->total has the correct type, so there
are no further problems. We use mwp->total for %*.
The conversion that inspire this breakage is also sort of backwards.
From getbsize.c:
% (void)snprintf(header, sizeof(header), "%ld%s-blocks", n, form);
% *headerlenp = strlen(header);
% *blocksizep = blocksize;
Here snprintf() returns the correct length or an error, but we ignore
it and recover the length using strlen(). strlen() returns a size_t, so
lint may warn of possible truncation or sign mismatch errors for the
assignment to *headerlen which had type int.
> Consumers of this interface == { df, du, ls, pkg_install, stat, pstat }
>
> Of the N (<12) calls to the function, 6 of them (one of 2 in df, stat, 3
> in pstat) actually use the returned value. Easy fixes (warnings only).
>
> I don't believe this is a crisis. Make world has fixed worse problems.
There may be many more in ports and third party software.
Bruce
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe cvs-all" in the body of the message
home |
help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20021024132124.O25492-100000>
