summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWentao Guan <guanwentao@uniontech.com>2026-04-13 12:54:59 +0300
committerCatalin Marinas <catalin.marinas@arm.com>2026-04-27 14:16:26 +0300
commit4023b7424ecd5d38cc75b650d6c1bf630ef8cb40 (patch)
tree68cc31f47f7f02b37337869301664561b2c9251f
parent254f49634ee16a731174d2ae34bc50bd5f45e731 (diff)
downloadlinux-4023b7424ecd5d38cc75b650d6c1bf630ef8cb40.tar.xz
arm64/scs: Fix potential sign extension issue of advance_loc4
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>
-rw-r--r--arch/arm64/kernel/pi/patch-scs.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/arch/arm64/kernel/pi/patch-scs.c b/arch/arm64/kernel/pi/patch-scs.c
index dac568e4a54f..3944ad899021 100644
--- a/arch/arm64/kernel/pi/patch-scs.c
+++ b/arch/arm64/kernel/pi/patch-scs.c
@@ -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: