linux/Documentation/process
Kees Cook 30f20ceb87 overflow: Implement size_t saturating arithmetic helpers
[ Upstream commit e1be43d9b5 ]

In order to perform more open-coded replacements of common allocation
size arithmetic, the kernel needs saturating (SIZE_MAX) helpers for
multiplication, addition, and subtraction. For example, it is common in
allocators, especially on realloc, to add to an existing size:

    p = krealloc(map->patch,
                 sizeof(struct reg_sequence) * (map->patch_regs + num_regs),
                 GFP_KERNEL);

There is no existing saturating replacement for this calculation, and
just leaving the addition open coded inside array_size() could
potentially overflow as well. For example, an overflow in an expression
for a size_t argument might wrap to zero:

    array_size(anything, something_at_size_max + 1) == 0

Introduce size_mul(), size_add(), and size_sub() helpers that
implicitly promote arguments to size_t and saturated calculations for
use in allocations. With these helpers it is also possible to redefine
array_size(), array3_size(), flex_array_size(), and struct_size() in
terms of the new helpers.

As with the check_*_overflow() helpers, the new helpers use __must_check,
though what is really desired is a way to make sure that assignment is
only to a size_t lvalue. Without this, it's still possible to introduce
overflow/underflow via type conversion (i.e. from size_t to int).
Enforcing this will currently need to be left to static analysis or
future use of -Wconversion.

Additionally update the overflow unit tests to force runtime evaluation
for the pathological cases.

Cc: Rasmus Villemoes <linux@rasmusvillemoes.dk>
Cc: Gustavo A. R. Silva <gustavoars@kernel.org>
Cc: Nathan Chancellor <nathan@kernel.org>
Cc: Jason Gunthorpe <jgg@ziepe.ca>
Cc: Nick Desaulniers <ndesaulniers@google.com>
Cc: Leon Romanovsky <leon@kernel.org>
Cc: Keith Busch <kbusch@kernel.org>
Cc: Len Baker <len.baker@gmx.com>
Signed-off-by: Kees Cook <keescook@chromium.org>
Stable-dep-of: e001e60869 ("fs/ntfs3: Harden against integer overflows")
Signed-off-by: Sasha Levin <sashal@kernel.org>
2022-12-31 13:14:33 +01:00
..
1.Intro.rst
2.Process.rst
3.Early-stage.rst
4.Coding.rst
5.Posting.rst
6.Followthrough.rst
7.AdvancedTopics.rst
8.Conclusion.rst
adding-syscalls.rst
applying-patches.rst
botching-up-ioctls.rst
changes.rst
clang-format.rst
code-of-conduct-interpretation.rst docs: update mediator contact information in CoC doc 2022-11-26 09:24:48 +01:00
code-of-conduct.rst
coding-style.rst
deprecated.rst overflow: Implement size_t saturating arithmetic helpers 2022-12-31 13:14:33 +01:00
development-process.rst
email-clients.rst
embargoed-hardware-issues.rst
howto.rst
index.rst
kernel-docs.rst
kernel-driver-statement.rst
kernel-enforcement-statement.rst
license-rules.rst
magic-number.rst
maintainer-pgp-guide.rst
maintainers.rst
management-style.rst
programming-language.rst
stable-api-nonsense.rst
stable-kernel-rules.rst Documentation: update stable tree link 2022-04-08 14:22:51 +02:00
submit-checklist.rst
submitting-drivers.rst
submitting-patches.rst docs: submitting-patches: Fix crossref to 'The canonical patch format' 2022-06-06 08:43:41 +02:00
volatile-considered-harmful.rst