/* Pedantic checking of ELF files compliance with gABI/psABI spec.
- Copyright (C) 2001-2015 Red Hat, Inc.
+ Copyright (C) 2001-2015, 2017 Red Hat, Inc.
This file is part of elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2001.
Elf32_Word nbucket = ((Elf32_Word *) data->d_buf)[0];
Elf32_Word nchain = ((Elf32_Word *) data->d_buf)[1];
- if (shdr->sh_size < (2 + nbucket + nchain) * shdr->sh_entsize)
- ERROR (gettext ("\
+ if (shdr->sh_size < (2 + nbucket + nchain) * sizeof (Elf32_Word))
+ {
+ ERROR (gettext ("\
section [%2d] '%s': hash table section is too small (is %ld, expected %ld)\n"),
- idx, section_name (ebl, idx), (long int) shdr->sh_size,
- (long int) ((2 + nbucket + nchain) * shdr->sh_entsize));
+ idx, section_name (ebl, idx), (long int) shdr->sh_size,
+ (long int) ((2 + nbucket + nchain) * sizeof (Elf32_Word)));
+ return;
+ }
size_t maxidx = nchain;
Elf64_Xword nbucket = ((Elf64_Xword *) data->d_buf)[0];
Elf64_Xword nchain = ((Elf64_Xword *) data->d_buf)[1];
- if (shdr->sh_size < (2 + nbucket + nchain) * shdr->sh_entsize)
- ERROR (gettext ("\
+ if (shdr->sh_size < (2 + nbucket + nchain) * sizeof (Elf64_Xword))
+ {
+ ERROR (gettext ("\
section [%2d] '%s': hash table section is too small (is %ld, expected %ld)\n"),
- idx, section_name (ebl, idx), (long int) shdr->sh_size,
- (long int) ((2 + nbucket + nchain) * shdr->sh_entsize));
+ idx, section_name (ebl, idx), (long int) shdr->sh_size,
+ (long int) ((2 + nbucket + nchain) * sizeof (Elf64_Xword)));
+ return;
+ }
size_t maxidx = nchain;
section [%2d] '%s': invalid sh_link symbol table section index [%2d]\n"),
idx, section_name (ebl, idx), shdr->sh_link);
- if (shdr->sh_entsize != (tag == SHT_GNU_HASH
+ size_t expect_entsize = (tag == SHT_GNU_HASH
? (gelf_getclass (ebl->elf) == ELFCLASS32
? sizeof (Elf32_Word) : 0)
- : (size_t) ebl_sysvhash_entrysize (ebl)))
+ : (size_t) ebl_sysvhash_entrysize (ebl));
+
+ if (shdr->sh_entsize != expect_entsize)
ERROR (gettext ("\
section [%2d] '%s': hash table entry size incorrect\n"),
idx, section_name (ebl, idx));
ERROR (gettext ("section [%2d] '%s': not marked to be allocated\n"),
idx, section_name (ebl, idx));
- if (shdr->sh_size < (tag == SHT_GNU_HASH ? 4 : 2) * (shdr->sh_entsize ?: 4))
+ if (shdr->sh_size < (tag == SHT_GNU_HASH ? 4 : 2) * (expect_entsize ?: 4))
{
ERROR (gettext ("\
section [%2d] '%s': hash table has not even room for initial administrative entries\n"),