pstore: Support record sizes larger than kmalloc() limit
authorYuxiao Zhang <yuxiaozhang@google.com>
Tue, 27 Jun 2023 20:25:41 +0000 (13:25 -0700)
committerKees Cook <keescook@chromium.org>
Thu, 17 Aug 2023 22:18:24 +0000 (15:18 -0700)
commit104fd0b5e948157f8e8ac88a20b46ba8641d4e95
treedd88e938e7515d17ef837a470b750599818143b8
parentfe8c3623ab06603eb760444a032d426542212021
pstore: Support record sizes larger than kmalloc() limit

Currently pstore record buffers are allocated using kmalloc() which has
a maximum size based on page size. If a large "pmsg-size" module
parameter is specified, pmsg will fail to copy the contents since
memdup_user() is limited to kmalloc() allocation sizes.

Since we don't need physically contiguous memory for any of the pstore
record buffers, use kvzalloc() to avoid such limitations in the core of
pstore and in the ram backend, and explicitly read from userspace using
vmemdup_user(). This also means that any other backends that want to
(or do already) support larger record sizes will Just Work now.

Signed-off-by: Yuxiao Zhang <yuxiaozhang@google.com>
Link: https://lore.kernel.org/r/20230627202540.881909-2-yuxiaozhang@google.com
Co-developed-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Kees Cook <keescook@chromium.org>
fs/pstore/inode.c
fs/pstore/platform.c
fs/pstore/ram.c
fs/pstore/ram_core.c