mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6.git
synced 2026-04-18 03:23:53 -04:00
overflow: Introduce wrapping_assign_add() and wrapping_assign_sub()
This allows replacements of the idioms "var += offset" and "var -= offset" with the wrapping_assign_add() and wrapping_assign_sub() helpers respectively. They will avoid wrap-around sanitizer instrumentation. Add to the selftests to validate behavior and lack of side-effects. Reviewed-by: Marco Elver <elver@google.com> Acked-by: Mark Rutland <mark.rutland@arm.com> Signed-off-by: Kees Cook <keescook@chromium.org>
This commit is contained in:
@@ -81,6 +81,22 @@ static inline bool __must_check __must_check_overflow(bool overflow)
|
||||
__val; \
|
||||
})
|
||||
|
||||
/**
|
||||
* wrapping_assign_add() - Intentionally perform a wrapping increment assignment
|
||||
* @var: variable to be incremented
|
||||
* @offset: amount to add
|
||||
*
|
||||
* Increments @var by @offset with wrap-around. Returns the resulting
|
||||
* value of @var. Will not trip any wrap-around sanitizers.
|
||||
*
|
||||
* Returns the new value of @var.
|
||||
*/
|
||||
#define wrapping_assign_add(var, offset) \
|
||||
({ \
|
||||
typeof(var) *__ptr = &(var); \
|
||||
*__ptr = wrapping_add(typeof(var), *__ptr, offset); \
|
||||
})
|
||||
|
||||
/**
|
||||
* check_sub_overflow() - Calculate subtraction with overflow checking
|
||||
* @a: minuend; value to subtract from
|
||||
@@ -111,6 +127,22 @@ static inline bool __must_check __must_check_overflow(bool overflow)
|
||||
__val; \
|
||||
})
|
||||
|
||||
/**
|
||||
* wrapping_assign_sub() - Intentionally perform a wrapping decrement assign
|
||||
* @var: variable to be decremented
|
||||
* @offset: amount to subtract
|
||||
*
|
||||
* Decrements @var by @offset with wrap-around. Returns the resulting
|
||||
* value of @var. Will not trip any wrap-around sanitizers.
|
||||
*
|
||||
* Returns the new value of @var.
|
||||
*/
|
||||
#define wrapping_assign_sub(var, offset) \
|
||||
({ \
|
||||
typeof(var) *__ptr = &(var); \
|
||||
*__ptr = wrapping_sub(typeof(var), *__ptr, offset); \
|
||||
})
|
||||
|
||||
/**
|
||||
* check_mul_overflow() - Calculate multiplication with overflow checking
|
||||
* @a: first factor
|
||||
|
||||
Reference in New Issue
Block a user