[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL v2 13/14] linux-user: Use correct types in load_symbo
From: |
Laurent Vivier |
Subject: |
[Qemu-devel] [PULL v2 13/14] linux-user: Use correct types in load_symbols() |
Date: |
Thu, 16 Feb 2017 15:38:15 +0100 |
From: Peter Maydell <address@hidden>
Coverity doesn't like the code in load_symbols() which assumes
it can use 'int' for a variable that might hold an offset into
the guest ELF file, because in a 64-bit guest that could
overflow. Guest binaries with 2GB sections aren't very likely
and this isn't a security issue because we fully trust the
guest linux-user binary anyway, but we might as well use the
right types, which will placate Coverity. Use uint64_t to
hold section sizes, and bail out if the symbol table is too
large rather than just overflowing an int.
(Coverity issue CID1005776)
Signed-off-by: Peter Maydell <address@hidden>
Reviewed-by: Laurent Vivier <address@hidden>
Reviewed-by: Philippe Mathieu-Daudé <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Laurent Vivier <address@hidden>
---
linux-user/elfload.c | 22 +++++++++++++++-------
1 file changed, 15 insertions(+), 7 deletions(-)
diff --git a/linux-user/elfload.c b/linux-user/elfload.c
index 8271227..f520d77 100644
--- a/linux-user/elfload.c
+++ b/linux-user/elfload.c
@@ -2262,6 +2262,7 @@ static int symcmp(const void *s0, const void *s1)
static void load_symbols(struct elfhdr *hdr, int fd, abi_ulong load_bias)
{
int i, shnum, nsyms, sym_idx = 0, str_idx = 0;
+ uint64_t segsz;
struct elf_shdr *shdr;
char *strings = NULL;
struct syminfo *s = NULL;
@@ -2293,19 +2294,26 @@ static void load_symbols(struct elfhdr *hdr, int fd,
abi_ulong load_bias)
goto give_up;
}
- i = shdr[str_idx].sh_size;
- s->disas_strtab = strings = g_try_malloc(i);
- if (!strings || pread(fd, strings, i, shdr[str_idx].sh_offset) != i) {
+ segsz = shdr[str_idx].sh_size;
+ s->disas_strtab = strings = g_try_malloc(segsz);
+ if (!strings ||
+ pread(fd, strings, segsz, shdr[str_idx].sh_offset) != segsz) {
goto give_up;
}
- i = shdr[sym_idx].sh_size;
- syms = g_try_malloc(i);
- if (!syms || pread(fd, syms, i, shdr[sym_idx].sh_offset) != i) {
+ segsz = shdr[sym_idx].sh_size;
+ syms = g_try_malloc(segsz);
+ if (!syms || pread(fd, syms, segsz, shdr[sym_idx].sh_offset) != segsz) {
goto give_up;
}
- nsyms = i / sizeof(struct elf_sym);
+ if (segsz / sizeof(struct elf_sym) > INT_MAX) {
+ /* Implausibly large symbol table: give up rather than ploughing
+ * on with the number of symbols calculation overflowing
+ */
+ goto give_up;
+ }
+ nsyms = segsz / sizeof(struct elf_sym);
for (i = 0; i < nsyms; ) {
bswap_sym(syms + i);
/* Throw away entries which we do not need. */
--
2.9.3
- [Qemu-devel] [PULL v2 00/14] Linux user for upstream patches, Laurent Vivier, 2017/02/16
- [Qemu-devel] [PULL v2 01/14] linux-user: remove ifdef __USER_MISC, Laurent Vivier, 2017/02/16
- [Qemu-devel] [PULL v2 09/14] linux-user: Update m68k syscall definitions to match Linux 4.6, Laurent Vivier, 2017/02/16
- [Qemu-devel] [PULL v2 08/14] linux-user: Update sh4 syscall definitions to match Linux 4.8, Laurent Vivier, 2017/02/16
- [Qemu-devel] [PULL v2 12/14] linux-user: fill target sigcontext struct accordingly, Laurent Vivier, 2017/02/16
- [Qemu-devel] [PULL v2 13/14] linux-user: Use correct types in load_symbols(),
Laurent Vivier <=
- [Qemu-devel] [PULL v2 14/14] linux-user: Add FICLONE and FICLONERANGE ioctls, Laurent Vivier, 2017/02/16
- [Qemu-devel] [PULL v2 10/14] linux-user: fix settime old value location, Laurent Vivier, 2017/02/16
- [Qemu-devel] [PULL v2 07/14] linux-user: manage two new IFLA host message types, Laurent Vivier, 2017/02/16
- [Qemu-devel] [PULL v2 04/14] linux-user: Fix inotify_init1 support, Laurent Vivier, 2017/02/16
- [Qemu-devel] [PULL v2 06/14] linux-user: Fix mq_open, Laurent Vivier, 2017/02/16
- [Qemu-devel] [PULL v2 02/14] linux-user: drop __cygwin__ ifdef, Laurent Vivier, 2017/02/16
- [Qemu-devel] [PULL v2 11/14] linux-user: fix tcg/mmap test, Laurent Vivier, 2017/02/16
- [Qemu-devel] [PULL v2 03/14] linux-user: Fix s390x safe-syscall for z900, Laurent Vivier, 2017/02/16
- [Qemu-devel] [PULL v2 05/14] linux-user: Fix readahead, Laurent Vivier, 2017/02/16
- Re: [Qemu-devel] [PULL v2 00/14] Linux user for upstream patches, Peter Maydell, 2017/02/16