[libc-commits] [libc] [libc] Fix send and recv functions (PR #110936)
Michael Jones via libc-commits
libc-commits at lists.llvm.org
Wed Oct 2 15:59:47 PDT 2024
https://github.com/michaelrj-google created https://github.com/llvm/llvm-project/pull/110936
There were some errors in the implementation. Oops. This patch fixes
those.
>From 0a13ec5b6e393f9aeeb2aa9ca00c29b7783081e4 Mon Sep 17 00:00:00 2001
From: Michael Jones <michaelrj at google.com>
Date: Wed, 2 Oct 2024 15:58:42 -0700
Subject: [PATCH] [libc] Fix send and recv functions
There were some errors in the implementation. Oops. This patch fixes
those.
---
libc/src/sys/socket/linux/recv.cpp | 16 ++++++++--------
libc/src/sys/socket/linux/recvfrom.cpp | 17 ++++++++---------
libc/src/sys/socket/linux/recvmsg.cpp | 13 +++++++------
libc/src/sys/socket/linux/send.cpp | 15 ++++++++-------
libc/src/sys/socket/linux/sendmsg.cpp | 13 +++++++------
libc/src/sys/socket/linux/sendto.cpp | 15 +++++++--------
libc/src/sys/socket/recvfrom.h | 2 +-
7 files changed, 46 insertions(+), 45 deletions(-)
diff --git a/libc/src/sys/socket/linux/recv.cpp b/libc/src/sys/socket/linux/recv.cpp
index 55a766aec0e77f..a534dffd0f583f 100644
--- a/libc/src/sys/socket/linux/recv.cpp
+++ b/libc/src/sys/socket/linux/recv.cpp
@@ -8,6 +8,9 @@
#include "src/sys/socket/recv.h"
+#include <linux/net.h> // For SYS_SOCKET socketcall number.
+#include <sys/syscall.h> // For syscall numbers.
+
#include "hdr/types/socklen_t.h"
#include "hdr/types/ssize_t.h"
#include "hdr/types/struct_sockaddr.h"
@@ -15,8 +18,6 @@
#include "src/__support/common.h"
#include "src/__support/macros/sanitizer.h"
#include "src/errno/libc_errno.h"
-#include <linux/net.h> // For SYS_SOCKET socketcall number.
-#include <sys/syscall.h> // For syscall numbers.
namespace LIBC_NAMESPACE_DECL {
@@ -24,17 +25,16 @@ LLVM_LIBC_FUNCTION(ssize_t, recv,
(int sockfd, const void *buf, size_t len, int flags)) {
#ifdef SYS_recv
ssize_t ret =
- LIBC_NAMESPACE::syscall_impl<int>(SYS_recv, sockfd, buf, len, flags);
+ LIBC_NAMESPACE::syscall_impl<ssize_t>(SYS_recv, sockfd, buf, len, flags);
#elif defined(SYS_recvfrom)
- ssize_t ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_recvfrom, sockfd,
- reinterpret_cast<long>(buf),
- len, flags, nullptr, 0);
+ ssize_t ret = LIBC_NAMESPACE::syscall_impl<ssize_t>(
+ SYS_recvfrom, sockfd, buf, len, flags, nullptr, nullptr);
#elif defined(SYS_socketcall)
unsigned long sockcall_args[4] = {
static_cast<unsigned long>(sockfd), reinterpret_cast<unsigned long>(buf),
static_cast<unsigned long>(len), static_cast<unsigned long>(flags)};
- ssize_t ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_socketcall, SYS_RECV,
- sockcall_args);
+ ssize_t ret = LIBC_NAMESPACE::syscall_impl<ssize_t>(SYS_socketcall, SYS_RECV,
+ sockcall_args);
#else
#error "socket and socketcall syscalls unavailable for this platform."
#endif
diff --git a/libc/src/sys/socket/linux/recvfrom.cpp b/libc/src/sys/socket/linux/recvfrom.cpp
index 990e58da3c1b64..fdcaceee8ad293 100644
--- a/libc/src/sys/socket/linux/recvfrom.cpp
+++ b/libc/src/sys/socket/linux/recvfrom.cpp
@@ -8,6 +8,9 @@
#include "src/sys/socket/recvfrom.h"
+#include <linux/net.h> // For SYS_SOCKET socketcall number.
+#include <sys/syscall.h> // For syscall numbers.
+
#include "hdr/types/socklen_t.h"
#include "hdr/types/ssize_t.h"
#include "hdr/types/struct_sockaddr.h"
@@ -15,19 +18,15 @@
#include "src/__support/common.h"
#include "src/__support/macros/sanitizer.h"
#include "src/errno/libc_errno.h"
-#include <linux/net.h> // For SYS_SOCKET socketcall number.
-#include <sys/syscall.h> // For syscall numbers.
namespace LIBC_NAMESPACE_DECL {
LLVM_LIBC_FUNCTION(ssize_t, recvfrom,
(int sockfd, const void *buf, size_t len, int flags,
- const struct sockaddr *dest_addr, socklen_t addrlen)) {
+ const struct sockaddr *dest_addr, socklen_t *addrlen)) {
#ifdef SYS_recvfrom
-
- ssize_t ret = LIBC_NAMESPACE::syscall_impl<int>(
- SYS_recvfrom, sockfd, reinterpret_cast<long>(buf), len, flags,
- reinterpret_cast<long>(dest_addr), addrlen);
+ ssize_t ret = LIBC_NAMESPACE::syscall_impl<ssize_t>(
+ SYS_recvfrom, sockfd, buf, len, flags, dest_addr, addrlen);
#elif defined(SYS_socketcall)
unsigned long sockcall_args[6] = {static_cast<unsigned long>(sockfd),
reinterpret_cast<unsigned long>(buf),
@@ -35,8 +34,8 @@ LLVM_LIBC_FUNCTION(ssize_t, recvfrom,
static_cast<unsigned long>(flags),
reinterpret_cast<unsigned long>(dest_addr),
static_cast<unsigned long>(addrlen)};
- ssize_t ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_socketcall, SYS_RECVFROM,
- sockcall_args);
+ ssize_t ret = LIBC_NAMESPACE::syscall_impl<ssize_t>(
+ SYS_socketcall, SYS_RECVFROM, sockcall_args);
#else
#error "socket and socketcall syscalls unavailable for this platform."
#endif
diff --git a/libc/src/sys/socket/linux/recvmsg.cpp b/libc/src/sys/socket/linux/recvmsg.cpp
index f44e5800d817f2..59a99210c1a840 100644
--- a/libc/src/sys/socket/linux/recvmsg.cpp
+++ b/libc/src/sys/socket/linux/recvmsg.cpp
@@ -8,28 +8,29 @@
#include "src/sys/socket/recvmsg.h"
+#include <linux/net.h> // For SYS_SOCKET socketcall number.
+#include <sys/syscall.h> // For syscall numbers.
+
#include "hdr/types/ssize_t.h"
#include "hdr/types/struct_msghdr.h"
#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
#include "src/__support/common.h"
#include "src/__support/macros/sanitizer.h"
#include "src/errno/libc_errno.h"
-#include <linux/net.h> // For SYS_SOCKET socketcall number.
-#include <sys/syscall.h> // For syscall numbers.
namespace LIBC_NAMESPACE_DECL {
LLVM_LIBC_FUNCTION(ssize_t, recvmsg,
(int sockfd, const struct msghdr *msg, int flags)) {
#ifdef SYS_recvmsg
- ssize_t ret = LIBC_NAMESPACE::syscall_impl<int>(
- SYS_recvmsg, sockfd, reinterpret_cast<long>(msg), flags);
+ ssize_t ret =
+ LIBC_NAMESPACE::syscall_impl<ssize_t>(SYS_recvmsg, sockfd, msg, flags);
#elif defined(SYS_socketcall)
unsigned long sockcall_args[3] = {static_cast<unsigned long>(sockfd),
reinterpret_cast<unsigned long>(msg),
static_cast<unsigned long>(flags)};
- ssize_t ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_socketcall, SYS_RECVMSG,
- sockcall_args);
+ ssize_t ret = LIBC_NAMESPACE::syscall_impl<ssize_t>(
+ SYS_socketcall, SYS_RECVMSG, sockcall_args);
#else
#error "socket and socketcall syscalls unavailable for this platform."
#endif
diff --git a/libc/src/sys/socket/linux/send.cpp b/libc/src/sys/socket/linux/send.cpp
index 0d29b6fd35b903..cb3b4d5a9ece72 100644
--- a/libc/src/sys/socket/linux/send.cpp
+++ b/libc/src/sys/socket/linux/send.cpp
@@ -8,14 +8,15 @@
#include "src/sys/socket/send.h"
+#include <linux/net.h> // For SYS_SOCKET socketcall number.
+#include <sys/syscall.h> // For syscall numbers.
+
#include "hdr/types/socklen_t.h"
#include "hdr/types/ssize_t.h"
#include "hdr/types/struct_sockaddr.h"
#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
#include "src/__support/common.h"
#include "src/errno/libc_errno.h"
-#include <linux/net.h> // For SYS_SOCKET socketcall number.
-#include <sys/syscall.h> // For syscall numbers.
namespace LIBC_NAMESPACE_DECL {
@@ -23,16 +24,16 @@ LLVM_LIBC_FUNCTION(ssize_t, send,
(int sockfd, const void *buf, size_t len, int flags)) {
#ifdef SYS_send
ssize_t ret =
- LIBC_NAMESPACE::syscall_impl<int>(SYS_send, sockfd, buf, len, flags);
+ LIBC_NAMESPACE::syscall_impl<ssize_t>(SYS_send, sockfd, buf, len, flags);
#elif defined(SYS_sendto)
- ssize_t ret = LIBC_NAMESPACE::syscall_impl<int>(
- SYS_sendto, sockfd, reinterpret_cast<long>(buf), len, flags, nullptr, 0);
+ ssize_t ret = LIBC_NAMESPACE::syscall_impl<ssize_t>(SYS_sendto, sockfd, buf,
+ len, flags, nullptr, 0);
#elif defined(SYS_socketcall)
unsigned long sockcall_args[4] = {
static_cast<unsigned long>(sockfd), reinterpret_cast<unsigned long>(buf),
static_cast<unsigned long>(len), static_cast<unsigned long>(flags)};
- ssize_t ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_socketcall, SYS_SEND,
- sockcall_args);
+ ssize_t ret = LIBC_NAMESPACE::syscall_impl<ssize_t>(SYS_socketcall, SYS_SEND,
+ sockcall_args);
#else
#error "socket and socketcall syscalls unavailable for this platform."
#endif
diff --git a/libc/src/sys/socket/linux/sendmsg.cpp b/libc/src/sys/socket/linux/sendmsg.cpp
index ba2b37768cc246..b4d9c9deda028e 100644
--- a/libc/src/sys/socket/linux/sendmsg.cpp
+++ b/libc/src/sys/socket/linux/sendmsg.cpp
@@ -8,27 +8,28 @@
#include "src/sys/socket/sendmsg.h"
+#include <linux/net.h> // For SYS_SOCKET socketcall number.
+#include <sys/syscall.h> // For syscall numbers.
+
#include "hdr/types/ssize_t.h"
#include "hdr/types/struct_msghdr.h"
#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
#include "src/__support/common.h"
#include "src/errno/libc_errno.h"
-#include <linux/net.h> // For SYS_SOCKET socketcall number.
-#include <sys/syscall.h> // For syscall numbers.
namespace LIBC_NAMESPACE_DECL {
LLVM_LIBC_FUNCTION(ssize_t, sendmsg,
(int sockfd, const struct msghdr *msg, int flags)) {
#ifdef SYS_sendmsg
- ssize_t ret = LIBC_NAMESPACE::syscall_impl<int>(
- SYS_sendmsg, sockfd, reinterpret_cast<long>(msg), flags);
+ ssize_t ret =
+ LIBC_NAMESPACE::syscall_impl<ssize_t>(SYS_sendmsg, sockfd, msg, flags);
#elif defined(SYS_socketcall)
unsigned long sockcall_args[3] = {static_cast<unsigned long>(sockfd),
reinterpret_cast<unsigned long>(msg),
static_cast<unsigned long>(flags)};
- ssize_t ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_socketcall, SYS_SENDMSG,
- sockcall_args);
+ ssize_t ret = LIBC_NAMESPACE::syscall_impl<ssize_t>(
+ SYS_socketcall, SYS_SENDMSG, sockcall_args);
#else
#error "socket and socketcall syscalls unavailable for this platform."
#endif
diff --git a/libc/src/sys/socket/linux/sendto.cpp b/libc/src/sys/socket/linux/sendto.cpp
index f5c3ffe8954da9..2fada192b08656 100644
--- a/libc/src/sys/socket/linux/sendto.cpp
+++ b/libc/src/sys/socket/linux/sendto.cpp
@@ -8,14 +8,15 @@
#include "src/sys/socket/sendto.h"
+#include <linux/net.h> // For SYS_SOCKET socketcall number.
+#include <sys/syscall.h> // For syscall numbers.
+
#include "hdr/types/socklen_t.h"
#include "hdr/types/ssize_t.h"
#include "hdr/types/struct_sockaddr.h"
#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
#include "src/__support/common.h"
#include "src/errno/libc_errno.h"
-#include <linux/net.h> // For SYS_SOCKET socketcall number.
-#include <sys/syscall.h> // For syscall numbers.
namespace LIBC_NAMESPACE_DECL {
@@ -23,10 +24,8 @@ LLVM_LIBC_FUNCTION(ssize_t, sendto,
(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen)) {
#ifdef SYS_sendto
-
- ssize_t ret = LIBC_NAMESPACE::syscall_impl<int>(
- SYS_sendto, sockfd, reinterpret_cast<long>(buf), len, flags,
- reinterpret_cast<long>(dest_addr), addrlen);
+ ssize_t ret = LIBC_NAMESPACE::syscall_impl<ssize_t>(
+ SYS_sendto, sockfd, buf, len, flags, dest_addr, addrlen);
#elif defined(SYS_socketcall)
unsigned long sockcall_args[6] = {static_cast<unsigned long>(sockfd),
reinterpret_cast<unsigned long>(buf),
@@ -34,8 +33,8 @@ LLVM_LIBC_FUNCTION(ssize_t, sendto,
static_cast<unsigned long>(flags),
reinterpret_cast<unsigned long>(dest_addr),
static_cast<unsigned long>(addrlen)};
- ssize_t ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_socketcall, SYS_SENDTO,
- sockcall_args);
+ ssize_t ret = LIBC_NAMESPACE::syscall_impl<ssize_t>(
+ SYS_socketcall, SYS_SENDTO, sockcall_args);
#else
#error "socket and socketcall syscalls unavailable for this platform."
#endif
diff --git a/libc/src/sys/socket/recvfrom.h b/libc/src/sys/socket/recvfrom.h
index ee8d52157b705d..40e6cabca043b9 100644
--- a/libc/src/sys/socket/recvfrom.h
+++ b/libc/src/sys/socket/recvfrom.h
@@ -18,7 +18,7 @@
namespace LIBC_NAMESPACE_DECL {
ssize_t recvfrom(int sockfd, const void *buf, size_t len, int flags,
- const struct sockaddr *address, socklen_t addrlen);
+ const struct sockaddr *address, socklen_t *addrlen);
} // namespace LIBC_NAMESPACE_DECL
More information about the libc-commits
mailing list