From: Kuan-Wei Chiu visitorckw@gmail.com
[ Upstream commit 3d6f83df8ff2d5de84b50377e4f0d45e25311c7a ]
Shifting 1 << 31 on a 32-bit int causes signed integer overflow, which leads to undefined behavior. To prevent this, cast 1 to u32 before performing the shift, ensuring well-defined behavior.
This change explicitly avoids any potential overflow by ensuring that the shift occurs on an unsigned 32-bit integer.
Signed-off-by: Kuan-Wei Chiu visitorckw@gmail.com Acked-by: Petr Mladek pmladek@suse.com Link: https://lore.kernel.org/r/20240928113608.1438087-1-visitorckw@gmail.com Signed-off-by: Petr Mladek pmladek@suse.com Signed-off-by: Sasha Levin sashal@kernel.org (cherry picked from commit 9a6d43844de2479a3ff8d674c3e2a16172e01598) Signed-off-by: Abdelkareem Abdelsaamad kareemem@amazon.com --- kernel/printk/printk.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c index a8af93cbc293..3a7fd61c0e7b 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -420,7 +420,7 @@ static u64 clear_seq; /* record buffer */ #define LOG_ALIGN __alignof__(unsigned long) #define __LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT) -#define LOG_BUF_LEN_MAX (u32)(1 << 31) +#define LOG_BUF_LEN_MAX ((u32)1 << 31) static char __log_buf[__LOG_BUF_LEN] __aligned(LOG_ALIGN); static char *log_buf = __log_buf; static u32 log_buf_len = __LOG_BUF_LEN;
[ Sasha's backport helper bot ]
Hi,
Summary of potential issues: ❌ Build failures detected
The upstream commit SHA1 provided is correct: 3d6f83df8ff2d5de84b50377e4f0d45e25311c7a
WARNING: Author mismatch between patch and upstream commit: Backport author: Abdelkareem Abdelsaamadkareemem@amazon.com Commit author: Kuan-Wei Chiuvisitorckw@gmail.com
Status in newer kernel trees: 6.13.y | Present (different SHA1: 4a2c4e7265b8) 6.12.y | Present (different SHA1: 404e5fd918a0) 6.6.y | Present (different SHA1: 4acf6bab775d) 6.1.y | Present (different SHA1: 9a6d43844de2) 5.15.y | Present (different SHA1: 131e6c9d16e2)
Note: The patch differs from the upstream commit: --- 1: 3d6f83df8ff2d ! 1: eb76eb68e0427 printk: Fix signed integer overflow when defining LOG_BUF_LEN_MAX @@ Metadata ## Commit message ## printk: Fix signed integer overflow when defining LOG_BUF_LEN_MAX
+ [ Upstream commit 3d6f83df8ff2d5de84b50377e4f0d45e25311c7a ] + Shifting 1 << 31 on a 32-bit int causes signed integer overflow, which leads to undefined behavior. To prevent this, cast 1 to u32 before performing the shift, ensuring well-defined behavior. @@ Commit message Acked-by: Petr Mladek pmladek@suse.com Link: https://lore.kernel.org/r/20240928113608.1438087-1-visitorckw@gmail.com Signed-off-by: Petr Mladek pmladek@suse.com + Signed-off-by: Sasha Levin sashal@kernel.org + (cherry picked from commit 9a6d43844de2479a3ff8d674c3e2a16172e01598) + Signed-off-by: Abdelkareem Abdelsaamad kareemem@amazon.com
## kernel/printk/printk.c ## -@@ kernel/printk/printk.c: static struct latched_seq clear_seq = { +@@ kernel/printk/printk.c: static u64 clear_seq; /* record buffer */ #define LOG_ALIGN __alignof__(unsigned long) #define __LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT) ---
Results of testing on various branches:
| Branch | Patch Apply | Build Test | |---------------------------|-------------|------------| | stable/linux-5.10.y | Success | Success | | stable/linux-5.15.y | Failed | N/A |
Build Errors: Patch failed to apply on stable/linux-5.15.y. Reject:
diff a/kernel/printk/printk.c b/kernel/printk/printk.c (rejected hunks) @@ -420,7 +420,7 @@ static u64 clear_seq; /* record buffer */ #define LOG_ALIGN __alignof__(unsigned long) #define __LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT) -#define LOG_BUF_LEN_MAX (u32)(1 << 31) +#define LOG_BUF_LEN_MAX ((u32)1 << 31) static char __log_buf[__LOG_BUF_LEN] __aligned(LOG_ALIGN); static char *log_buf = __log_buf; static u32 log_buf_len = __LOG_BUF_LEN;
linux-stable-mirror@lists.linaro.org