|
From: <sv...@va...> - 2007-11-19 00:39:21
|
Author: sewardj
Date: 2007-11-19 00:39:23 +0000 (Mon, 19 Nov 2007)
New Revision: 1798
Log:
Fix this:
vex: priv/guest-amd64/toIR.c:3741 (dis_Grp5): Assertion `sz == 4' failed.
(CALL Ev with sz==8) as reported in #150678 and #146252. Also change a
bunch of assertions on undecoded instructions into proper decoding failures.
Modified:
trunk/priv/guest-amd64/toIR.c
Modified: trunk/priv/guest-amd64/toIR.c
===================================================================
--- trunk/priv/guest-amd64/toIR.c 2007-11-16 12:43:32 UTC (rev 1797)
+++ trunk/priv/guest-amd64/toIR.c 2007-11-19 00:39:23 UTC (rev 1798)
@@ -3694,7 +3694,7 @@
break;
case 2: /* call Ev */
/* Ignore any sz value and operate as if sz==8. */
- vassert(sz == 4 || sz == 8);
+ if (!(sz == 4 || sz == 8)) goto unhandled;
sz = 8;
t3 = newTemp(Ity_I64);
assign(t3, getIRegE(sz,pfx,modrm));
@@ -3709,7 +3709,7 @@
break;
case 4: /* jmp Ev */
/* Ignore any sz value and operate as if sz==8. */
- vassert(sz == 4 || sz == 8);
+ if (!(sz == 4 || sz == 8)) goto unhandled;
sz = 8;
t3 = newTemp(Ity_I64);
assign(t3, getIRegE(sz,pfx,modrm));
@@ -3748,7 +3748,7 @@
break;
case 2: /* call Ev */
/* Ignore any sz value and operate as if sz==8. */
- vassert(sz == 4);
+ if (!(sz == 4 || sz == 8)) goto unhandled;
sz = 8;
t3 = newTemp(Ity_I64);
assign(t3, loadLE(Ity_I64,mkexpr(addr)));
@@ -3763,7 +3763,7 @@
break;
case 4: /* JMP Ev */
/* Ignore any sz value and operate as if sz==8. */
- vassert(sz == 4);
+ if (!(sz == 4 || sz == 8)) goto unhandled;
sz = 8;
t3 = newTemp(Ity_I64);
assign(t3, loadLE(Ity_I64,mkexpr(addr)));
@@ -3774,7 +3774,7 @@
case 6: /* PUSH Ev */
/* There is no encoding for 32-bit operand size; hence ... */
if (sz == 4) sz = 8;
- vassert(sz == 8 || sz == 2);
+ if (!(sz == 8 || sz == 2)) goto unhandled;
if (sz == 8) {
t3 = newTemp(Ity_I64);
assign(t3, loadLE(Ity_I64,mkexpr(addr)));
|