From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 16569 invoked by alias); 25 Sep 2012 15:38:17 -0000 Received: (qmail 16506 invoked by uid 22791); 25 Sep 2012 15:38:16 -0000 X-SWARE-Spam-Status: No, hits=-7.3 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,RCVD_IN_DNSWL_HI,RCVD_IN_HOSTKARMA_W,RP_MATCHES_RCVD,SPF_HELO_PASS,TW_CP X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 25 Sep 2012 15:38:03 +0000 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8PFc2Ri031002 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 25 Sep 2012 11:38:02 -0400 Received: from spoyarek (spoyarek.pnq.redhat.com [10.65.192.188]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8PFc0Pa032042 for ; Tue, 25 Sep 2012 11:38:01 -0400 Date: Tue, 25 Sep 2012 15:38:00 -0000 From: Siddhesh Poyarekar To: gdb-patches@sourceware.org Subject: [PATCH] alpha: Use ssize_t to allocate space on stack Message-ID: <20120925210720.5c909379@spoyarek> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="MP_/WsrP0tduHdv5oopEGakJOgd" Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2012-09/txt/msg00554.txt.bz2 --MP_/WsrP0tduHdv5oopEGakJOgd Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Content-Disposition: inline Content-length: 818 Hi, This is again an independent portion of the bitpos patch[1]. The variables used to set up the stack are currently int, which may not be sufficient for larger types. This patch expands the variable sizes to ssize_t. The patch also adds an additional validation to check for underflow in the value of the stack pointer after pushing the arguments. I don't have any means to run any tests, so I have only done a compile test for this by configuring with --enable-targets=all. Does this look safe for commit? Regards, Siddhesh [1] http://sourceware.org/ml/gdb-patches/2012-08/msg00144.html gdb/ChangeLog: * alpha-tdep.c (alpha_push_dummy_call): Expand ACCUMULATE_SIZE, REQUIRED_ARG_REGS, OFFSET, LEN, TLEN to ssize_t. Check for underflow in SP. (struct alpha_arg): Expand members LEN, OFFSET to ssize_t. --MP_/WsrP0tduHdv5oopEGakJOgd Content-Type: text/x-patch Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename=alpha-ssizet.patch Content-length: 2113 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; --MP_/WsrP0tduHdv5oopEGakJOgd--