Add check_mul_overflow_size_t

Backported from commit 2e0bbbfbf9.
This commit is contained in:
Florian Weimer 2018-01-04 12:51:48 +01:00
parent ab8b49432b
commit ea00a80db7
2 changed files with 23 additions and 0 deletions

View File

@ -1,3 +1,7 @@
2018-01-04 Florian Weimer <fweimer@redhat.com>
* malloc/malloc-internal.h (check_mul_overflow_size_t): New.
2018-01-04 Florian Weimer <fweimer@redhat.com> 2018-01-04 Florian Weimer <fweimer@redhat.com>
* include/libc-pointer-arith.h: New file. * include/libc-pointer-arith.h: New file.

View File

@ -81,5 +81,24 @@ void __malloc_fork_unlock_parent (void) internal_function attribute_hidden;
/* Called in the child process after a fork. */ /* Called in the child process after a fork. */
void __malloc_fork_unlock_child (void) internal_function attribute_hidden; void __malloc_fork_unlock_child (void) internal_function attribute_hidden;
/* Set *RESULT to LEFT * RIGHT. Return true if the multiplication
overflowed. */
static inline bool
check_mul_overflow_size_t (size_t left, size_t right, size_t *result)
{
#if __GNUC__ >= 5
return __builtin_mul_overflow (left, right, result);
#else
/* size_t is unsigned so the behavior on overflow is defined. */
*result = left * right;
size_t half_size_t = ((size_t) 1) << (8 * sizeof (size_t) / 2);
if (__glibc_unlikely ((left | right) >= half_size_t))
{
if (__glibc_unlikely (right != 0 && *result / right != left))
return true;
}
return false;
#endif
}
#endif /* _MALLOC_INTERNAL_H */ #endif /* _MALLOC_INTERNAL_H */