From a52d0b9de195d91bdf6730e114ee09fe4d1e67ad Mon Sep 17 00:00:00 2001 From: Luis Machado Date: Fri, 14 May 2021 11:34:06 -0300 Subject: [PATCH] Sanitize the address before working with allocation tags Remove the logical tag/top byte from the address whenever we have to work with allocation tags. gdb/ChangeLog: 2021-06-28 Luis Machado * aarch64-linux-tdep.c (aarch64_linux_memtag_matches_p): Remove the top byte. (aarch64_linux_set_memtags): Likewise. (aarch64_linux_get_memtag): Likewise. (aarch64_linux_report_signal_info): Likewise. --- gdb/ChangeLog | 8 ++++++++ gdb/aarch64-linux-tdep.c | 11 +++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 92a102c9fca..51132e4a44d 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2021-06-28 Luis Machado + + * aarch64-linux-tdep.c (aarch64_linux_memtag_matches_p): Remove the top + byte. + (aarch64_linux_set_memtags): Likewise. + (aarch64_linux_get_memtag): Likewise. + (aarch64_linux_report_signal_info): Likewise. + 2021-06-28 Luis Machado * aarch64-linux-tdep.c diff --git a/gdb/aarch64-linux-tdep.c b/gdb/aarch64-linux-tdep.c index 167035275a4..63c200b47f7 100644 --- a/gdb/aarch64-linux-tdep.c +++ b/gdb/aarch64-linux-tdep.c @@ -1587,7 +1587,8 @@ aarch64_linux_memtag_matches_p (struct gdbarch *gdbarch, CORE_ADDR addr = value_as_address (address); /* Fetch the allocation tag for ADDRESS. */ - gdb::optional atag = aarch64_mte_get_atag (addr); + gdb::optional atag + = aarch64_mte_get_atag (address_significant (gdbarch, addr)); if (!atag.has_value ()) return true; @@ -1625,6 +1626,9 @@ aarch64_linux_set_memtags (struct gdbarch *gdbarch, struct value *address, } else { + /* Remove the top byte. */ + addr = address_significant (gdbarch, addr); + /* Make sure we are dealing with a tagged address to begin with. */ if (!aarch64_linux_tagged_address_p (gdbarch, address)) return false; @@ -1679,6 +1683,8 @@ aarch64_linux_get_memtag (struct gdbarch *gdbarch, struct value *address, if (!aarch64_linux_tagged_address_p (gdbarch, address)) return nullptr; + /* Remove the top byte. */ + addr = address_significant (gdbarch, addr); gdb::optional atag = aarch64_mte_get_atag (addr); if (!atag.has_value ()) @@ -1751,7 +1757,8 @@ aarch64_linux_report_signal_info (struct gdbarch *gdbarch, uiout->field_core_addr ("fault-addr", gdbarch, fault_addr); uiout->text ("\n"); - gdb::optional atag = aarch64_mte_get_atag (fault_addr); + gdb::optional atag + = aarch64_mte_get_atag (address_significant (gdbarch, fault_addr)); gdb_byte ltag = aarch64_mte_get_ltag (fault_addr); if (!atag.has_value ()) -- 2.39.2