is_target_special_symbol fixes for commit 68bbe1183379 * elf.c (_bfd_elf_is_local_label_name): Don't segv on NULL name. * elf32-v850.c (v850_elf_is_local_label_name): Likewise. * elfnn-riscv.c (riscv_elf_is_target_special_symbol): Likewise.
diff --git a/bfd/elf.c b/bfd/elf.c index 39ee641..4012d99 100644 --- a/bfd/elf.c +++ b/bfd/elf.c
@@ -9725,6 +9725,9 @@ _bfd_elf_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED, const char *name) { + if (!name) + return false; + /* Normal local symbols start with ``.L''. */ if (name[0] == '.' && name[1] == 'L') return true;
diff --git a/bfd/elf32-v850.c b/bfd/elf32-v850.c index 85cbcbc..8d61ebb6 100644 --- a/bfd/elf32-v850.c +++ b/bfd/elf32-v850.c
@@ -1933,8 +1933,13 @@ static bool v850_elf_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED, const char *name) { - return ( (name[0] == '.' && (name[1] == 'L' || name[1] == '.')) - || (name[0] == '_' && name[1] == '.' && name[2] == 'L' && name[3] == '_')); + if (!name) + return false; + if (name[0] == '.' && (name[1] == 'L' || name[1] == '.')) + return true; + if (name[0] == '_' && name[1] == '.' && name[2] == 'L' && name[3] == '_') + return true; + return false; } static bool
diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c index 90ecc27..4844412 100644 --- a/bfd/elfnn-riscv.c +++ b/bfd/elfnn-riscv.c
@@ -5610,9 +5610,11 @@ static bool riscv_elf_is_target_special_symbol (bfd *abfd, asymbol *sym) { + if (!sym->name) + return false; /* PR27584, local and empty symbols. Since they are usually generated for pcrel relocations. */ - return (!strcmp (sym->name, "") + return (!sym->name[0] || _bfd_elf_is_local_label_name (abfd, sym->name) /* PR27916, mapping symbols. */ || riscv_elf_is_mapping_symbols (sym->name));