X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=opcodes%2Fdis-buf.c;h=46ac2f7724ba2d47228628e6e53a45b89b1d4d64;hb=3ffd33cf59cb308d57b1778cd6ec8ed27cdf2f51;hp=523fe72789dbcfd939cd1cd13ed72e4562150d76;hpb=ed288bb597072176e84fc8279707a3f2f475779b;p=deliverable%2Fbinutils-gdb.git diff --git a/opcodes/dis-buf.c b/opcodes/dis-buf.c index 523fe72789..46ac2f7724 100644 --- a/opcodes/dis-buf.c +++ b/opcodes/dis-buf.c @@ -1,5 +1,6 @@ /* Disassemble from a buffer, for GNU. - Copyright (C) 1993, 1994, 1998, 1999 Free Software Foundation, Inc. + Copyright 1993, 1994, 1996, 1997, 1998, 1999, 2000 + Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,14 +27,20 @@ int buffer_read_memory (memaddr, myaddr, length, info) bfd_vma memaddr; bfd_byte *myaddr; - int length; + unsigned int length; 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; + if (memaddr < info->buffer_vma - || memaddr - info->buffer_vma + length > info->buffer_length) + || memaddr - info->buffer_vma + end_addr_offset > max_addr_offset) /* Out of bounds. Use EIO because GDB uses it. */ return EIO; - memcpy (myaddr, info->buffer + (memaddr - info->buffer_vma), length); + memcpy (myaddr, info->buffer + octets, length); + return 0; }