Skip to content

Commit

Permalink
Fix size_t overflow in sa_common.c (GHSL-2022-074)
Browse files Browse the repository at this point in the history
allocate_structures function located in sa_common.c insufficiently
checks bounds before arithmetic multiplication allowing for an
overflow in the size allocated for the buffer representing system
activities.

This patch checks that the post-multiplied value is not greater than
UINT_MAX.

Signed-off-by: Sebastien <seb@fedora-2.home>
  • Loading branch information
Sebastien committed Oct 15, 2022
1 parent f8788f0 commit 9c4eaf1
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 0 deletions.
25 changes: 25 additions & 0 deletions common.c
Expand Up @@ -1655,4 +1655,29 @@ int parse_values(char *strargv, unsigned char bitmap[], int max_val, const char

return 0;
}

/*
***************************************************************************
* Check if the multiplication of the 3 values may be greater than UINT_MAX.
*
* IN:
* @val1 First value.
* @val2 Second value.
* @val3 Third value.
***************************************************************************
*/
void check_overflow(size_t val1, size_t val2, size_t val3)
{
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__,
(unsigned long long) val1 * (unsigned long long) val2 * (unsigned long long) val3);
#endif
exit(4);
}
}

#endif /* SOURCE_SADC undefined */
2 changes: 2 additions & 0 deletions common.h
Expand Up @@ -260,6 +260,8 @@ int check_dir
(char *);

#ifndef SOURCE_SADC
void check_overflow
(size_t, size_t, size_t);
int count_bits
(void *, int);
int count_csvalues
Expand Down
6 changes: 6 additions & 0 deletions sa_common.c
Expand Up @@ -459,7 +459,13 @@ void allocate_structures(struct activity *act[])
int i, j;

for (i = 0; i < NR_ACT; i++) {

if (act[i]->nr_ini > 0) {

/* Look for a possible overflow */
check_overflow((size_t) act[i]->msize, (size_t) act[i]->nr_ini,
(size_t) act[i]->nr2);

for (j = 0; j < 3; j++) {
SREALLOC(act[i]->buf[j], void,
(size_t) act[i]->msize * (size_t) act[i]->nr_ini * (size_t) act[i]->nr2);
Expand Down

0 comments on commit 9c4eaf1

Please sign in to comment.