mirror of
https://github.com/RGBCube/serenity
synced 2025-05-30 21:48:11 +00:00
Everywhere: Fix some alignment issues
When creating uninitialized storage for variables, we need to make sure that the alignment is correct. Fixes a KUBSAN failure when running kernels compiled with Clang. In `Syscalls/socket.cpp`, we can simply use local variables, as `sockaddr_un` is a POD type. Along with moving the `alignas` specifier to the correct member, `AK::Optional`'s internal buffer has been made non-zeroed by default. GCC emitted bogus uninitialized memory access warnings, so we now use `__builtin_launder` to tell the compiler that we know what we are doing. This might disable some optimizations, but judging by how GCC failed to notice that the memory's initialization is dependent on `m_has_value`, I'm not sure that's a bad thing.
This commit is contained in:
parent
45a82b2a5b
commit
b9f30c6f2a
5 changed files with 17 additions and 17 deletions
|
@ -119,10 +119,10 @@ KResultOr<FlatPtr> Process::sys$accept4(Userspace<const Syscall::SC_accept4_para
|
|||
VERIFY(accepted_socket);
|
||||
|
||||
if (user_address) {
|
||||
u8 address_buffer[sizeof(sockaddr_un)];
|
||||
sockaddr_un address_buffer;
|
||||
address_size = min(sizeof(sockaddr_un), static_cast<size_t>(address_size));
|
||||
accepted_socket->get_peer_address((sockaddr*)address_buffer, &address_size);
|
||||
if (!copy_to_user(user_address, address_buffer, address_size))
|
||||
accepted_socket->get_peer_address((sockaddr*)&address_buffer, &address_size);
|
||||
if (!copy_to_user(user_address, &address_buffer, address_size))
|
||||
return EFAULT;
|
||||
if (!copy_to_user(user_address_size, &address_size))
|
||||
return EFAULT;
|
||||
|
@ -311,13 +311,13 @@ int Process::get_sock_or_peer_name(const Params& params)
|
|||
auto& socket = *description->socket();
|
||||
REQUIRE_PROMISE_FOR_SOCKET_DOMAIN(socket.domain());
|
||||
|
||||
u8 address_buffer[sizeof(sockaddr_un)];
|
||||
sockaddr_un address_buffer;
|
||||
addrlen_value = min(sizeof(sockaddr_un), static_cast<size_t>(addrlen_value));
|
||||
if constexpr (sockname)
|
||||
socket.get_local_address((sockaddr*)address_buffer, &addrlen_value);
|
||||
socket.get_local_address((sockaddr*)&address_buffer, &addrlen_value);
|
||||
else
|
||||
socket.get_peer_address((sockaddr*)address_buffer, &addrlen_value);
|
||||
if (!copy_to_user(params.addr, address_buffer, addrlen_value))
|
||||
socket.get_peer_address((sockaddr*)&address_buffer, &addrlen_value);
|
||||
if (!copy_to_user(params.addr, &address_buffer, addrlen_value))
|
||||
return EFAULT;
|
||||
if (!copy_to_user(params.addrlen, &addrlen_value))
|
||||
return EFAULT;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue