]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - opcodes/dis-buf.c
gdb: Fix failure in gdb.base/complex-parts.exp for x86-32
[thirdparty/binutils-gdb.git] / opcodes / dis-buf.c
index 7e3fd63a88a13e7247c3fd7d60f9d608840ff56a..bbf2185b6a96e533d7c6b8543ba597085ca030f8 100644 (file)
@@ -1,6 +1,5 @@
 /* Disassemble from a buffer, for GNU.
-   Copyright 1993, 1994, 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2005,
-   2007, 2009  Free Software Foundation, Inc.
+   Copyright (C) 1993-2019 Free Software Foundation, Inc.
 
    This file is part of the GNU opcodes library.
 
@@ -33,12 +32,15 @@ buffer_read_memory (bfd_vma memaddr,
                    struct disassemble_info *info)
 {
   unsigned int opb = info->octets_per_byte;
-  unsigned int end_addr_offset = length / opb;
-  unsigned int max_addr_offset = info->buffer_length / opb; 
-  unsigned int octets = (memaddr - info->buffer_vma) * opb;
+  size_t end_addr_offset = length / opb;
+  size_t max_addr_offset = info->buffer_length / opb;
+  size_t octets = (memaddr - info->buffer_vma) * opb;
 
   if (memaddr < info->buffer_vma
-      || memaddr - info->buffer_vma + end_addr_offset > max_addr_offset)
+      || memaddr - info->buffer_vma > max_addr_offset
+      || memaddr - info->buffer_vma + end_addr_offset > max_addr_offset
+      || (info->stop_vma && (memaddr >= info->stop_vma
+                            || memaddr + end_addr_offset > info->stop_vma)))
     /* Out of bounds.  Use EIO because GDB uses it.  */
     return EIO;
   memcpy (myaddr, info->buffer + octets, length);