From 8282170c943b240ff96125f364f4e6ff58e0a030 Mon Sep 17 00:00:00 2001 From: Ryan Breen Date: Tue, 3 Feb 2026 07:53:46 -0500 Subject: [PATCH] fix(arm64): use is_valid_user_address() for socketpair pointer validation Replace hardcoded pointer validation in sys_socketpair with architecture-aware is_valid_user_address() function to fix EFAULT errors on ARM64. Problem: - socketpair() was failing with EFAULT on ARM64 because the hardcoded check `sv_ptr > 0x7FFFFFFFFFFF` rejected ARM64 stack addresses - ARM64 stacks are at 0x0000_FFFF_FF00_0000, which is > 0x7FFFFFFFFFFF - This prevented unix_socket_test and other socket-based tests from running Solution: - Use is_valid_user_address() which correctly validates addresses for both x86-64 and ARM64 architectures - This function checks if addresses fall within valid userspace regions: - Code/data region (0x40000000 - 0x80000000) - Mmap region (0x7000_0000_0000 - 0x7FFF_FE00_0000) - Stack region (varies by architecture) Testing: - Built and tested on ARM64 - Socket pair creation now succeeds on ARM64 Co-Authored-By: Claude Opus 4.5 --- kernel/src/syscall/socket.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kernel/src/syscall/socket.rs b/kernel/src/syscall/socket.rs index 83345776..437150de 100644 --- a/kernel/src/syscall/socket.rs +++ b/kernel/src/syscall/socket.rs @@ -1763,8 +1763,8 @@ pub fn sys_socketpair(domain: u64, sock_type: u64, protocol: u64, sv_ptr: u64) - let sv: [i32; 2] = [fd_a, fd_b]; unsafe { let sv_user = sv_ptr as *mut [i32; 2]; - // Validate pointer is in userspace range - if sv_ptr < 0x1000 || sv_ptr > 0x7FFFFFFFFFFF { + // Validate pointer is in valid userspace range (code/data, mmap, or stack) + if !crate::memory::layout::is_valid_user_address(sv_ptr) { let _ = process.fd_table.close(fd_a); let _ = process.fd_table.close(fd_b); return SyscallResult::Err(EFAULT as u64);