Message ID | 20250409171526.862481-2-samuel.holland@sifive.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | [v2,1/3] riscv: module: Fix out-of-bounds relocation access | expand |
Context | Check | Description |
---|---|---|
bjorn/pre-ci_am | success | Success |
bjorn/build-rv32-defconfig | success | build-rv32-defconfig |
bjorn/build-rv64-clang-allmodconfig | success | build-rv64-clang-allmodconfig |
bjorn/build-rv64-gcc-allmodconfig | success | build-rv64-gcc-allmodconfig |
bjorn/build-rv64-nommu-k210-defconfig | success | build-rv64-nommu-k210-defconfig |
bjorn/build-rv64-nommu-k210-virt | success | build-rv64-nommu-k210-virt |
bjorn/checkpatch | success | checkpatch |
bjorn/dtb-warn-rv64 | success | dtb-warn-rv64 |
bjorn/header-inline | success | header-inline |
bjorn/kdoc | success | kdoc |
bjorn/module-param | success | module-param |
bjorn/verify-fixes | success | verify-fixes |
bjorn/verify-signedoff | success | verify-signedoff |
On Wed, Apr 09, 2025 at 10:14:50AM -0700, Samuel Holland wrote: > apply_r_riscv_plt32_rela() may need to emit a PLT entry for the > referenced symbol, so there must be space allocated in the PLT. > > Fixes: 8fd6c5142395 ("riscv: Add remaining module relocations") > Signed-off-by: Samuel Holland <samuel.holland@sifive.com> > --- > > Changes in v2: > - New patch for v2 > > arch/riscv/kernel/module-sections.c | 13 +++++++------ > 1 file changed, 7 insertions(+), 6 deletions(-) > > diff --git a/arch/riscv/kernel/module-sections.c b/arch/riscv/kernel/module-sections.c > index e264e59e596e..91d0b355ceef 100644 > --- a/arch/riscv/kernel/module-sections.c > +++ b/arch/riscv/kernel/module-sections.c > @@ -73,16 +73,17 @@ static bool duplicate_rela(const Elf_Rela *rela, int idx) > static void count_max_entries(Elf_Rela *relas, int num, > unsigned int *plts, unsigned int *gots) > { > - unsigned int type, i; > - > - for (i = 0; i < num; i++) { > - type = ELF_RISCV_R_TYPE(relas[i].r_info); > - if (type == R_RISCV_CALL_PLT) { > + for (int i = 0; i < num; i++) { > + switch (ELF_R_TYPE(relas[i].r_info)) { I see ELF_R_TYPE() is equivalent to ELF_RISCV_R_TYPE(). So OK. > + case R_RISCV_CALL_PLT: > + case R_RISCV_PLT32: > if (!duplicate_rela(relas, i)) > (*plts)++; > - } else if (type == R_RISCV_GOT_HI20) { > + break; > + case R_RISCV_GOT_HI20: > if (!duplicate_rela(relas, i)) > (*gots)++; > + break; > } > } > } > -- > 2.47.0 > Reviewed-by: Andrew Jones <ajones@ventanamicro.com> Thanks, drew
diff --git a/arch/riscv/kernel/module-sections.c b/arch/riscv/kernel/module-sections.c index e264e59e596e..91d0b355ceef 100644 --- a/arch/riscv/kernel/module-sections.c +++ b/arch/riscv/kernel/module-sections.c @@ -73,16 +73,17 @@ static bool duplicate_rela(const Elf_Rela *rela, int idx) static void count_max_entries(Elf_Rela *relas, int num, unsigned int *plts, unsigned int *gots) { - unsigned int type, i; - - for (i = 0; i < num; i++) { - type = ELF_RISCV_R_TYPE(relas[i].r_info); - if (type == R_RISCV_CALL_PLT) { + for (int i = 0; i < num; i++) { + switch (ELF_R_TYPE(relas[i].r_info)) { + case R_RISCV_CALL_PLT: + case R_RISCV_PLT32: if (!duplicate_rela(relas, i)) (*plts)++; - } else if (type == R_RISCV_GOT_HI20) { + break; + case R_RISCV_GOT_HI20: if (!duplicate_rela(relas, i)) (*gots)++; + break; } } }
apply_r_riscv_plt32_rela() may need to emit a PLT entry for the referenced symbol, so there must be space allocated in the PLT. Fixes: 8fd6c5142395 ("riscv: Add remaining module relocations") Signed-off-by: Samuel Holland <samuel.holland@sifive.com> --- Changes in v2: - New patch for v2 arch/riscv/kernel/module-sections.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)