]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
arm64/scs: Fix potential sign extension issue of advance_loc4
authorWentao Guan <guanwentao@uniontech.com>
Mon, 13 Apr 2026 09:54:59 +0000 (17:54 +0800)
committerCatalin Marinas <catalin.marinas@arm.com>
Mon, 27 Apr 2026 11:16:26 +0000 (12:16 +0100)
The expression (*opcode++ << 24) and exp * code_alignment_factor
may overflow signed int and becomes negative.

Fix this by casting each byte to u64 before shifting. Also fix
the misaligned break statement while we are here.

Example of the result can be seen here:
Link: https://godbolt.org/z/zhY8d3595
It maybe not a real problem, but could be a issue in future.

Fixes: d499e9627d70 ("arm64/scs: Fix handling of advance_loc4")
Signed-off-by: Wentao Guan <guanwentao@uniontech.com>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
arch/arm64/kernel/pi/patch-scs.c

index dac568e4a54f23ad2db7f5c78b5db1439bb795a7..3944ad899021cd37f33509e3b807013def1b8ed2 100644 (file)
@@ -196,9 +196,9 @@ static int scs_handle_fde_frame(const struct eh_frame *frame,
                        loc += *opcode++ * code_alignment_factor;
                        loc += (*opcode++ << 8) * code_alignment_factor;
                        loc += (*opcode++ << 16) * code_alignment_factor;
-                       loc += (*opcode++ << 24) * code_alignment_factor;
+                       loc += ((u64)*opcode++ << 24) * code_alignment_factor;
                        size -= 4;
-               break;
+                       break;
 
                case DW_CFA_def_cfa:
                case DW_CFA_offset_extended: