⬢ DragonFlyBSD Kernel Audit
DF-5336 / fix.diff
← back to finding ↓ download raw
--- a/sys/cpu/x86_64/misc/db_disasm.c
+++ b/sys/cpu/x86_64/misc/db_disasm.c
@@ -177,6 +177,7 @@
 	"vmlaunch",
 	"vmresume",
 	"vmxoff",
+	"", "", "",			/* pad to 8 entries (rm is 0..7) */
 };
 
 static const char * const db_Grp7_11_001[] = {
@@ -184,6 +185,7 @@
 	"mwait",
 	"clac",
 	"stac",
+	"", "", "", "",			/* pad to 8 entries (rm is 0..7) */
 };
 
 static const char * const db_Grp7_11_010[] = {
@@ -194,11 +196,13 @@
 	"vmfunc",
 	"xend",
 	"xtest",
+	"",				/* pad to 8 entries (rm is 0..7) */
 };
 
 static const char * const db_Grp7_11_111[] = {
 	"swapgs",
 	"rdtscp",
+	"", "", "", "", "", "",		/* pad to 8 entries (rm is 0..7) */
 };
 
 static const char * const* db_Grp7_11[] = {
@@ -1272,8 +1276,14 @@
 	}
 	else if (ip->i_extra == db_Grp7) {
 	     if((regmodrm & 0xC0) == 0xC0) {
-		i_name = db_Grp7_11[f_reg(rex, regmodrm)][regmodrm &0x7];
+		int reg = f_reg(rex, regmodrm);
+		const char * const *sub;
+
 		i_mode = 0;
+		if (reg > 5 || (sub = db_Grp7_11[reg]) == NULL)
+			i_name = "";
+		else
+			i_name = sub[regmodrm & 0x7];
 	     }
 	     else {
 		i_name = ((const char * const *)ip->i_extra)[f_reg(rex, regmodrm)];