forked from Imagelibrary/binutils-gdb
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 <luis.machado@linaro.org> * 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.
This commit is contained in:
@@ -1,3 +1,11 @@
|
|||||||
|
2021-06-28 Luis Machado <luis.machado@linaro.org>
|
||||||
|
|
||||||
|
* 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 <luis.machado@linaro.org>
|
2021-06-28 Luis Machado <luis.machado@linaro.org>
|
||||||
|
|
||||||
* aarch64-linux-tdep.c
|
* aarch64-linux-tdep.c
|
||||||
|
|||||||
@@ -1587,7 +1587,8 @@ aarch64_linux_memtag_matches_p (struct gdbarch *gdbarch,
|
|||||||
CORE_ADDR addr = value_as_address (address);
|
CORE_ADDR addr = value_as_address (address);
|
||||||
|
|
||||||
/* Fetch the allocation tag for ADDRESS. */
|
/* Fetch the allocation tag for ADDRESS. */
|
||||||
gdb::optional<CORE_ADDR> atag = aarch64_mte_get_atag (addr);
|
gdb::optional<CORE_ADDR> atag
|
||||||
|
= aarch64_mte_get_atag (address_significant (gdbarch, addr));
|
||||||
|
|
||||||
if (!atag.has_value ())
|
if (!atag.has_value ())
|
||||||
return true;
|
return true;
|
||||||
@@ -1625,6 +1626,9 @@ aarch64_linux_set_memtags (struct gdbarch *gdbarch, struct value *address,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
/* Remove the top byte. */
|
||||||
|
addr = address_significant (gdbarch, addr);
|
||||||
|
|
||||||
/* Make sure we are dealing with a tagged address to begin with. */
|
/* Make sure we are dealing with a tagged address to begin with. */
|
||||||
if (!aarch64_linux_tagged_address_p (gdbarch, address))
|
if (!aarch64_linux_tagged_address_p (gdbarch, address))
|
||||||
return false;
|
return false;
|
||||||
@@ -1679,6 +1683,8 @@ aarch64_linux_get_memtag (struct gdbarch *gdbarch, struct value *address,
|
|||||||
if (!aarch64_linux_tagged_address_p (gdbarch, address))
|
if (!aarch64_linux_tagged_address_p (gdbarch, address))
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
|
/* Remove the top byte. */
|
||||||
|
addr = address_significant (gdbarch, addr);
|
||||||
gdb::optional<CORE_ADDR> atag = aarch64_mte_get_atag (addr);
|
gdb::optional<CORE_ADDR> atag = aarch64_mte_get_atag (addr);
|
||||||
|
|
||||||
if (!atag.has_value ())
|
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->field_core_addr ("fault-addr", gdbarch, fault_addr);
|
||||||
uiout->text ("\n");
|
uiout->text ("\n");
|
||||||
|
|
||||||
gdb::optional<CORE_ADDR> atag = aarch64_mte_get_atag (fault_addr);
|
gdb::optional<CORE_ADDR> atag
|
||||||
|
= aarch64_mte_get_atag (address_significant (gdbarch, fault_addr));
|
||||||
gdb_byte ltag = aarch64_mte_get_ltag (fault_addr);
|
gdb_byte ltag = aarch64_mte_get_ltag (fault_addr);
|
||||||
|
|
||||||
if (!atag.has_value ())
|
if (!atag.has_value ())
|
||||||
|
|||||||
Reference in New Issue
Block a user