mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-25 19:14:52 +08:00
Fix a potential illegal memory access whilt parsing an x86 insn.
PR 24308 * config/tc-i386.c (parse_insn): Check mnemp before using it to determine if a suffix can be trimmed.
This commit is contained in:
parent
fe3fef62ad
commit
1c529385d9
@ -1,3 +1,9 @@
|
||||
2019-03-15 Li Hao <li.hao296@zte.com.cn>
|
||||
|
||||
PR 24308
|
||||
* config/tc-i386.c (parse_insn): Check mnemp before using it to
|
||||
determine if a suffix can be trimmed.
|
||||
|
||||
2019-03-13 Christian Eggers <ceggers@gmx.de>
|
||||
|
||||
* dwarf2dbg.c (out_set_addr): Align relocation within .debug_line.
|
||||
|
@ -4561,46 +4561,50 @@ parse_insn (char *line, char *mnemonic)
|
||||
if (!current_templates)
|
||||
{
|
||||
check_suffix:
|
||||
/* See if we can get a match by trimming off a suffix. */
|
||||
switch (mnem_p[-1])
|
||||
if (mnem_p > mnemonic)
|
||||
{
|
||||
case WORD_MNEM_SUFFIX:
|
||||
if (intel_syntax && (intel_float_operand (mnemonic) & 2))
|
||||
i.suffix = SHORT_MNEM_SUFFIX;
|
||||
else
|
||||
/* Fall through. */
|
||||
case BYTE_MNEM_SUFFIX:
|
||||
case QWORD_MNEM_SUFFIX:
|
||||
i.suffix = mnem_p[-1];
|
||||
mnem_p[-1] = '\0';
|
||||
current_templates = (const templates *) hash_find (op_hash,
|
||||
mnemonic);
|
||||
break;
|
||||
case SHORT_MNEM_SUFFIX:
|
||||
case LONG_MNEM_SUFFIX:
|
||||
if (!intel_syntax)
|
||||
/* See if we can get a match by trimming off a suffix. */
|
||||
switch (mnem_p[-1])
|
||||
{
|
||||
i.suffix = mnem_p[-1];
|
||||
mnem_p[-1] = '\0';
|
||||
current_templates = (const templates *) hash_find (op_hash,
|
||||
mnemonic);
|
||||
}
|
||||
break;
|
||||
|
||||
/* Intel Syntax. */
|
||||
case 'd':
|
||||
if (intel_syntax)
|
||||
{
|
||||
if (intel_float_operand (mnemonic) == 1)
|
||||
case WORD_MNEM_SUFFIX:
|
||||
if (intel_syntax && (intel_float_operand (mnemonic) & 2))
|
||||
i.suffix = SHORT_MNEM_SUFFIX;
|
||||
else
|
||||
i.suffix = LONG_MNEM_SUFFIX;
|
||||
/* Fall through. */
|
||||
case BYTE_MNEM_SUFFIX:
|
||||
case QWORD_MNEM_SUFFIX:
|
||||
i.suffix = mnem_p[-1];
|
||||
mnem_p[-1] = '\0';
|
||||
current_templates = (const templates *) hash_find (op_hash,
|
||||
mnemonic);
|
||||
mnemonic);
|
||||
break;
|
||||
case SHORT_MNEM_SUFFIX:
|
||||
case LONG_MNEM_SUFFIX:
|
||||
if (!intel_syntax)
|
||||
{
|
||||
i.suffix = mnem_p[-1];
|
||||
mnem_p[-1] = '\0';
|
||||
current_templates = (const templates *) hash_find (op_hash,
|
||||
mnemonic);
|
||||
}
|
||||
break;
|
||||
|
||||
/* Intel Syntax. */
|
||||
case 'd':
|
||||
if (intel_syntax)
|
||||
{
|
||||
if (intel_float_operand (mnemonic) == 1)
|
||||
i.suffix = SHORT_MNEM_SUFFIX;
|
||||
else
|
||||
i.suffix = LONG_MNEM_SUFFIX;
|
||||
mnem_p[-1] = '\0';
|
||||
current_templates = (const templates *) hash_find (op_hash,
|
||||
mnemonic);
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (!current_templates)
|
||||
{
|
||||
as_bad (_("no such instruction: `%s'"), token_start);
|
||||
|
Loading…
Reference in New Issue
Block a user