From 2e63fd91b8a8facdb3eb8f3a21533bb9db93fa47 Mon Sep 17 00:00:00 2001 From: Doug MacEachern Date: Fri, 1 Feb 2008 05:06:27 +0000 Subject: [PATCH] [SIGAR-85] Fix possible integer overflow in sigar_file_system_usage --- src/os/hpux/hpux_sigar.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/os/hpux/hpux_sigar.c b/src/os/hpux/hpux_sigar.c index f33e300e..e6cd308c 100644 --- a/src/os/hpux/hpux_sigar.c +++ b/src/os/hpux/hpux_sigar.c @@ -549,12 +549,6 @@ int sigar_file_system_list_get(sigar_t *sigar, return SIGAR_OK; } -/* XXX this is exactly the same as linux and solaris is darn close */ -#include - -#define SIGAR_FS_BLOCKS_TO_BYTES(buf, f) \ - (((sigar_uint64_t)buf.f * (buf.f_bsize / 512)) >> 1) - static int create_fsdev_cache(sigar_t *sigar) { sigar_file_system_list_t fslist; @@ -593,20 +587,30 @@ int sigar_disk_usage_get(sigar_t *sigar, const char *name, return SIGAR_ENOTIMPL; } +/* XXX this is exactly the same as linux and solaris is darn close */ +#include + +#define SIGAR_FS_BLOCKS_TO_BYTES(val, bsize) ((val * bsize) >> 1) + int sigar_file_system_usage_get(sigar_t *sigar, const char *dirname, sigar_file_system_usage_t *fsusage) { struct statfs buf; struct stat sb; - + sigar_uint64_t val, bsize; + if (statfs(dirname, &buf) != 0) { return errno; } - fsusage->total = SIGAR_FS_BLOCKS_TO_BYTES(buf, f_blocks); - fsusage->free = SIGAR_FS_BLOCKS_TO_BYTES(buf, f_bfree); - fsusage->avail = SIGAR_FS_BLOCKS_TO_BYTES(buf, f_bavail); + bsize = buf.f_bsize / 512; + val = buf.f_blocks; + fsusage->total = SIGAR_FS_BLOCKS_TO_BYTES(val, bsize); + val = buf.f_bfree; + fsusage->free = SIGAR_FS_BLOCKS_TO_BYTES(val, bsize); + val = buf.f_bavail; + fsusage->avail = SIGAR_FS_BLOCKS_TO_BYTES(val, bsize); fsusage->used = fsusage->total - fsusage->free; fsusage->files = buf.f_files; fsusage->free_files = buf.f_ffree;