[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] libelf: Fix div0 issues in elf_{shdr, phdr}_count()
elf_uval() can return zero either because the field itself is zero, or because the access is out of bounds. c/s a01b6d4 "libelf: treat phdr and shdr similarly" introduced two div0 issues as e_{ph,sh}entsize are not checked for sanity before being used to divide elf->size. Spotted by Coverity. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- CC: George Dunlap <George.Dunlap@xxxxxxxxxxxxx> CC: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> CC: Jan Beulich <JBeulich@xxxxxxxx> CC: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> CC: Stefano Stabellini <sstabellini@xxxxxxxxxx> CC: Tim Deegan <tim@xxxxxxx> CC: Wei Liu <wei.liu2@xxxxxxxxxx> I experimented with making elf_access_unsigned() __must_check, but this didn't cause a compiler error. I am not quite sure why. --- xen/common/libelf/libelf-tools.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/xen/common/libelf/libelf-tools.c b/xen/common/libelf/libelf-tools.c index bf661e7..f62d9c3 100644 --- a/xen/common/libelf/libelf-tools.c +++ b/xen/common/libelf/libelf-tools.c @@ -130,11 +130,17 @@ uint64_t elf_round_up(struct elf_binary *elf, uint64_t addr) unsigned elf_shdr_count(struct elf_binary *elf) { unsigned count = elf_uval(elf, elf->ehdr, e_shnum); + unsigned entsize = elf_uval(elf, elf->ehdr, e_shentsize); uint64_t max; if ( !count ) return 0; - max = elf->size / elf_uval(elf, elf->ehdr, e_shentsize); + if ( !entsize ) + { + elf_mark_broken(elf, "e_shentsize is zero"); + return 0; + } + max = elf->size / entsize; if ( max > UINT_MAX ) max = UINT_MAX; if ( count > max ) @@ -148,11 +154,17 @@ unsigned elf_shdr_count(struct elf_binary *elf) unsigned elf_phdr_count(struct elf_binary *elf) { unsigned count = elf_uval(elf, elf->ehdr, e_phnum); + unsigned entsize = elf_uval(elf, elf->ehdr, e_phentsize); uint64_t max; if ( !count ) return 0; - max = elf->size / elf_uval(elf, elf->ehdr, e_phentsize); + if ( !entsize ) + { + elf_mark_broken(elf, "e_phentsize is zero"); + return 0; + } + max = elf->size / entsize; if ( max > UINT_MAX ) max = UINT_MAX; if ( count > max ) -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |