PR 30632 - ld segfaults if linker script includes a STARTUP line.
[binutils-gdb.git] / ld / ldlex.l
index 6aeba6de6567fe5cb22a5bbda8416d02561cc53d..435172c08c30269988d37747625a5fdecc338353 100644 (file)
@@ -2,7 +2,7 @@
 
 %{
 
-/* Copyright (C) 1991-2021 Free Software Foundation, Inc.
+/* Copyright (C) 1991-2023 Free Software Foundation, Inc.
    Written by Steve Chamberlain of Cygnus Support.
 
    This file is part of the GNU Binutils.
@@ -233,6 +233,7 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)*
 <SCRIPT,EXPRESSION,MRI,WILD>"/="       { RTOKEN(DIVEQ); }
 <SCRIPT,EXPRESSION,MRI,WILD>"&="       { RTOKEN(ANDEQ); }
 <SCRIPT,EXPRESSION,MRI,WILD>"|="       { RTOKEN(OREQ); }
+<SCRIPT,EXPRESSION,MRI,WILD>"^="       { RTOKEN(XOREQ); }
 <EXPRESSION,MRI>"&&"                   { RTOKEN(ANDAND); }
 <SCRIPT,EXPRESSION,MRI>">"             { RTOKEN('>'); }
 <SCRIPT,EXPRESSION,MRI,INPUTLIST>","   { RTOKEN(','); }
@@ -247,6 +248,7 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)*
 <EXPRESSION,MRI>"/"                    { RTOKEN('/'); }
 <EXPRESSION,MRI>"%"                    { RTOKEN('%'); }
 <EXPRESSION,MRI>"<"                    { RTOKEN('<'); }
+<EXPRESSION,MRI>"^"                    { RTOKEN('^'); }
 <SCRIPT,EXPRESSION,MRI,WILD>"="                { RTOKEN('='); }
 <SCRIPT,EXPRESSION,MRI,WILD>"}"                { RTOKEN('}'); }
 <SCRIPT,EXPRESSION,MRI,WILD>"{"                { RTOKEN('{'); }
@@ -309,6 +311,8 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)*
 <WILD>"LONG"                           { RTOKEN(LONG); }
 <WILD>"SHORT"                          { RTOKEN(SHORT); }
 <WILD>"BYTE"                           { RTOKEN(BYTE); }
+<WILD>"ASCIZ"                          { RTOKEN(ASCIZ); }
+<WILD>"LINKER_VERSION"                 { RTOKEN(LINKER_VERSION); }
 <SCRIPT>"NOFLOAT"                      { RTOKEN(NOFLOAT); }
 <SCRIPT,EXPRESSION>"NOCROSSREFS"       { RTOKEN(NOCROSSREFS); }
 <SCRIPT,EXPRESSION>"NOCROSSREFS_TO"    { RTOKEN(NOCROSSREFS_TO); }
@@ -323,6 +327,7 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)*
 <EXPRESSION>"DSECT"                    { RTOKEN(DSECT); }
 <EXPRESSION>"COPY"                     { RTOKEN(COPY); }
 <EXPRESSION>"INFO"                     { RTOKEN(INFO); }
+<EXPRESSION>"TYPE"                     { RTOKEN(TYPE); }
 <SCRIPT,EXPRESSION>"ONLY_IF_RO"                { RTOKEN(ONLY_IF_RO); }
 <SCRIPT,EXPRESSION>"ONLY_IF_RW"                { RTOKEN(ONLY_IF_RW); }
 <SCRIPT,EXPRESSION>"SPECIAL"           { RTOKEN(SPECIAL); }
@@ -431,18 +436,10 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)*
        }
 
 <SCRIPT,EXPRESSION,WILD,VERS_NODE,INPUTLIST>"\""[^\"]*"\"" {
-                                       /* No matter the state, quotes
-                                          give what's inside.  */
-                                       bfd_size_type len;
-                                       yylval.name = xstrdup (yytext + 1);
-                                       /* PR ld/20906.  A corrupt input file
-                                          can contain bogus strings.  */
-                                       len = strlen (yylval.name);
-                                       if (len > (bfd_size_type) yyleng - 2)
-                                         len = yyleng - 2;
-                                       yylval.name[len] = 0;
-                                       return NAME;
-                               }
+               /* No matter the state, quotes give what's inside.  */
+               yylval.name = xmemdup (yytext + 1, yyleng - 2, yyleng - 1);
+               return NAME;
+       }
 
 <SCRIPT,EXPRESSION,WILD,VERS_START,VERS_NODE,VERS_SCRIPT,INPUTLIST>"\n" {
                                lineno++; }
@@ -494,8 +491,8 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)*
   return END;
 }
 
-<SCRIPT,WILD,MRI,VERS_START,VERS_SCRIPT,VERS_NODE>.    lex_warn_invalid (" in script", yytext);
-<EXPRESSION>.  lex_warn_invalid (" in expression", yytext);
+<SCRIPT,WILD,MRI,VERS_START,VERS_SCRIPT,VERS_NODE>.    lex_warn_invalid (_(" in script"), yytext);
+<EXPRESSION>.  lex_warn_invalid (_(" in expression"), yytext);
 
 %%
 \f