From a04da01160f12c0d679605c5a171993721a70584 Mon Sep 17 00:00:00 2001 From: Dionysis Grigoropoulos Date: Tue, 28 Apr 2015 12:25:13 +0300 Subject: [PATCH] du: Use uintmax_t instead of size_t Fixes wraparound for files greater than 4G on 32-bit systems. --- du.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/du.c b/du.c index 61e9d02..cce2aae 100644 --- a/du.c +++ b/du.c @@ -19,15 +19,15 @@ static int sflag = 0; static int hflag = 0; static void -printpath(size_t n, const char *path) +printpath(uintmax_t n, const char *path) { if (hflag) printf("%s\t%s\n", humansize(n * blksize), path); else - printf("%zu\t%s\n", n, path); + printf("%ju\t%s\n", n, path); } -static size_t +static uintmax_t nblks(blkcnt_t blocks) { return (512 * blocks + blksize - 1) / blksize; @@ -36,11 +36,11 @@ nblks(blkcnt_t blocks) static void du(const char *path, struct stat *st, void *total, struct recursor *r) { - size_t subtotal = 0; + uintmax_t subtotal = 0; if (st && S_ISDIR(st->st_mode)) recurse(path, &subtotal, r); - *((size_t *)total) += subtotal + nblks(st ? st->st_blocks : 0); + *((uintmax_t *)total) += subtotal + nblks(st ? st->st_blocks : 0); if (!sflag && r->depth <= maxdepth && r->depth && st && (S_ISDIR(st->st_mode) || aflag)) printpath(subtotal + nblks(st->st_blocks), path); @@ -57,7 +57,7 @@ main(int argc, char *argv[]) { struct recursor r = { .fn = du, .hist = NULL, .depth = 0, .maxdepth = 0, .follow = 'P', .flags = 0 }; - size_t n = 0; + uintmax_t n = 0; int kflag = 0, dflag = 0; char *bsize;