[binutils-gdb] gas s_comm_internal uninitialised access

Alan Modra amodra@sourceware.org
Sat Jun 6 01:38:53 GMT 2026


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=8a676181f7b8e520c205c10b82d6b24a3a9cf431

commit 8a676181f7b8e520c205c10b82d6b24a3a9cf431
Author: Alan Modra <amodra@gmail.com>
Date:   Sat Jun 6 11:05:45 2026 +0930

    gas s_comm_internal uninitialised access
    
    After elf_common_parse calls ignore_rest_of_line on some errors,
    s_comm_internal calls demand_empty_rest_of_line.  These functions
    cannot be both called, as they consume the end_of_stmt char in the
    input buffer and the second call then consumes the next line of input,
    which may not even be in the input buffer.
    
            * config/obj-elf.c (elf_common_parse): Don't call
            ignore_rest_of_line here.
            * read.c (ignore_rest_of_line): Expand comment.

Diff:
---
 gas/config/obj-elf.c | 1 -
 gas/read.c           | 6 ++++--
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/gas/config/obj-elf.c b/gas/config/obj-elf.c
index 7b120ff8eeb..09a224147e9 100644
--- a/gas/config/obj-elf.c
+++ b/gas/config/obj-elf.c
@@ -275,7 +275,6 @@ elf_common_parse (int ignore ATTRIBUTE_UNUSED, symbolS *symbolP, addressT size)
 	      *input_line_pointer = '\0';
 	      as_bad (_("bad .common segment %s"), p);
 	      *input_line_pointer = c;
-	      ignore_rest_of_line ();
 	      return NULL;
 	    }
 	  /* ??? Don't ask me why these are always global.  */
diff --git a/gas/read.c b/gas/read.c
index 7a0c73abc5c..5b6a3c115a0 100644
--- a/gas/read.c
+++ b/gas/read.c
@@ -4101,8 +4101,10 @@ demand_empty_rest_of_line (void)
 /* Silently advance to the end of a statement.  Use this after already having
    issued an error about something bad.  Like demand_empty_rest_of_line,
    this function may leave input_line_pointer one after buffer_limit;
-   Don't call it from within expression parsing code in an attempt to
-   silence further errors.  */
+   Don't call it twice, and don't call both ignore_rest_of_line and
+   demand_empty_rest_of_line as that will consume two lines of input.
+   This rule leads to:  Don't call it from within expression parsing
+   code in an attempt to silence further errors.  */
 
 void
 ignore_rest_of_line (void)


More information about the Binutils-cvs mailing list