[binutils-gdb] x86: restrict prefix use with .insn VEX/XOP/EVEX

Jan Beulich jbeulich@sourceware.org
Fri Sep 8 06:45:22 GMT 2023


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

commit 1adecddd190f8eca8ea153dec2b003985bcc744d
Author: Jan Beulich <jbeulich@suse.com>
Date:   Fri Sep 8 08:45:11 2023 +0200

    x86: restrict prefix use with .insn VEX/XOP/EVEX
    
    Avoid triggering the respective abort() in output_insn().

Diff:
---
 gas/config/tc-i386.c | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index 00abfc78264..ecf886cfee9 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -10806,6 +10806,29 @@ s_insn (int dummy ATTRIBUTE_UNUSED)
   if (line > end && i.vec_encoding == vex_encoding_default)
     i.vec_encoding = evex ? vex_encoding_evex : vex_encoding_vex;
 
+  if (i.vec_encoding != vex_encoding_default)
+    {
+      /* Only address size and segment override prefixes are permitted with
+         VEX/XOP/EVEX encodings.  */
+      const unsigned char *p = i.prefix;
+
+      for (j = 0; j < ARRAY_SIZE (i.prefix); ++j, ++p)
+	{
+	  if (!*p)
+	    continue;
+
+	  switch (j)
+	    {
+	    case SEG_PREFIX:
+	    case ADDR_PREFIX:
+	      break;
+	    default:
+		  as_bad (_("illegal prefix used with VEX/XOP/EVEX"));
+		  goto bad;
+	    }
+	}
+    }
+
   if (line > end && *line == '.')
     {
       /* Length specifier (VEX.L, XOP.L, EVEX.L'L).  */


More information about the Binutils-cvs mailing list