mirror of
https://github.com/abseil/abseil-cpp.git
synced 2026-06-04 12:07:05 +08:00
AddressIsReadable: improve comments
Linux kernel's rt_sigprocmask correctly handles an unaligned user address[1]. The original issue was for qemu-user, which seems long irrelevant. Tested locally on an AArch64 CPU and qemu-aarch64-static. The alignment operation actually serves another purpose: when addr resides in the last 7 bytes of a page (unaligned), check only the current page and not the next. Update the comment. [1]: kernel/signal.c `SYSCALL_DEFINE4(rt_sigprocmask` arch/arm64/include/asm/uaccess.h:raw_copy_from_user arch/arm64/lib/copy_template.S "alignment handled by the hardware" PiperOrigin-RevId: 592618320 Change-Id: Ifbd05aba42f46e36e710cca940570213036b3ce0
This commit is contained in:
committed by
Copybara-Service
parent
299dbc588e
commit
7a1898a04f
@@ -50,8 +50,10 @@ namespace debugging_internal {
|
||||
// NOTE: any new system calls here may also require sandbox reconfiguration.
|
||||
//
|
||||
bool AddressIsReadable(const void *addr) {
|
||||
// Align address on 8-byte boundary. On aarch64, checking last
|
||||
// byte before inaccessible page returned unexpected EFAULT.
|
||||
// rt_sigprocmask below checks 8 contiguous bytes. If addr resides in the
|
||||
// last 7 bytes of a page (unaligned), rt_sigprocmask would additionally
|
||||
// check the readability of the next page, which is not desired. Align
|
||||
// address on 8-byte boundary to check only the current page.
|
||||
const uintptr_t u_addr = reinterpret_cast<uintptr_t>(addr) & ~uintptr_t{7};
|
||||
addr = reinterpret_cast<const void *>(u_addr);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user