From: des Date: Sat, 16 Sep 2006 12:23:33 +0000 (+0000) Subject: Tweak storage file size calculations. Avoid overflow when calculating 80% X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a1e37c5e8d8497290d0721ae91878922a9d2febc;p=varnish Tweak storage file size calculations. Avoid overflow when calculating 80% of available storage on 32-bit Linux (most fields in struct statfs are long instead of int64_t as in BSD) git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@1009 d4fa192b-c00b-0410-8231-f00ffab90ce4 --- diff --git a/varnish-cache/bin/varnishd/storage_file.c b/varnish-cache/bin/varnishd/storage_file.c index bb61ba28..51756111 100644 --- a/varnish-cache/bin/varnishd/storage_file.c +++ b/varnish-cache/bin/varnishd/storage_file.c @@ -147,23 +147,26 @@ smf_calcsize(struct smf_sc *sc, const char *size, int newfile) } } + /* + * This trickery wouldn't be necessary if X/Open would + * just add OFF_MAX to ... + */ o = l; if (o != l || o < 0) { - fprintf(stderr, - "Warning: size reduced to system limit (off_t)\n"); do { l >>= 1; o = l; } while (o != l || o < 0); + fprintf(stderr, "WARNING: storage file size reduced" + " to %ju due to system limitations\n", l); } if (l < st.st_size) { AZ(ftruncate(sc->fd, l)); } else if (l - st.st_size > fsst.f_bsize * fsst.f_bavail) { - fprintf(stderr, - "Warning: size larger than filesystem free space," - " reduced to 80%% of free space.\n"); - l = (fsst.f_bsize * fsst.f_bavail * 80) / 100; + l = ((uintmax_t)fsst.f_bsize * fsst.f_bavail * 80) / 100; + fprintf(stderr, "WARNING: storage file size reduced" + " to %ju (80%% of available disk space)\n", l); } } @@ -177,13 +180,13 @@ smf_calcsize(struct smf_sc *sc, const char *size, int newfile) exit (2); } - if (expl < 3 && sizeof(void *) == 4 && l > (1ULL << 31)) { + if (expl < 3 && sizeof(void *) == 4 && l > INT32_MAX) { fprintf(stderr, "NB: Limiting size to 2GB on 32 bit architecture to" " prevent running out of\naddress space." " Specifiy explicit size to override.\n" ); - l = 1ULL << 31; + l = INT32_MAX; } printf("file %s size %ju bytes (%ju fs-blocks, %ju pages)\n",