Re: [PATCH v5 4/4] printk: Give error on attempt to set log buffer length to over 4G

From: Petr Mladek
Date: Mon Oct 08 2018 - 09:59:20 EST


On Sun 2018-09-30 00:45:53, zhe.he@xxxxxxxxxxxxx wrote:
> From: He Zhe <zhe.he@xxxxxxxxxxxxx>
>
> Give explicit error for users who want to use larger log buffer.
>
> Signed-off-by: He Zhe <zhe.he@xxxxxxxxxxxxx>
> Cc: pmladek@xxxxxxxx
> Cc: sergey.senozhatsky@xxxxxxxxx
> Cc: rostedt@xxxxxxxxxxx
> ---
> kernel/printk/printk.c | 11 ++++++++---
> 1 file changed, 8 insertions(+), 3 deletions(-)
>
> diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
> index b84aac0..5ccfd5d 100644
> --- a/kernel/printk/printk.c
> +++ b/kernel/printk/printk.c
> @@ -1039,18 +1039,23 @@ void log_buf_vmcoreinfo_setup(void)
> static unsigned long __initdata new_log_buf_len;
>
> /* we practice scaling the ring buffer by powers of 2 */
> -static void __init log_buf_len_update(unsigned size)
> +static void __init log_buf_len_update(u64 size)
> {
> + if (size > UINT_MAX) {
> + size = UINT_MAX;
> + pr_err("log_buf over 4G is not supported.\n");

I tried this patch with log_buf_len=5G. The kernel did not crash
but dmesg shown some mess. There are several 32-bit variables
to store the size, for example:

static u32 log_buf_len = __LOG_BUF_LEN;
u32 log_buf_len_get(void)
static u32 log_first_idx;
static u32 log_next_idx;

I guess that the code somewhere does not detect an overflows
correctly.

I am not motivated enought to add support for such huge message
buffer. Therefore I suggest to limit it to 32G for now.

This patch worked for me: