[Toybox] I aten't dead.

Rich Felker dalias at libc.org
Tue Feb 24 13:48:21 PST 2015


On Tue, Feb 24, 2015 at 01:30:20PM -0800, enh wrote:
> On Tue, Feb 24, 2015 at 11:46 AM, Rob Landley <rob at landley.net> wrote:
> > Sorry for the radio silence, $DAYJOB's been eating the majority of my
> > programming time and what's left has gone to Aboriginal Linux recently,
> > because I made a largeish design change over there (putting the base
> > root filesystem in initmpfs and merging the native-compiler at runtime
> > instead of compile time), and the aboriginal linux release soft-blocks
> > the toybox release because I use "built aboriginal and then built linux
> > from scratch under it" as my main toybox regression-smoketest.
> >
> > Last night's I hit a fun bug in toybox "stat" where it doesn't remotely
> > work on arm. (Works fine on x86 host, but 3.18 kernel built against
> > uClibc on armv5l: the -f numbers are way off, it thinks the blocksize of
> > ext2fs is 32 bytes.)
> 
> seems fine on armv7 3.10 with bionic. oh, specifically the -f output.
> yeah, that looks wrong :-)
> 
> a lot of those fields are actually 64-bit, so you need an extra 'l' on LP32:
> 
> diff --git a/toys/other/stat.c b/toys/other/stat.c
> index d603316..a96c1de 100644
> --- a/toys/other/stat.c
> +++ b/toys/other/stat.c
> @@ -106,11 +106,11 @@ static void print_stat(char type)
>  static void print_statfs(char type) {
>    struct statfs *statfs = (struct statfs *)&TT.stat;
> 
> -  if (type == 'a') xprintf("%lu", statfs->f_bavail);
> -  else if (type == 'b') xprintf("%lu", statfs->f_blocks);
> -  else if (type == 'c') xprintf("%lu", statfs->f_files);
> -  else if (type == 'd') xprintf("%lu", statfs->f_ffree);
> -  else if (type == 'f') xprintf("%lu", statfs->f_bfree);
> +  if (type == 'a') xprintf("%llu", statfs->f_bavail);
> +  else if (type == 'b') xprintf("%llu", statfs->f_blocks);
> +  else if (type == 'c') xprintf("%llu", statfs->f_files);
> +  else if (type == 'd') xprintf("%llu", statfs->f_ffree);
> +  else if (type == 'f') xprintf("%llu", statfs->f_bfree);
>    else if (type == 'l') xprintf("%ld", statfs->f_namelen);
>    else if (type == 't') xprintf("%lx", statfs->f_type);
>    else if (type == 'i')

Rather than hard-coding an assumption that these have type unsigned
long long, the code should be casting them to unsigned long long or
uintmax_t and using an appropriate format specifier. I prefer
uintmax_t since it's idiomatic and can be used for formatting any
unsigned type, but I know Rob can be allergic to these nice semantic
types... :-)

Rich

 1424814501.0


More information about the Toybox mailing list