diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c index ecb15d23437..aad0c4fb6f3 100644 --- a/gas/config/tc-aarch64.c +++ b/gas/config/tc-aarch64.c @@ -4106,11 +4106,13 @@ parse_sys_reg (char **str, struct hash_control *sys_regs, p = buf; for (q = *str; ISALNUM (*q) || *q == '_'; q++) - if (p < buf + 31) + if (p < buf + (sizeof (buf) - 1)) *p++ = TOLOWER (*q); *p = '\0'; - /* Assert that BUF be large enough. */ - gas_assert (p - buf == q - *str); + + /* Assume that our buffer is big enough for any valid system register. */ + if (p - buf != q - *str) + return PARSE_FAIL; o = hash_find (sys_regs, buf); if (!o) diff --git a/gas/testsuite/gas/aarch64/invalid-sysreg-assert.d b/gas/testsuite/gas/aarch64/invalid-sysreg-assert.d new file mode 100644 index 00000000000..a6279bbe7c2 --- /dev/null +++ b/gas/testsuite/gas/aarch64/invalid-sysreg-assert.d @@ -0,0 +1,3 @@ +#name: don't assert on long system register +#source: invalid-sysreg-assert.s +#error_output: invalid-sysreg-assert.l diff --git a/gas/testsuite/gas/aarch64/invalid-sysreg-assert.l b/gas/testsuite/gas/aarch64/invalid-sysreg-assert.l new file mode 100644 index 00000000000..b6049108b07 --- /dev/null +++ b/gas/testsuite/gas/aarch64/invalid-sysreg-assert.l @@ -0,0 +1,2 @@ +[^:]*: Assembler messages: +.*: Error: unknown or missing system register name at operand 1 -- `msr 00000000000000000000000000000000' diff --git a/gas/testsuite/gas/aarch64/invalid-sysreg-assert.s b/gas/testsuite/gas/aarch64/invalid-sysreg-assert.s new file mode 100644 index 00000000000..8b3706fd9cd --- /dev/null +++ b/gas/testsuite/gas/aarch64/invalid-sysreg-assert.s @@ -0,0 +1,2 @@ +// This input caused an assertion failure in parse_sys_reg. +msr 00000000000000000000000000000000