From patchwork Thu Jan 12 14:55:41 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nick Clifton X-Patchwork-Id: 91169 Delivered-To: patch@linaro.org Received: by 10.140.20.99 with SMTP id 90csp1658872qgi; Thu, 12 Jan 2017 06:56:47 -0800 (PST) X-Received: by 10.98.211.220 with SMTP id z89mr16844997pfk.3.1484233006978; Thu, 12 Jan 2017 06:56:46 -0800 (PST) Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id i5si5499426pfc.106.2017.01.12.06.56.46 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 12 Jan 2017 06:56:46 -0800 (PST) Received-SPF: pass (google.com: domain of binutils-return-95370-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org; spf=pass (google.com: domain of binutils-return-95370-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=binutils-return-95370-patch=linaro.org@sourceware.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:mime-version :content-type; q=dns; s=default; b=oOH8w2x64eQGGo3AIYyc3z7HSpAI7 6yzXpL+W4qx/T3BQFvNoztz4AerCEiEgZtyY29j9CapWXcvPILO617sA4pLHq/Ys ayNdQNJclx6z8c6YMk188frVeXslxTdkOpdhk3t1TAvgs+3X3J4kQ9RmdMNoiPGB BAOttMZdKqdGkc= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:mime-version :content-type; s=default; bh=IEcdc97QmY7NWGVnDxfzjrD9vUY=; b=pNN sZDrP9M3XsXFEOYWoxkV48KmIMT7UbFi7hIi9YMnIM8GOBL5zv14Y5lVeLm9ONZO UcNT61kAXDBxUrXKwC/0DLdH41SmYxFsckCtfRMZVlO5M/baIupXwE0pAlY2u07I wS4ZNgAqetkD3J3vAmdUV0ypdVLRuxnrad4AGqwk= Received: (qmail 96802 invoked by alias); 12 Jan 2017 14:55:48 -0000 Mailing-List: contact binutils-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: binutils-owner@sourceware.org Delivered-To: mailing list binutils@sourceware.org Received: (qmail 96715 invoked by uid 89); 12 Jan 2017 14:55:47 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-4.1 required=5.0 tests=BAYES_00, KAM_LAZY_DOMAIN_SECURITY, RP_MATCHES_RCVD, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=encounters, 64930, 649, 30, 63213 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 12 Jan 2017 14:55:45 +0000 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 4BC30C04B302 for ; Thu, 12 Jan 2017 14:55:45 +0000 (UTC) Received: from snowball.redhat.com (ovpn-116-231.ams2.redhat.com [10.36.116.231]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v0CEthl2028533 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 12 Jan 2017 09:55:44 -0500 From: Nick Clifton To: binutils@sourceware.org Subject: Commit: Add support for a temporary input line pointer in gas/read.c Date: Thu, 12 Jan 2017 14:55:41 +0000 Message-ID: <8760lk9vki.fsf@redhat.com> MIME-Version: 1.0 X-IsSubscribed: yes Hi Guys, I am checking in the attached patch to fix a internal assembler when gas is generating STABS output and it encounters a parsing error. The problem was that the stabs functions would call the parsers in gas/read.c with a temporary input line pointer, but without setting the limit for this pointer. So if a parsing error occurred, the assembler might attempt to read beyond the end of the temporary buffer which causes all kinds of problems. The patch solves the problem by adding a new function to gas/read.c to set a temporary input line pointer, and update the buffer_limit variable at the same time. In this way the functions in stabs.c can safely create and use their temporary input line buffers. There are probably other places in gas where a temporary input line pointer is used and these functions would be helpful, but I have not investigated this yet. Cheers Nick gas/ChangeLog 2017-01-12 Nick Clifton * read.c (temp_ilp): New function. Installs a temporary input line pointer. (restore_ilp): New function. Restores the original input line pointer. * read.h (temp_ilp): Prototype. (restore_ilp): Prototype. * stabs.c (dot_func_p): Use bfd_boolean type. (generate_asm_file): Use temp_ilp and restore_ilp. (stabs_generate_asm_lineno): Likewise. (stabs_generate_asm_endfunc): Likewise. diff --git a/gas/read.c b/gas/read.c index 3669b28..4ca8b01 100644 --- a/gas/read.c +++ b/gas/read.c @@ -6333,3 +6333,47 @@ find_end_of_line (char *s, int mri_string) { return _find_end_of_line (s, mri_string, 0, 0); } + +static char *saved_ilp = NULL; +static char *saved_limit; + +/* Use BUF as a temporary input pointer for calling other functions in this + file. BUF must be a C string, so that its end can be found by strlen. + Also sets the buffer_limit variable (local to this file) so that buffer + overruns should not occur. Saves the current input line pointer so that + it can be restored by calling restore_ilp(). + + Does not support recursion. + + FIXME: This function is currently only used by stabs.c but that + should be extended to other files in the gas source directory. */ + +void +temp_ilp (char *buf) +{ + gas_assert (saved_ilp == NULL); + gas_assert (buf != NULL); + + saved_ilp = input_line_pointer; + saved_limit = buffer_limit; + /* Prevent the assert in restore_ilp from triggering if + the input_line_pointer has not yet been initialised. */ + if (saved_ilp == NULL) + saved_limit = saved_ilp = (char *) ""; + + input_line_pointer = buf; + buffer_limit = buf + strlen (buf); +} + +/* Restore a saved input line pointer. */ + +void +restore_ilp (void) +{ + gas_assert (saved_ilp != NULL); + + input_line_pointer = saved_ilp; + buffer_limit = saved_limit; + + saved_ilp = NULL; +} diff --git a/gas/read.h b/gas/read.h index f1ccf92..e83118f 100644 --- a/gas/read.h +++ b/gas/read.h @@ -213,3 +213,5 @@ extern void s_xstab (int what); extern void s_rva (int); extern void s_incbin (int); extern void s_weakref (int); +extern void temp_ilp (char *); +extern void restore_ilp (void); diff --git a/gas/stabs.c b/gas/stabs.c index 49fc09b..f9127f0 100644 --- a/gas/stabs.c +++ b/gas/stabs.c @@ -46,13 +46,13 @@ static void generate_asm_file (int, const char *); #define STAB_STRING_SECTION_NAME ".stabstr" #endif -/* Non-zero if we're in the middle of a .func function, in which case +/* True if we're in the middle of a .func function, in which case stabs_generate_asm_lineno emits function relative line number stabs. Otherwise it emits line number stabs with absolute addresses. Note that both cases only apply to assembler code assembled with -gstabs. */ -static int in_dot_func_p; +static bfd_boolean in_dot_func_p = FALSE; -/* Label at start of current function if in_dot_func_p != 0. */ +/* Label at start of current function if in_dot_func_p != FALSE. */ static const char *current_function_label; /* @@ -510,7 +510,6 @@ generate_asm_file (int type, const char *file) { static char *last_file; static int label_count; - char *hold; char sym[30]; char *buf; const char *tmp = file; @@ -525,8 +524,6 @@ generate_asm_file (int type, const char *file) generate a string and then parse it again. That lets us use the existing stabs hook, which expect to see a string, rather than inventing new ones. */ - hold = input_line_pointer; - sprintf (sym, "%sF%d", FAKE_LABEL_NAME, label_count); ++label_count; @@ -556,8 +553,10 @@ generate_asm_file (int type, const char *file) sprintf (bufp, "\",%d,0,0,%s\n", type, sym); - input_line_pointer = buf; + temp_ilp (buf); s_stab ('s'); + restore_ilp (); + colon (sym); if (last_file != NULL) @@ -565,8 +564,6 @@ generate_asm_file (int type, const char *file) last_file = xstrdup (file); free (buf); - - input_line_pointer = hold; } /* Generate stabs debugging information for the current line. This is @@ -576,7 +573,6 @@ void stabs_generate_asm_lineno (void) { static int label_count; - char *hold; const char *file; unsigned int lineno; char *buf; @@ -590,8 +586,6 @@ stabs_generate_asm_lineno (void) existing stabs hook, which expect to see a string, rather than inventing new ones. */ - hold = input_line_pointer; - file = as_where (&lineno); /* Don't emit sequences of stabs for the same line. */ @@ -638,11 +632,13 @@ stabs_generate_asm_lineno (void) buf = XNEWVEC (char, 100); sprintf (buf, "%d,0,%d,%s\n", N_SLINE, lineno, sym); } - input_line_pointer = buf; + + temp_ilp (buf); s_stab ('n'); + restore_ilp (); + colon (sym); - input_line_pointer = hold; outputting_stabs_line_debug = 0; free (buf); } @@ -653,29 +649,30 @@ stabs_generate_asm_lineno (void) void stabs_generate_asm_func (const char *funcname, const char *startlabname) { - static int void_emitted_p; - char *hold = input_line_pointer; + static bfd_boolean void_emitted_p = FALSE; char *buf; unsigned int lineno; if (! void_emitted_p) { - input_line_pointer = (char *) "\"void:t1=1\",128,0,0,0"; + temp_ilp ((char *) "\"void:t1=1\",128,0,0,0"); s_stab ('s'); - void_emitted_p = 1; + restore_ilp (); + void_emitted_p = TRUE; } as_where (&lineno); if (asprintf (&buf, "\"%s:F1\",%d,0,%d,%s", funcname, N_FUN, lineno + 1, startlabname) == -1) as_fatal ("%s", xstrerror (errno)); - input_line_pointer = buf; + + temp_ilp (buf); s_stab ('s'); + restore_ilp (); free (buf); - input_line_pointer = hold; current_function_label = xstrdup (startlabname); - in_dot_func_p = 1; + in_dot_func_p = TRUE; } /* Emit a stab to record the end of a function. */ @@ -685,7 +682,6 @@ stabs_generate_asm_endfunc (const char *funcname ATTRIBUTE_UNUSED, const char *startlabname) { static int label_count; - char *hold = input_line_pointer; char *buf; char sym[30]; @@ -695,11 +691,12 @@ stabs_generate_asm_endfunc (const char *funcname ATTRIBUTE_UNUSED, if (asprintf (&buf, "\"\",%d,0,0,%s-%s", N_FUN, sym, startlabname) == -1) as_fatal ("%s", xstrerror (errno)); - input_line_pointer = buf; + + temp_ilp (buf); s_stab ('s'); + restore_ilp (); free (buf); - input_line_pointer = hold; - in_dot_func_p = 0; + in_dot_func_p = FALSE; current_function_label = NULL; }