1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-20 13:25:08 +00:00

Kernel: Fix the return type for syscalls

The Process::Handler type has KResultOr<FlatPtr> as its return type.
Using a different return type with an equally-sized template parameter
sort of works but breaks once that condition is no longer true, e.g.
for KResultOr<int> on x86_64.

Ideally the syscall handlers would also take FlatPtrs as their args
so we can get rid of the reinterpret_cast for the function pointer
but I didn't quite feel like cleaning that up as well.
This commit is contained in:
Gunnar Beutner 2021-06-28 20:59:35 +02:00 committed by Andreas Kling
parent b6435372cc
commit 2a78bf8596
71 changed files with 313 additions and 301 deletions

View file

@ -32,7 +32,7 @@ void Process::setup_socket_fd(int fd, NonnullRefPtr<FileDescription> description
m_fds[fd].set(*description, flags);
}
KResultOr<int> Process::sys$socket(int domain, int type, int protocol)
KResultOr<FlatPtr> Process::sys$socket(int domain, int type, int protocol)
{
REQUIRE_PROMISE_FOR_SOCKET_DOMAIN(domain);
@ -51,7 +51,7 @@ KResultOr<int> Process::sys$socket(int domain, int type, int protocol)
return fd;
}
KResultOr<int> Process::sys$bind(int sockfd, Userspace<const sockaddr*> address, socklen_t address_length)
KResultOr<FlatPtr> Process::sys$bind(int sockfd, Userspace<const sockaddr*> address, socklen_t address_length)
{
auto description = file_description(sockfd);
if (!description)
@ -63,7 +63,7 @@ KResultOr<int> Process::sys$bind(int sockfd, Userspace<const sockaddr*> address,
return socket.bind(address, address_length);
}
KResultOr<int> Process::sys$listen(int sockfd, int backlog)
KResultOr<FlatPtr> Process::sys$listen(int sockfd, int backlog)
{
if (backlog < 0)
return EINVAL;
@ -79,7 +79,7 @@ KResultOr<int> Process::sys$listen(int sockfd, int backlog)
return socket.listen(backlog);
}
KResultOr<int> Process::sys$accept4(Userspace<const Syscall::SC_accept4_params*> user_params)
KResultOr<FlatPtr> Process::sys$accept4(Userspace<const Syscall::SC_accept4_params*> user_params)
{
REQUIRE_PROMISE(accept);
@ -146,7 +146,7 @@ KResultOr<int> Process::sys$accept4(Userspace<const Syscall::SC_accept4_params*>
return accepted_socket_fd;
}
KResultOr<int> Process::sys$connect(int sockfd, Userspace<const sockaddr*> user_address, socklen_t user_address_size)
KResultOr<FlatPtr> Process::sys$connect(int sockfd, Userspace<const sockaddr*> user_address, socklen_t user_address_size)
{
int fd = alloc_fd();
if (fd < 0)
@ -163,7 +163,7 @@ KResultOr<int> Process::sys$connect(int sockfd, Userspace<const sockaddr*> user_
return socket.connect(*description, user_address, user_address_size, description->is_blocking() ? ShouldBlock::Yes : ShouldBlock::No);
}
KResultOr<int> Process::sys$shutdown(int sockfd, int how)
KResultOr<FlatPtr> Process::sys$shutdown(int sockfd, int how)
{
REQUIRE_PROMISE(stdio);
if (how & ~SHUT_RDWR)
@ -179,7 +179,7 @@ KResultOr<int> Process::sys$shutdown(int sockfd, int how)
return socket.shutdown(how);
}
KResultOr<size_t> Process::sys$sendmsg(int sockfd, Userspace<const struct msghdr*> user_msg, int flags)
KResultOr<FlatPtr> Process::sys$sendmsg(int sockfd, Userspace<const struct msghdr*> user_msg, int flags)
{
REQUIRE_PROMISE(stdio);
struct msghdr msg;
@ -210,10 +210,14 @@ KResultOr<size_t> Process::sys$sendmsg(int sockfd, Userspace<const struct msghdr
auto data_buffer = UserOrKernelBuffer::for_user_buffer((u8*)iovs[0].iov_base, iovs[0].iov_len);
if (!data_buffer.has_value())
return EFAULT;
return socket.sendto(*description, data_buffer.value(), iovs[0].iov_len, flags, user_addr, addr_length);
auto result = socket.sendto(*description, data_buffer.value(), iovs[0].iov_len, flags, user_addr, addr_length);
if (result.is_error())
return result.error();
else
return result.release_value();
}
KResultOr<size_t> Process::sys$recvmsg(int sockfd, Userspace<struct msghdr*> user_msg, int flags)
KResultOr<FlatPtr> Process::sys$recvmsg(int sockfd, Userspace<struct msghdr*> user_msg, int flags)
{
REQUIRE_PROMISE(stdio);
@ -320,7 +324,7 @@ int Process::get_sock_or_peer_name(const Params& params)
return 0;
}
KResultOr<int> Process::sys$getsockname(Userspace<const Syscall::SC_getsockname_params*> user_params)
KResultOr<FlatPtr> Process::sys$getsockname(Userspace<const Syscall::SC_getsockname_params*> user_params)
{
Syscall::SC_getsockname_params params;
if (!copy_from_user(&params, user_params))
@ -328,7 +332,7 @@ KResultOr<int> Process::sys$getsockname(Userspace<const Syscall::SC_getsockname_
return get_sock_or_peer_name<true>(params);
}
KResultOr<int> Process::sys$getpeername(Userspace<const Syscall::SC_getpeername_params*> user_params)
KResultOr<FlatPtr> Process::sys$getpeername(Userspace<const Syscall::SC_getpeername_params*> user_params)
{
Syscall::SC_getpeername_params params;
if (!copy_from_user(&params, user_params))
@ -336,7 +340,7 @@ KResultOr<int> Process::sys$getpeername(Userspace<const Syscall::SC_getpeername_
return get_sock_or_peer_name<false>(params);
}
KResultOr<int> Process::sys$getsockopt(Userspace<const Syscall::SC_getsockopt_params*> user_params)
KResultOr<FlatPtr> Process::sys$getsockopt(Userspace<const Syscall::SC_getsockopt_params*> user_params)
{
Syscall::SC_getsockopt_params params;
if (!copy_from_user(&params, user_params))
@ -363,7 +367,7 @@ KResultOr<int> Process::sys$getsockopt(Userspace<const Syscall::SC_getsockopt_pa
return socket.getsockopt(*description, level, option, user_value, user_value_size);
}
KResultOr<int> Process::sys$setsockopt(Userspace<const Syscall::SC_setsockopt_params*> user_params)
KResultOr<FlatPtr> Process::sys$setsockopt(Userspace<const Syscall::SC_setsockopt_params*> user_params)
{
Syscall::SC_setsockopt_params params;
if (!copy_from_user(&params, user_params))
@ -379,7 +383,7 @@ KResultOr<int> Process::sys$setsockopt(Userspace<const Syscall::SC_setsockopt_pa
return socket.setsockopt(params.level, params.option, user_value, params.value_size);
}
KResultOr<int> Process::sys$socketpair(Userspace<const Syscall::SC_socketpair_params*> user_params)
KResultOr<FlatPtr> Process::sys$socketpair(Userspace<const Syscall::SC_socketpair_params*> user_params)
{
Syscall::SC_socketpair_params params;
if (!copy_from_user(&params, user_params))