Index: gdb/alpha-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/alpha-tdep.c,v retrieving revision 1.212 diff -u -r1.212 alpha-tdep.c --- gdb/alpha-tdep.c 25 Sep 2012 12:48:52 -0000 1.212 +++ gdb/alpha-tdep.c 25 Sep 2012 15:21:46 -0000 @@ -299,18 +299,18 @@ { enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); int i; - int accumulate_size = struct_return ? 8 : 0; + ssize_t accumulate_size = struct_return ? 8 : 0; struct alpha_arg { const gdb_byte *contents; - int len; - int offset; + ssize_t len; + ssize_t offset; }; struct alpha_arg *alpha_args = (struct alpha_arg *) alloca (nargs * sizeof (struct alpha_arg)); struct alpha_arg *m_arg; gdb_byte arg_reg_buffer[ALPHA_REGISTER_SIZE * ALPHA_NUM_ARG_REGS]; - int required_arg_regs; + ssize_t required_arg_regs; CORE_ADDR func_addr = find_function_addr (function, NULL); /* The ABI places the address of the called function in T12. */ @@ -414,6 +414,13 @@ accumulate_size = 0; else accumulate_size -= sizeof(arg_reg_buffer); + + /* Check for underflow. */ + if (sp - accumulate_size > sp) + error (_("Insufficient memory in GDB host for arguments, " + "need %s bytes, but less than %s bytes available."), + plongest (accumulate_size), plongest (CORE_ADDR_MAX - sp)); + sp -= accumulate_size; /* Keep sp aligned to a multiple of 16 as the ABI requires. */ @@ -423,8 +430,8 @@ for (i = nargs; m_arg--, --i >= 0;) { const gdb_byte *contents = m_arg->contents; - int offset = m_arg->offset; - int len = m_arg->len; + ssize_t offset = m_arg->offset; + ssize_t len = m_arg->len; /* Copy the bytes destined for registers into arg_reg_buffer. */ if (offset < sizeof(arg_reg_buffer)) @@ -436,7 +443,7 @@ } else { - int tlen = sizeof(arg_reg_buffer) - offset; + ssize_t tlen = sizeof(arg_reg_buffer) - offset; memcpy (arg_reg_buffer + offset, contents, tlen); offset += tlen; contents += tlen;