mirror of
git://sourceware.org/git/glibc.git
synced 2024-11-27 03:41:23 +08:00
parent
ab8b49432b
commit
ea00a80db7
@ -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>
|
||||
|
||||
* include/libc-pointer-arith.h: New file.
|
||||
|
@ -81,5 +81,24 @@ void __malloc_fork_unlock_parent (void) internal_function attribute_hidden;
|
||||
/* Called in the child process after a fork. */
|
||||
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 */
|
||||
|
Loading…
Reference in New Issue
Block a user