diff options
author | Alan Modra <amodra@gmail.com> | 2018-10-23 19:02:06 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2018-10-23 21:09:09 +1030 |
commit | 45a0eaf77022963d639d6d19871dbab7b79703fc (patch) | |
tree | 385ec037e9723968db953bcaca55dc12361ae07a /bfd/merge.c | |
parent | 102def4da826b3d9e169741421e5e67e8731909a (diff) | |
download | gdb-45a0eaf77022963d639d6d19871dbab7b79703fc.zip gdb-45a0eaf77022963d639d6d19871dbab7b79703fc.tar.gz gdb-45a0eaf77022963d639d6d19871dbab7b79703fc.tar.bz2 |
PR23806, NULL pointer dereference in merge_strings
PR 23806
* merge.c (_bfd_add_merge_section): Don't attempt to merge
sections with ridiculously large alignments.
Diffstat (limited to 'bfd/merge.c')
-rw-r--r-- | bfd/merge.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/bfd/merge.c b/bfd/merge.c index 5e3bba0..7de0c88 100644 --- a/bfd/merge.c +++ b/bfd/merge.c @@ -24,6 +24,7 @@ as used in ELF SHF_MERGE. */ #include "sysdep.h" +#include <limits.h> #include "bfd.h" #include "elf-bfd.h" #include "libbfd.h" @@ -385,12 +386,18 @@ _bfd_add_merge_section (bfd *abfd, void **psinfo, asection *sec, return TRUE; } - align = sec->alignment_power; - if ((sec->entsize < (unsigned) 1 << align +#ifndef CHAR_BIT +#define CHAR_BIT 8 +#endif + if (sec->alignment_power >= sizeof (align) * CHAR_BIT) + return TRUE; + + align = 1u << sec->alignment_power; + if ((sec->entsize < align && ((sec->entsize & (sec->entsize - 1)) || !(sec->flags & SEC_STRINGS))) - || (sec->entsize > (unsigned) 1 << align - && (sec->entsize & (((unsigned) 1 << align) - 1)))) + || (sec->entsize > align + && (sec->entsize & (align - 1)))) { /* Sanity check. If string character size is smaller than alignment, then we require character size to be a power |