From: Sebastien GODARD Date: Sun, 6 Nov 2022 14:48:16 +0000 (+0100) Subject: Make sure values to be compared are unsigned integers X-Git-Tag: v12.7.1~2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=44f1dc159242c1e434a3b836cda49f084c5a96cc;p=sysstat Make sure values to be compared are unsigned integers It seems safer to make sure that input values are unsigned int before casting them to unsigned long long and making the comparison. Signed-off-by: Sebastien GODARD --- diff --git a/common.c b/common.c index 2724977..3b7fdcd 100644 --- a/common.c +++ b/common.c @@ -425,13 +425,15 @@ int check_dir(char *dirname) * @val3 Third value. *************************************************************************** */ -void check_overflow(unsigned long long val1, unsigned long long val2, - unsigned long long val3) +void check_overflow(unsigned int val1, unsigned int val2, + unsigned int val3) { - if (val1 * val2 * val3 > UINT_MAX) { + if ((unsigned long long) val1 * (unsigned long long) val2 * + (unsigned long long) val3 > UINT_MAX) { #ifdef DEBUG fprintf(stderr, "%s: Overflow detected (%llu). Aborting...\n", - __FUNCTION__, val1 * val2 * val3); + __FUNCTION__, (unsigned long long) val1 * (unsigned long long) val2 * + (unsigned long long) val3); #endif exit(4); } diff --git a/common.h b/common.h index 715b2da..fc8a1a0 100644 --- a/common.h +++ b/common.h @@ -259,7 +259,7 @@ int get_wwnid_from_pretty int check_dir (char *); void check_overflow - (unsigned long long, unsigned long long, unsigned long long); + (unsigned int, unsigned int, unsigned int); #ifndef SOURCE_SADC int count_bits diff --git a/sa_common.c b/sa_common.c index 3460257..0ca8b03 100644 --- a/sa_common.c +++ b/sa_common.c @@ -463,9 +463,9 @@ void allocate_structures(struct activity *act[]) if (act[i]->nr_ini > 0) { /* Look for a possible overflow */ - check_overflow((unsigned long long) act[i]->msize, - (unsigned long long) act[i]->nr_ini, - (unsigned long long) act[i]->nr2); + check_overflow((unsigned int) act[i]->msize, + (unsigned int) act[i]->nr_ini, + (unsigned int) act[i]->nr2); for (j = 0; j < 3; j++) { SREALLOC(act[i]->buf[j], void, @@ -531,8 +531,8 @@ void reallocate_all_buffers(struct activity *a, __nr_t nr_min) } /* Look for a possible overflow */ - check_overflow((unsigned long long) a->msize, nr_realloc, - (unsigned long long) a->nr2); + check_overflow((unsigned int) a->msize, (unsigned int) nr_realloc, + (unsigned int) a->nr2); for (j = 0; j < 3; j++) { SREALLOC(a->buf[j], void, diff --git a/sadc.c b/sadc.c index 123bf8e..40a1e15 100644 --- a/sadc.c +++ b/sadc.c @@ -362,9 +362,9 @@ void sa_sys_init(void) if (IS_COLLECTED(act[i]->options) && (act[i]->nr_ini > 0)) { /* Look for a possible overflow */ - check_overflow((unsigned long long) act[i]->msize, - (unsigned long long) act[i]->nr_ini, - (unsigned long long) act[i]->nr2); + check_overflow((unsigned int) act[i]->msize, + (unsigned int) act[i]->nr_ini, + (unsigned int) act[i]->nr2); /* Allocate structures for current activity (using nr_ini and nr2 results) */ SREALLOC(act[i]->_buf0, void,