Paul Townsend <[EMAIL PROTECTED]> wrote: > When the `du' included with coreutils-5.92 is compiled on an AIX 5.1 box > that has a 32 bit kernel and is compiled with large file support, it > incorrectly computes the size of a file that exceeds 2**31-1 bytes. If > I've interpretted the code correctly, it's because the stat->st_blocks > entry is a signed int that's multiplied by 512 before being promoted to > an unsigned long long (uintmax_t). The patch below forces the promotion > before the multiplication. > > -- Paul Townsend (alpha a beta present at purdue dot edu) > > diff -u coreutils-5.92/src/du.c.orig coreutils-5.92/src/du.c > --- coreutils-5.92/src/du.c.orig 2005-10-15 04:13:21.000000000 -0500 > +++ coreutils-5.92/src/du.c 2005-11-02 02:44:21.767391000 -0500 > @@ -537,7 +537,7 @@ > duinfo_set (&dui, > (apparent_size > ? sb->st_size > - : ST_NBLOCKS (*sb) * ST_NBLOCKSIZE), > + : (uintmax_t) ST_NBLOCKS (*sb) * ST_NBLOCKSIZE), > (time_type == time_mtime ? get_stat_mtime (sb) > : time_type == time_atime ? get_stat_atime (sb) > : get_stat_ctime (sb)));
Thanks for the report and patch. That looks right to me, too. Would you please test it with something like this: printf %$(echo '2^31-1'|bc)s x > k du -s k printf x >> k du -s k printf x >> k du -s k I get this output: 2097152 k 2097152 k 2097156 k Of course, your numbers may vary a little. The important thing is that there be no errors. _______________________________________________ Bug-coreutils mailing list Bug-coreutils@gnu.org http://lists.gnu.org/mailman/listinfo/bug-coreutils