Fix problems parsing RISCV architecture extenstions in the assembler.
authorAndrew Waterman <andrew@sifive.com>
Fri, 28 Jul 2017 09:02:57 +0000 (10:02 +0100)
committerNick Clifton <nickc@redhat.com>
Fri, 28 Jul 2017 09:02:57 +0000 (10:02 +0100)
* config/tc-riscv.c (riscv_set_arch): Handle the Q subset like
all other subsets.
Obviate use-after-free.

gas/ChangeLog
gas/config/tc-riscv.c

index 30d349b33e63b2bedc8997d6410c40ac6132c33e..7b716c3cc3bd458922040de82eebb4cf6243b9b5 100644 (file)
@@ -1,3 +1,9 @@
+2017-07-28  Andrew Waterman  <andrew@sifive.com>
+
+       * config/tc-riscv.c (riscv_set_arch): Handle the Q subset like
+       all other subsets.
+       Obviate use-after-free.
+
 2017-07-25  Nick Clifton  <nickc@redhat.com>
 
        PR 21739
index 55c41c5db3c9240e8da3cdf8906cfb745d041c6f..4c644ab65edf83385433346a2e2377de5057c5aa 100644 (file)
@@ -147,8 +147,8 @@ riscv_add_subset (const char *subset)
 static void
 riscv_set_arch (const char *s)
 {
-  const char *all_subsets = "imafdc";
-  const char *extension = NULL;
+  const char *all_subsets = "imafdqc";
+  char *extension = NULL;
   const char *p = s;
 
   riscv_clear_subsets();
@@ -173,7 +173,7 @@ riscv_set_arch (const char *s)
 
       case 'g':
        p++;
-       for ( ; *all_subsets != 'c'; all_subsets++)
+       for ( ; *all_subsets != 'q'; all_subsets++)
          {
            const char subset[] = {*all_subsets, '\0'};
            riscv_add_subset (subset);
@@ -188,7 +188,8 @@ riscv_set_arch (const char *s)
     {
       if (*p == 'x')
        {
-         char *subset = xstrdup (p), *q = subset;
+         char *subset = xstrdup (p);
+         char *q = subset;
 
          while (*++q != '\0' && *q != '_')
            ;
@@ -200,7 +201,6 @@ riscv_set_arch (const char *s)
          extension = subset;
          riscv_add_subset (subset);
          p += strlen (subset);
-         free (subset);
        }
       else if (*p == '_')
        p++;
@@ -211,15 +211,11 @@ riscv_set_arch (const char *s)
          all_subsets++;
          p++;
        }
-      else if (*p == 'q')
-       {
-         const char subset[] = {*p, 0};
-         riscv_add_subset (subset);
-         p++;
-       }
       else
        as_fatal ("-march=%s: unsupported ISA subset `%c'", s, *p);
     }
+
+  free (extension);
 }
 
 /* Handle of the OPCODE hash table.  */