From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 21191 invoked by alias); 29 Apr 2005 21:38:14 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 20554 invoked from network); 29 Apr 2005 21:37:53 -0000 Received: from unknown (HELO mx1.redhat.com) (66.187.233.31) by sourceware.org with SMTP; 29 Apr 2005 21:37:53 -0000 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.11/8.12.11) with ESMTP id j3TLbrCh011390 for ; Fri, 29 Apr 2005 17:37:53 -0400 Received: from zenia.home.redhat.com (sebastian-int.corp.redhat.com [172.16.52.221]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id j3TLbqO02899; Fri, 29 Apr 2005 17:37:52 -0400 To: gdb-patches@sources.redhat.com Subject: PATCH: allocate namecopy on heap, not stack From: Jim Blandy Date: Fri, 29 Apr 2005 21:38:00 -0000 Message-ID: User-Agent: Gnus/5.090 (Gnus v5.9.0) Emacs/21.3 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-SW-Source: 2005-04/txt/msg00434.txt.bz2 Committed as obvious. 2005-04-28 Jim Blandy * parse.c (namecopy): Change allocation conventions. (namecopy_size): New variable. (copy_name): Allocate namecopy using xrealloc, instead of assuming it has adequate space allocated to it. (parse_exp_1): Don't try to allocate space for namecopy here. Index: gdb/parse.c =================================================================== RCS file: /cvs/cvsfiles/devo/gdb/parse.c,v retrieving revision 2.105 diff -c -p -r2.105 parse.c *** gdb/parse.c 13 Apr 2004 16:38:57 -0000 2.105 --- gdb/parse.c 28 Apr 2005 23:58:49 -0000 *************** union type_stack_elt *type_stack; *** 89,97 **** int type_stack_depth, type_stack_size; char *lexptr; char *prev_lexptr; - char *namecopy; int paren_depth; int comma_terminates; static int expressiondebug = 0; --- 89,106 ---- int type_stack_depth, type_stack_size; char *lexptr; char *prev_lexptr; int paren_depth; int comma_terminates; + + /* A temporary buffer for identifiers, so we can null-terminate them. + + We allocate this with xrealloc. parse_exp_1 used to allocate with + alloca, using the size of the whole expression as a conservative + estimate of the space needed. However, macro expansion can + introduce names longer than the original expression; there's no + practical way to know beforehand how large that might be. */ + char *namecopy; + size_t namecopy_size; static int expressiondebug = 0; *************** find_template_name_end (char *p) *** 769,776 **** --- 778,793 ---- char * copy_name (struct stoken token) { + /* Make sure there's enough space for the token. */ + if (namecopy_size < token.length + 1) + { + namecopy_size = token.length + 1; + namecopy = xrealloc (namecopy, token.length + 1); + } + memcpy (namecopy, token.ptr, token.length); namecopy[token.length] = 0; + return namecopy; } *************** parse_exp_1 (char **stringptr, struct bl *** 1045,1051 **** else expression_context_block = get_selected_block (&expression_context_pc); - namecopy = (char *) alloca (strlen (lexptr) + 1); expout_size = 10; expout_ptr = 0; expout = (struct expression *) --- 1062,1067 ----