aarch64: Fix segfault on unicode symbols

Message ID 20200702120452.gfwgdclnnhlgepsb@arm.com
State New
Headers show
Series
  • aarch64: Fix segfault on unicode symbols
Related show

Commit Message

Alex Coplan July 2, 2020, 12:04 p.m.
Hello,

This patch fixes a segfault which occurs when the AArch64 backend parses
a symbol operand that begins with a register name and ends with a
unicode byte (byte value > 127).

For example, the following input causes the crash:

x0é: udf x0é

Testing:
 * aarch64-none-elf testsuite run on x86_64 host.

OK for master?

Thanks,
Alex

---

gas/ChangeLog:

2020-07-02  Alex Coplan  <alex.coplan@arm.com>

	* config/tc-aarch64.c (reg_name_p): Fix cast so that we don't
	segfault on negative chars.
	* testsuite/gas/aarch64/reglike-label-unicode-segv.d: New test.
	* testsuite/gas/aarch64/reglike-label-unicode-segv.s: Input.

Comments

Alan Modra via Binutils July 2, 2020, 12:18 p.m. | #1
Hi Alex,

> OK for master?


> gas/ChangeLog:

> 2020-07-02  Alex Coplan  <alex.coplan@arm.com>

> 

> 	* config/tc-aarch64.c (reg_name_p): Fix cast so that we don't

> 	segfault on negative chars.

> 	* testsuite/gas/aarch64/reglike-label-unicode-segv.d: New test.

> 	* testsuite/gas/aarch64/reglike-label-unicode-segv.s: Input.


Approved - please apply.

Cheers
  Nick

Patch

diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c
index 728fd10a4e2..ecb15d23437 100644
--- a/gas/config/tc-aarch64.c
+++ b/gas/config/tc-aarch64.c
@@ -2190,7 +2190,7 @@  reg_name_p (char *str, aarch64_reg_type reg_type)
     return FALSE;
 
   skip_whitespace (str);
-  if (*str == ',' || is_end_of_line[(unsigned int) *str])
+  if (*str == ',' || is_end_of_line[(unsigned char) *str])
     return TRUE;
 
   return FALSE;
diff --git a/gas/testsuite/gas/aarch64/reglike-label-unicode-segv.d b/gas/testsuite/gas/aarch64/reglike-label-unicode-segv.d
new file mode 100644
index 00000000000..f262e6f75ab
--- /dev/null
+++ b/gas/testsuite/gas/aarch64/reglike-label-unicode-segv.d
@@ -0,0 +1,8 @@ 
+#objdump: -dr
+
+.*:     file format .*
+
+Disassembly of section \.text:
+
+0+ <x0é>:
+.*:	00000000 	udf	#0
diff --git a/gas/testsuite/gas/aarch64/reglike-label-unicode-segv.s b/gas/testsuite/gas/aarch64/reglike-label-unicode-segv.s
new file mode 100644
index 00000000000..18f1e929571
--- /dev/null
+++ b/gas/testsuite/gas/aarch64/reglike-label-unicode-segv.s
@@ -0,0 +1,2 @@ 
+x0é:
+udf x0é