From ef70c9e7b26ec5e95b073944a9ed19d495c4fe88 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Thu, 11 Apr 2024 13:12:21 +0930 Subject: Re: Update objcopy's --section-alignment option ubsan: shift exponent 255 is too large for 64-bit type I should have known oss-fuzz wouldn't be satisfied so easily. The pef format allows quite silly section alignments in object files. * objcopy.c (setup_section): Limit shift exponent when checking vma and lma for alignment. --- binutils/objcopy.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'binutils') diff --git a/binutils/objcopy.c b/binutils/objcopy.c index d9abfdf..d91ba12 100644 --- a/binutils/objcopy.c +++ b/binutils/objcopy.c @@ -4340,7 +4340,9 @@ setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg) and the VMA was not set by the user and the section does not have relocations associated with it then warn the user. */ - if ((osection->vma & (((bfd_vma) 1 << alignment) - 1)) != 0 + if (osection->vma != 0 + && (alignment >= sizeof (bfd_vma) * CHAR_BIT + || (osection->vma & (((bfd_vma) 1 << alignment) - 1)) != 0) && alignment != bfd_section_alignment (isection) && change_section_address == 0 && ! vma_set_by_user @@ -4352,7 +4354,9 @@ setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg) /* Similar check for a non-aligned LMA. FIXME: Since this is only an LMA, maybe it does not matter if it is not aligned ? */ - if ((osection->lma & (((bfd_vma) 1 << alignment) - 1)) != 0 + if (osection->lma != 0 + && (alignment >= sizeof (bfd_vma) * CHAR_BIT + || (osection->lma & (((bfd_vma) 1 << alignment) - 1)) != 0) && alignment != bfd_section_alignment (isection) && change_section_address == 0 && ! lma_set_by_user -- cgit v1.1