net: Convert proto callbacks from sockaddr to sockaddr_unsized

Convert struct proto pre_connect(), connect(), bind(), and bind_add()
callback function prototypes from struct sockaddr to struct sockaddr_unsized.
This does not change per-implementation use of sockaddr for passing around
an arbitrarily sized sockaddr struct. Those will be addressed in future
patches.

Additionally removes the no longer referenced struct sockaddr from
include/net/inet_common.h.

No binary changes expected.

Signed-off-by: Kees Cook <kees@kernel.org>
Link: https://patch.msgid.link/20251104002617.2752303-5-kees@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Kees Cook 2025-11-03 16:26:13 -08:00 committed by Jakub Kicinski
parent 3d39d34146
commit 449f68f8ff
31 changed files with 88 additions and 77 deletions

View File

@ -1126,7 +1126,7 @@ static void writequeue_entry_complete(struct writequeue_entry *e, int completed)
static int sctp_bind_addrs(struct socket *sock, __be16 port) static int sctp_bind_addrs(struct socket *sock, __be16 port)
{ {
struct sockaddr_storage localaddr; struct sockaddr_storage localaddr;
struct sockaddr *addr = (struct sockaddr *)&localaddr; struct sockaddr_unsized *addr = (struct sockaddr_unsized *)&localaddr;
int i, addr_len, result = 0; int i, addr_len, result = 0;
for (i = 0; i < dlm_local_count; i++) { for (i = 0; i < dlm_local_count; i++) {
@ -1134,7 +1134,7 @@ static int sctp_bind_addrs(struct socket *sock, __be16 port)
make_sockaddr(&localaddr, port, &addr_len); make_sockaddr(&localaddr, port, &addr_len);
if (!i) if (!i)
result = kernel_bind(sock, (struct sockaddr_unsized *)addr, addr_len); result = kernel_bind(sock, addr, addr_len);
else else
result = sock_bind_add(sock->sk, addr, addr_len); result = sock_bind_add(sock->sk, addr, addr_len);

View File

@ -19,7 +19,6 @@ struct msghdr;
struct net; struct net;
struct page; struct page;
struct sock; struct sock;
struct sockaddr;
struct socket; struct socket;
int inet_release(struct socket *sock); int inet_release(struct socket *sock);
@ -43,7 +42,7 @@ int inet_listen(struct socket *sock, int backlog);
int __inet_listen_sk(struct sock *sk, int backlog); int __inet_listen_sk(struct sock *sk, int backlog);
void inet_sock_destruct(struct sock *sk); void inet_sock_destruct(struct sock *sk);
int inet_bind(struct socket *sock, struct sockaddr_unsized *uaddr, int addr_len); int inet_bind(struct socket *sock, struct sockaddr_unsized *uaddr, int addr_len);
int inet_bind_sk(struct sock *sk, struct sockaddr *uaddr, int addr_len); int inet_bind_sk(struct sock *sk, struct sockaddr_unsized *uaddr, int addr_len);
/* Don't allocate port at this moment, defer to connect. */ /* Don't allocate port at this moment, defer to connect. */
#define BIND_FORCE_ADDRESS_NO_PORT (1 << 0) #define BIND_FORCE_ADDRESS_NO_PORT (1 << 0)
/* Grab and release socket lock. */ /* Grab and release socket lock. */
@ -52,7 +51,7 @@ int inet_bind_sk(struct sock *sk, struct sockaddr *uaddr, int addr_len);
#define BIND_FROM_BPF (1 << 2) #define BIND_FROM_BPF (1 << 2)
/* Skip CAP_NET_BIND_SERVICE check. */ /* Skip CAP_NET_BIND_SERVICE check. */
#define BIND_NO_CAP_NET_BIND_SERVICE (1 << 3) #define BIND_NO_CAP_NET_BIND_SERVICE (1 << 3)
int __inet_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len, int __inet_bind(struct sock *sk, struct sockaddr_unsized *uaddr, int addr_len,
u32 flags); u32 flags);
int inet_getname(struct socket *sock, struct sockaddr *uaddr, int inet_getname(struct socket *sock, struct sockaddr *uaddr,
int peer); int peer);

View File

@ -261,8 +261,8 @@ static inline u8 ip_sendmsg_scope(const struct inet_sock *inet,
} }
/* datagram.c */ /* datagram.c */
int __ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len); int __ip4_datagram_connect(struct sock *sk, struct sockaddr_unsized *uaddr, int addr_len);
int ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len); int ip4_datagram_connect(struct sock *sk, struct sockaddr_unsized *uaddr, int addr_len);
void ip4_datagram_release_cb(struct sock *sk); void ip4_datagram_release_cb(struct sock *sk);

View File

@ -1188,10 +1188,10 @@ int do_ipv6_getsockopt(struct sock *sk, int level, int optname,
int ipv6_getsockopt(struct sock *sk, int level, int optname, int ipv6_getsockopt(struct sock *sk, int level, int optname,
char __user *optval, int __user *optlen); char __user *optval, int __user *optlen);
int __ip6_datagram_connect(struct sock *sk, struct sockaddr *addr, int __ip6_datagram_connect(struct sock *sk, struct sockaddr_unsized *addr,
int addr_len); int addr_len);
int ip6_datagram_connect(struct sock *sk, struct sockaddr *addr, int addr_len); int ip6_datagram_connect(struct sock *sk, struct sockaddr_unsized *addr, int addr_len);
int ip6_datagram_connect_v6_only(struct sock *sk, struct sockaddr *addr, int ip6_datagram_connect_v6_only(struct sock *sk, struct sockaddr_unsized *addr,
int addr_len); int addr_len);
int ip6_datagram_dst_update(struct sock *sk, bool fix_sk_saddr); int ip6_datagram_dst_update(struct sock *sk, bool fix_sk_saddr);
void ip6_datagram_release_cb(struct sock *sk); void ip6_datagram_release_cb(struct sock *sk);
@ -1209,7 +1209,7 @@ void inet6_cleanup_sock(struct sock *sk);
void inet6_sock_destruct(struct sock *sk); void inet6_sock_destruct(struct sock *sk);
int inet6_release(struct socket *sock); int inet6_release(struct socket *sock);
int inet6_bind(struct socket *sock, struct sockaddr_unsized *uaddr, int addr_len); int inet6_bind(struct socket *sock, struct sockaddr_unsized *uaddr, int addr_len);
int inet6_bind_sk(struct sock *sk, struct sockaddr *uaddr, int addr_len); int inet6_bind_sk(struct sock *sk, struct sockaddr_unsized *uaddr, int addr_len);
int inet6_getname(struct socket *sock, struct sockaddr *uaddr, int inet6_getname(struct socket *sock, struct sockaddr *uaddr,
int peer); int peer);
int inet6_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); int inet6_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);

View File

@ -80,7 +80,7 @@ extern const struct ipv6_stub *ipv6_stub __read_mostly;
/* A stub used by bpf helpers. Similarly ugly as ipv6_stub */ /* A stub used by bpf helpers. Similarly ugly as ipv6_stub */
struct ipv6_bpf_stub { struct ipv6_bpf_stub {
int (*inet6_bind)(struct sock *sk, struct sockaddr *uaddr, int addr_len, int (*inet6_bind)(struct sock *sk, struct sockaddr_unsized *uaddr, int addr_len,
u32 flags); u32 flags);
struct sock *(*udp6_lib_lookup)(const struct net *net, struct sock *(*udp6_lib_lookup)(const struct net *net,
const struct in6_addr *saddr, __be16 sport, const struct in6_addr *saddr, __be16 sport,

View File

@ -58,7 +58,7 @@ void ping_unhash(struct sock *sk);
int ping_init_sock(struct sock *sk); int ping_init_sock(struct sock *sk);
void ping_close(struct sock *sk, long timeout); void ping_close(struct sock *sk, long timeout);
int ping_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len); int ping_bind(struct sock *sk, struct sockaddr_unsized *uaddr, int addr_len);
void ping_err(struct sk_buff *skb, int offset, u32 info); void ping_err(struct sk_buff *skb, int offset, u32 info);
int ping_getfrag(void *from, char *to, int offset, int fraglen, int odd, int ping_getfrag(void *from, char *to, int offset, int fraglen, int odd,
struct sk_buff *); struct sk_buff *);

View File

@ -1274,10 +1274,10 @@ struct proto {
void (*close)(struct sock *sk, void (*close)(struct sock *sk,
long timeout); long timeout);
int (*pre_connect)(struct sock *sk, int (*pre_connect)(struct sock *sk,
struct sockaddr *uaddr, struct sockaddr_unsized *uaddr,
int addr_len); int addr_len);
int (*connect)(struct sock *sk, int (*connect)(struct sock *sk,
struct sockaddr *uaddr, struct sockaddr_unsized *uaddr,
int addr_len); int addr_len);
int (*disconnect)(struct sock *sk, int flags); int (*disconnect)(struct sock *sk, int flags);
@ -1306,9 +1306,9 @@ struct proto {
size_t len, int flags, int *addr_len); size_t len, int flags, int *addr_len);
void (*splice_eof)(struct socket *sock); void (*splice_eof)(struct socket *sock);
int (*bind)(struct sock *sk, int (*bind)(struct sock *sk,
struct sockaddr *addr, int addr_len); struct sockaddr_unsized *addr, int addr_len);
int (*bind_add)(struct sock *sk, int (*bind_add)(struct sock *sk,
struct sockaddr *addr, int addr_len); struct sockaddr_unsized *addr, int addr_len);
int (*backlog_rcv) (struct sock *sk, int (*backlog_rcv) (struct sock *sk,
struct sk_buff *skb); struct sk_buff *skb);
@ -3105,7 +3105,7 @@ void sock_set_reuseaddr(struct sock *sk);
void sock_set_reuseport(struct sock *sk); void sock_set_reuseport(struct sock *sk);
void sock_set_sndtimeo(struct sock *sk, s64 secs); void sock_set_sndtimeo(struct sock *sk, s64 secs);
int sock_bind_add(struct sock *sk, struct sockaddr *addr, int addr_len); int sock_bind_add(struct sock *sk, struct sockaddr_unsized *addr, int addr_len);
int sock_get_timeout(long timeo, void *optval, bool old_timeval); int sock_get_timeout(long timeo, void *optval, bool old_timeval);
int sock_copy_user_timeval(struct __kernel_sock_timeval *tv, int sock_copy_user_timeval(struct __kernel_sock_timeval *tv,

View File

@ -535,7 +535,7 @@ struct sock *tcp_v4_syn_recv_sock(const struct sock *sk, struct sk_buff *skb,
struct request_sock *req_unhash, struct request_sock *req_unhash,
bool *own_req); bool *own_req);
int tcp_v4_do_rcv(struct sock *sk, struct sk_buff *skb); int tcp_v4_do_rcv(struct sock *sk, struct sk_buff *skb);
int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len); int tcp_v4_connect(struct sock *sk, struct sockaddr_unsized *uaddr, int addr_len);
int tcp_connect(struct sock *sk); int tcp_connect(struct sock *sk);
enum tcp_synack_type { enum tcp_synack_type {
TCP_SYNACK_NORMAL, TCP_SYNACK_NORMAL,

View File

@ -424,7 +424,7 @@ void udp4_hwcsum(struct sk_buff *skb, __be32 src, __be32 dst);
int udp_rcv(struct sk_buff *skb); int udp_rcv(struct sk_buff *skb);
int udp_ioctl(struct sock *sk, int cmd, int *karg); int udp_ioctl(struct sock *sk, int cmd, int *karg);
int udp_init_sock(struct sock *sk); int udp_init_sock(struct sock *sk);
int udp_pre_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len); int udp_pre_connect(struct sock *sk, struct sockaddr_unsized *uaddr, int addr_len);
int __udp_disconnect(struct sock *sk, int flags); int __udp_disconnect(struct sock *sk, int flags);
int udp_disconnect(struct sock *sk, int flags); int udp_disconnect(struct sock *sk, int flags);
__poll_t udp_poll(struct file *file, struct socket *sock, poll_table *wait); __poll_t udp_poll(struct file *file, struct socket *sock, poll_table *wait);

View File

@ -5978,7 +5978,7 @@ BPF_CALL_3(bpf_bind, struct bpf_sock_addr_kern *, ctx, struct sockaddr *, addr,
return err; return err;
if (((struct sockaddr_in *)addr)->sin_port == htons(0)) if (((struct sockaddr_in *)addr)->sin_port == htons(0))
flags |= BIND_FORCE_ADDRESS_NO_PORT; flags |= BIND_FORCE_ADDRESS_NO_PORT;
return __inet_bind(sk, addr, addr_len, flags); return __inet_bind(sk, (struct sockaddr_unsized *)addr, addr_len, flags);
#if IS_ENABLED(CONFIG_IPV6) #if IS_ENABLED(CONFIG_IPV6)
} else if (addr->sa_family == AF_INET6) { } else if (addr->sa_family == AF_INET6) {
if (addr_len < SIN6_LEN_RFC2133) if (addr_len < SIN6_LEN_RFC2133)
@ -5988,7 +5988,8 @@ BPF_CALL_3(bpf_bind, struct bpf_sock_addr_kern *, ctx, struct sockaddr *, addr,
/* ipv6_bpf_stub cannot be NULL, since it's called from /* ipv6_bpf_stub cannot be NULL, since it's called from
* bpf_cgroup_inet6_connect hook and ipv6 is already loaded * bpf_cgroup_inet6_connect hook and ipv6 is already loaded
*/ */
return ipv6_bpf_stub->inet6_bind(sk, addr, addr_len, flags); return ipv6_bpf_stub->inet6_bind(sk, (struct sockaddr_unsized *)addr,
addr_len, flags);
#endif /* CONFIG_IPV6 */ #endif /* CONFIG_IPV6 */
} }
#endif /* CONFIG_INET */ #endif /* CONFIG_INET */

View File

@ -4395,7 +4395,7 @@ bool sk_busy_loop_end(void *p, unsigned long start_time)
EXPORT_SYMBOL(sk_busy_loop_end); EXPORT_SYMBOL(sk_busy_loop_end);
#endif /* CONFIG_NET_RX_BUSY_POLL */ #endif /* CONFIG_NET_RX_BUSY_POLL */
int sock_bind_add(struct sock *sk, struct sockaddr *addr, int addr_len) int sock_bind_add(struct sock *sk, struct sockaddr_unsized *addr, int addr_len)
{ {
if (!sk->sk_prot->bind_add) if (!sk->sk_prot->bind_add)
return -EOPNOTSUPP; return -EOPNOTSUPP;

View File

@ -102,7 +102,7 @@ static int ieee802154_sock_bind(struct socket *sock, struct sockaddr_unsized *ua
struct sock *sk = sock->sk; struct sock *sk = sock->sk;
if (sk->sk_prot->bind) if (sk->sk_prot->bind)
return sk->sk_prot->bind(sk, (struct sockaddr *)uaddr, addr_len); return sk->sk_prot->bind(sk, uaddr, addr_len);
return sock_no_bind(sock, uaddr, addr_len); return sock_no_bind(sock, uaddr, addr_len);
} }
@ -118,7 +118,7 @@ static int ieee802154_sock_connect(struct socket *sock, struct sockaddr_unsized
if (uaddr->sa_family == AF_UNSPEC) if (uaddr->sa_family == AF_UNSPEC)
return sk->sk_prot->disconnect(sk, flags); return sk->sk_prot->disconnect(sk, flags);
return sk->sk_prot->connect(sk, (struct sockaddr *)uaddr, addr_len); return sk->sk_prot->connect(sk, uaddr, addr_len);
} }
static int ieee802154_dev_ioctl(struct sock *sk, struct ifreq __user *arg, static int ieee802154_dev_ioctl(struct sock *sk, struct ifreq __user *arg,
@ -193,7 +193,7 @@ static void raw_close(struct sock *sk, long timeout)
sk_common_release(sk); sk_common_release(sk);
} }
static int raw_bind(struct sock *sk, struct sockaddr *_uaddr, int len) static int raw_bind(struct sock *sk, struct sockaddr_unsized *_uaddr, int len)
{ {
struct ieee802154_addr addr; struct ieee802154_addr addr;
struct sockaddr_ieee802154 *uaddr = (struct sockaddr_ieee802154 *)_uaddr; struct sockaddr_ieee802154 *uaddr = (struct sockaddr_ieee802154 *)_uaddr;
@ -227,7 +227,7 @@ static int raw_bind(struct sock *sk, struct sockaddr *_uaddr, int len)
return err; return err;
} }
static int raw_connect(struct sock *sk, struct sockaddr *uaddr, static int raw_connect(struct sock *sk, struct sockaddr_unsized *uaddr,
int addr_len) int addr_len)
{ {
return -ENOTSUPP; return -ENOTSUPP;
@ -485,7 +485,7 @@ static void dgram_close(struct sock *sk, long timeout)
sk_common_release(sk); sk_common_release(sk);
} }
static int dgram_bind(struct sock *sk, struct sockaddr *uaddr, int len) static int dgram_bind(struct sock *sk, struct sockaddr_unsized *uaddr, int len)
{ {
struct sockaddr_ieee802154 *addr = (struct sockaddr_ieee802154 *)uaddr; struct sockaddr_ieee802154 *addr = (struct sockaddr_ieee802154 *)uaddr;
struct ieee802154_addr haddr; struct ieee802154_addr haddr;
@ -563,7 +563,7 @@ static int dgram_ioctl(struct sock *sk, int cmd, int *karg)
} }
/* FIXME: autobind */ /* FIXME: autobind */
static int dgram_connect(struct sock *sk, struct sockaddr *uaddr, static int dgram_connect(struct sock *sk, struct sockaddr_unsized *uaddr,
int len) int len)
{ {
struct sockaddr_ieee802154 *addr = (struct sockaddr_ieee802154 *)uaddr; struct sockaddr_ieee802154 *addr = (struct sockaddr_ieee802154 *)uaddr;

View File

@ -441,7 +441,7 @@ int inet_release(struct socket *sock)
} }
EXPORT_SYMBOL(inet_release); EXPORT_SYMBOL(inet_release);
int inet_bind_sk(struct sock *sk, struct sockaddr *uaddr, int addr_len) int inet_bind_sk(struct sock *sk, struct sockaddr_unsized *uaddr, int addr_len)
{ {
u32 flags = BIND_WITH_LOCK; u32 flags = BIND_WITH_LOCK;
int err; int err;
@ -466,11 +466,11 @@ int inet_bind_sk(struct sock *sk, struct sockaddr *uaddr, int addr_len)
int inet_bind(struct socket *sock, struct sockaddr_unsized *uaddr, int addr_len) int inet_bind(struct socket *sock, struct sockaddr_unsized *uaddr, int addr_len)
{ {
return inet_bind_sk(sock->sk, (struct sockaddr *)uaddr, addr_len); return inet_bind_sk(sock->sk, uaddr, addr_len);
} }
EXPORT_SYMBOL(inet_bind); EXPORT_SYMBOL(inet_bind);
int __inet_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len, int __inet_bind(struct sock *sk, struct sockaddr_unsized *uaddr, int addr_len,
u32 flags) u32 flags)
{ {
struct sockaddr_in *addr = (struct sockaddr_in *)uaddr; struct sockaddr_in *addr = (struct sockaddr_in *)uaddr;
@ -584,14 +584,14 @@ int inet_dgram_connect(struct socket *sock, struct sockaddr_unsized *uaddr,
return prot->disconnect(sk, flags); return prot->disconnect(sk, flags);
if (BPF_CGROUP_PRE_CONNECT_ENABLED(sk)) { if (BPF_CGROUP_PRE_CONNECT_ENABLED(sk)) {
err = prot->pre_connect(sk, (struct sockaddr *)uaddr, addr_len); err = prot->pre_connect(sk, uaddr, addr_len);
if (err) if (err)
return err; return err;
} }
if (data_race(!inet_sk(sk)->inet_num) && inet_autobind(sk)) if (data_race(!inet_sk(sk)->inet_num) && inet_autobind(sk))
return -EAGAIN; return -EAGAIN;
return prot->connect(sk, (struct sockaddr *)uaddr, addr_len); return prot->connect(sk, uaddr, addr_len);
} }
EXPORT_SYMBOL(inet_dgram_connect); EXPORT_SYMBOL(inet_dgram_connect);
@ -671,12 +671,12 @@ int __inet_stream_connect(struct socket *sock, struct sockaddr_unsized *uaddr,
goto out; goto out;
if (BPF_CGROUP_PRE_CONNECT_ENABLED(sk)) { if (BPF_CGROUP_PRE_CONNECT_ENABLED(sk)) {
err = sk->sk_prot->pre_connect(sk, (struct sockaddr *)uaddr, addr_len); err = sk->sk_prot->pre_connect(sk, uaddr, addr_len);
if (err) if (err)
goto out; goto out;
} }
err = sk->sk_prot->connect(sk, (struct sockaddr *)uaddr, addr_len); err = sk->sk_prot->connect(sk, uaddr, addr_len);
if (err < 0) if (err < 0)
goto out; goto out;

View File

@ -16,7 +16,7 @@
#include <net/tcp_states.h> #include <net/tcp_states.h>
#include <net/sock_reuseport.h> #include <net/sock_reuseport.h>
int __ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) int __ip4_datagram_connect(struct sock *sk, struct sockaddr_unsized *uaddr, int addr_len)
{ {
struct inet_sock *inet = inet_sk(sk); struct inet_sock *inet = inet_sk(sk);
struct sockaddr_in *usin = (struct sockaddr_in *) uaddr; struct sockaddr_in *usin = (struct sockaddr_in *) uaddr;
@ -84,7 +84,7 @@ int __ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len
} }
EXPORT_SYMBOL(__ip4_datagram_connect); EXPORT_SYMBOL(__ip4_datagram_connect);
int ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) int ip4_datagram_connect(struct sock *sk, struct sockaddr_unsized *uaddr, int addr_len)
{ {
int res; int res;

View File

@ -286,7 +286,7 @@ void ping_close(struct sock *sk, long timeout)
} }
EXPORT_IPV6_MOD_GPL(ping_close); EXPORT_IPV6_MOD_GPL(ping_close);
static int ping_pre_connect(struct sock *sk, struct sockaddr *uaddr, static int ping_pre_connect(struct sock *sk, struct sockaddr_unsized *uaddr,
int addr_len) int addr_len)
{ {
/* This check is replicated from __ip4_datagram_connect() and /* This check is replicated from __ip4_datagram_connect() and
@ -301,7 +301,7 @@ static int ping_pre_connect(struct sock *sk, struct sockaddr *uaddr,
/* Checks the bind address and possibly modifies sk->sk_bound_dev_if. */ /* Checks the bind address and possibly modifies sk->sk_bound_dev_if. */
static int ping_check_bind_addr(struct sock *sk, struct inet_sock *isk, static int ping_check_bind_addr(struct sock *sk, struct inet_sock *isk,
struct sockaddr *uaddr, int addr_len) struct sockaddr_unsized *uaddr, int addr_len)
{ {
struct net *net = sock_net(sk); struct net *net = sock_net(sk);
if (sk->sk_family == AF_INET) { if (sk->sk_family == AF_INET) {
@ -387,7 +387,7 @@ static int ping_check_bind_addr(struct sock *sk, struct inet_sock *isk,
return 0; return 0;
} }
static void ping_set_saddr(struct sock *sk, struct sockaddr *saddr) static void ping_set_saddr(struct sock *sk, struct sockaddr_unsized *saddr)
{ {
if (saddr->sa_family == AF_INET) { if (saddr->sa_family == AF_INET) {
struct inet_sock *isk = inet_sk(sk); struct inet_sock *isk = inet_sk(sk);
@ -407,7 +407,7 @@ static void ping_set_saddr(struct sock *sk, struct sockaddr *saddr)
* Moreover, we don't allow binding to multi- and broadcast addresses. * Moreover, we don't allow binding to multi- and broadcast addresses.
*/ */
int ping_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len) int ping_bind(struct sock *sk, struct sockaddr_unsized *uaddr, int addr_len)
{ {
struct inet_sock *isk = inet_sk(sk); struct inet_sock *isk = inet_sk(sk);
unsigned short snum; unsigned short snum;

View File

@ -697,7 +697,8 @@ static void raw_destroy(struct sock *sk)
} }
/* This gets rid of all the nasties in af_inet. -DaveM */ /* This gets rid of all the nasties in af_inet. -DaveM */
static int raw_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len) static int raw_bind(struct sock *sk, struct sockaddr_unsized *uaddr,
int addr_len)
{ {
struct inet_sock *inet = inet_sk(sk); struct inet_sock *inet = inet_sk(sk);
struct sockaddr_in *addr = (struct sockaddr_in *) uaddr; struct sockaddr_in *addr = (struct sockaddr_in *) uaddr;

View File

@ -205,7 +205,7 @@ int tcp_twsk_unique(struct sock *sk, struct sock *sktw, void *twp)
} }
EXPORT_IPV6_MOD_GPL(tcp_twsk_unique); EXPORT_IPV6_MOD_GPL(tcp_twsk_unique);
static int tcp_v4_pre_connect(struct sock *sk, struct sockaddr *uaddr, static int tcp_v4_pre_connect(struct sock *sk, struct sockaddr_unsized *uaddr,
int addr_len) int addr_len)
{ {
/* This check is replicated from tcp_v4_connect() and intended to /* This check is replicated from tcp_v4_connect() and intended to
@ -221,7 +221,7 @@ static int tcp_v4_pre_connect(struct sock *sk, struct sockaddr *uaddr,
} }
/* This will initiate an outgoing connection. */ /* This will initiate an outgoing connection. */
int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) int tcp_v4_connect(struct sock *sk, struct sockaddr_unsized *uaddr, int addr_len)
{ {
struct sockaddr_in *usin = (struct sockaddr_in *)uaddr; struct sockaddr_in *usin = (struct sockaddr_in *)uaddr;
struct inet_timewait_death_row *tcp_death_row; struct inet_timewait_death_row *tcp_death_row;

View File

@ -2159,7 +2159,8 @@ int udp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int flags,
goto try_again; goto try_again;
} }
int udp_pre_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) int udp_pre_connect(struct sock *sk, struct sockaddr_unsized *uaddr,
int addr_len)
{ {
/* This check is replicated from __ip4_datagram_connect() and /* This check is replicated from __ip4_datagram_connect() and
* intended to prevent BPF program called below from accessing bytes * intended to prevent BPF program called below from accessing bytes
@ -2172,7 +2173,8 @@ int udp_pre_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
} }
EXPORT_IPV6_MOD(udp_pre_connect); EXPORT_IPV6_MOD(udp_pre_connect);
static int udp_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) static int udp_connect(struct sock *sk, struct sockaddr_unsized *uaddr,
int addr_len)
{ {
int res; int res;

View File

@ -277,7 +277,7 @@ static int inet6_create(struct net *net, struct socket *sock, int protocol,
goto out; goto out;
} }
static int __inet6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len, static int __inet6_bind(struct sock *sk, struct sockaddr_unsized *uaddr, int addr_len,
u32 flags) u32 flags)
{ {
struct sockaddr_in6 *addr = (struct sockaddr_in6 *)uaddr; struct sockaddr_in6 *addr = (struct sockaddr_in6 *)uaddr;
@ -438,7 +438,7 @@ static int __inet6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len,
goto out; goto out;
} }
int inet6_bind_sk(struct sock *sk, struct sockaddr *uaddr, int addr_len) int inet6_bind_sk(struct sock *sk, struct sockaddr_unsized *uaddr, int addr_len)
{ {
u32 flags = BIND_WITH_LOCK; u32 flags = BIND_WITH_LOCK;
const struct proto *prot; const struct proto *prot;
@ -467,7 +467,7 @@ int inet6_bind_sk(struct sock *sk, struct sockaddr *uaddr, int addr_len)
/* bind for INET6 API */ /* bind for INET6 API */
int inet6_bind(struct socket *sock, struct sockaddr_unsized *uaddr, int addr_len) int inet6_bind(struct socket *sock, struct sockaddr_unsized *uaddr, int addr_len)
{ {
return inet6_bind_sk(sock->sk, (struct sockaddr *)uaddr, addr_len); return inet6_bind_sk(sock->sk, uaddr, addr_len);
} }
EXPORT_SYMBOL(inet6_bind); EXPORT_SYMBOL(inet6_bind);

View File

@ -138,7 +138,7 @@ void ip6_datagram_release_cb(struct sock *sk)
} }
EXPORT_SYMBOL_GPL(ip6_datagram_release_cb); EXPORT_SYMBOL_GPL(ip6_datagram_release_cb);
int __ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int __ip6_datagram_connect(struct sock *sk, struct sockaddr_unsized *uaddr,
int addr_len) int addr_len)
{ {
struct sockaddr_in6 *usin = (struct sockaddr_in6 *) uaddr; struct sockaddr_in6 *usin = (struct sockaddr_in6 *) uaddr;
@ -194,7 +194,7 @@ int __ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr,
sin.sin_port = usin->sin6_port; sin.sin_port = usin->sin6_port;
err = __ip4_datagram_connect(sk, err = __ip4_datagram_connect(sk,
(struct sockaddr *) &sin, (struct sockaddr_unsized *)&sin,
sizeof(sin)); sizeof(sin));
ipv4_connected: ipv4_connected:
@ -271,7 +271,7 @@ int __ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr,
} }
EXPORT_SYMBOL_GPL(__ip6_datagram_connect); EXPORT_SYMBOL_GPL(__ip6_datagram_connect);
int ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) int ip6_datagram_connect(struct sock *sk, struct sockaddr_unsized *uaddr, int addr_len)
{ {
int res; int res;
@ -282,7 +282,7 @@ int ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
} }
EXPORT_SYMBOL_GPL(ip6_datagram_connect); EXPORT_SYMBOL_GPL(ip6_datagram_connect);
int ip6_datagram_connect_v6_only(struct sock *sk, struct sockaddr *uaddr, int ip6_datagram_connect_v6_only(struct sock *sk, struct sockaddr_unsized *uaddr,
int addr_len) int addr_len)
{ {
DECLARE_SOCKADDR(struct sockaddr_in6 *, sin6, uaddr); DECLARE_SOCKADDR(struct sockaddr_in6 *, sin6, uaddr);

View File

@ -45,7 +45,7 @@ static int dummy_ipv6_chk_addr(struct net *net, const struct in6_addr *addr,
return 0; return 0;
} }
static int ping_v6_pre_connect(struct sock *sk, struct sockaddr *uaddr, static int ping_v6_pre_connect(struct sock *sk, struct sockaddr_unsized *uaddr,
int addr_len) int addr_len)
{ {
/* This check is replicated from __ip6_datagram_connect() and /* This check is replicated from __ip6_datagram_connect() and

View File

@ -214,7 +214,8 @@ bool raw6_local_deliver(struct sk_buff *skb, int nexthdr)
} }
/* This cleans up af_inet6 a bit. -DaveM */ /* This cleans up af_inet6 a bit. -DaveM */
static int rawv6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len) static int rawv6_bind(struct sock *sk, struct sockaddr_unsized *uaddr,
int addr_len)
{ {
struct inet_sock *inet = inet_sk(sk); struct inet_sock *inet = inet_sk(sk);
struct ipv6_pinfo *np = inet6_sk(sk); struct ipv6_pinfo *np = inet6_sk(sk);

View File

@ -118,7 +118,7 @@ static u32 tcp_v6_init_ts_off(const struct net *net, const struct sk_buff *skb)
ipv6_hdr(skb)->saddr.s6_addr32); ipv6_hdr(skb)->saddr.s6_addr32);
} }
static int tcp_v6_pre_connect(struct sock *sk, struct sockaddr *uaddr, static int tcp_v6_pre_connect(struct sock *sk, struct sockaddr_unsized *uaddr,
int addr_len) int addr_len)
{ {
/* This check is replicated from tcp_v6_connect() and intended to /* This check is replicated from tcp_v6_connect() and intended to
@ -133,7 +133,7 @@ static int tcp_v6_pre_connect(struct sock *sk, struct sockaddr *uaddr,
return BPF_CGROUP_RUN_PROG_INET6_CONNECT(sk, uaddr, &addr_len); return BPF_CGROUP_RUN_PROG_INET6_CONNECT(sk, uaddr, &addr_len);
} }
static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr, static int tcp_v6_connect(struct sock *sk, struct sockaddr_unsized *uaddr,
int addr_len) int addr_len)
{ {
struct sockaddr_in6 *usin = (struct sockaddr_in6 *) uaddr; struct sockaddr_in6 *usin = (struct sockaddr_in6 *) uaddr;
@ -238,7 +238,7 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
tp->af_specific = &tcp_sock_ipv6_mapped_specific; tp->af_specific = &tcp_sock_ipv6_mapped_specific;
#endif #endif
err = tcp_v4_connect(sk, (struct sockaddr *)&sin, sizeof(sin)); err = tcp_v4_connect(sk, (struct sockaddr_unsized *)&sin, sizeof(sin));
if (err) { if (err) {
icsk->icsk_ext_hdr_len = exthdrlen; icsk->icsk_ext_hdr_len = exthdrlen;

View File

@ -1282,7 +1282,7 @@ static void udp_v6_flush_pending_frames(struct sock *sk)
} }
} }
static int udpv6_pre_connect(struct sock *sk, struct sockaddr *uaddr, static int udpv6_pre_connect(struct sock *sk, struct sockaddr_unsized *uaddr,
int addr_len) int addr_len)
{ {
if (addr_len < offsetofend(struct sockaddr, sa_family)) if (addr_len < offsetofend(struct sockaddr, sa_family))
@ -1303,7 +1303,8 @@ static int udpv6_pre_connect(struct sock *sk, struct sockaddr *uaddr,
return BPF_CGROUP_RUN_PROG_INET6_CONNECT_LOCK(sk, uaddr, &addr_len); return BPF_CGROUP_RUN_PROG_INET6_CONNECT_LOCK(sk, uaddr, &addr_len);
} }
static int udpv6_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) static int udpv6_connect(struct sock *sk, struct sockaddr_unsized *uaddr,
int addr_len)
{ {
int res; int res;

View File

@ -267,7 +267,8 @@ static void l2tp_ip_destroy_sock(struct sock *sk)
} }
} }
static int l2tp_ip_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len) static int l2tp_ip_bind(struct sock *sk, struct sockaddr_unsized *uaddr,
int addr_len)
{ {
struct inet_sock *inet = inet_sk(sk); struct inet_sock *inet = inet_sk(sk);
struct sockaddr_l2tpip *addr = (struct sockaddr_l2tpip *)uaddr; struct sockaddr_l2tpip *addr = (struct sockaddr_l2tpip *)uaddr;
@ -328,7 +329,8 @@ static int l2tp_ip_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
return ret; return ret;
} }
static int l2tp_ip_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) static int l2tp_ip_connect(struct sock *sk, struct sockaddr_unsized *uaddr,
int addr_len)
{ {
struct sockaddr_l2tpip *lsa = (struct sockaddr_l2tpip *)uaddr; struct sockaddr_l2tpip *lsa = (struct sockaddr_l2tpip *)uaddr;
struct l2tp_ip_net *pn = l2tp_ip_pernet(sock_net(sk)); struct l2tp_ip_net *pn = l2tp_ip_pernet(sock_net(sk));

View File

@ -280,7 +280,8 @@ static void l2tp_ip6_destroy_sock(struct sock *sk)
} }
} }
static int l2tp_ip6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len) static int l2tp_ip6_bind(struct sock *sk, struct sockaddr_unsized *uaddr,
int addr_len)
{ {
struct inet_sock *inet = inet_sk(sk); struct inet_sock *inet = inet_sk(sk);
struct ipv6_pinfo *np = inet6_sk(sk); struct ipv6_pinfo *np = inet6_sk(sk);
@ -383,7 +384,7 @@ static int l2tp_ip6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
return err; return err;
} }
static int l2tp_ip6_connect(struct sock *sk, struct sockaddr *uaddr, static int l2tp_ip6_connect(struct sock *sk, struct sockaddr_unsized *uaddr,
int addr_len) int addr_len)
{ {
struct sockaddr_l2tpip6 *lsa = (struct sockaddr_l2tpip6 *)uaddr; struct sockaddr_l2tpip6 *lsa = (struct sockaddr_l2tpip6 *)uaddr;

View File

@ -867,10 +867,10 @@ static int mptcp_pm_nl_create_listen_socket(struct sock *sk,
addrlen = sizeof(struct sockaddr_in6); addrlen = sizeof(struct sockaddr_in6);
#endif #endif
if (ssk->sk_family == AF_INET) if (ssk->sk_family == AF_INET)
err = inet_bind_sk(ssk, (struct sockaddr *)&addr, addrlen); err = inet_bind_sk(ssk, (struct sockaddr_unsized *)&addr, addrlen);
#if IS_ENABLED(CONFIG_MPTCP_IPV6) #if IS_ENABLED(CONFIG_MPTCP_IPV6)
else if (ssk->sk_family == AF_INET6) else if (ssk->sk_family == AF_INET6)
err = inet6_bind_sk(ssk, (struct sockaddr *)&addr, addrlen); err = inet6_bind_sk(ssk, (struct sockaddr_unsized *)&addr, addrlen);
#endif #endif
if (err) if (err)
return err; return err;

View File

@ -3746,7 +3746,8 @@ static int mptcp_ioctl(struct sock *sk, int cmd, int *karg)
return 0; return 0;
} }
static int mptcp_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) static int mptcp_connect(struct sock *sk, struct sockaddr_unsized *uaddr,
int addr_len)
{ {
struct mptcp_subflow_context *subflow; struct mptcp_subflow_context *subflow;
struct mptcp_sock *msk = mptcp_sk(sk); struct mptcp_sock *msk = mptcp_sk(sk);
@ -3870,10 +3871,10 @@ static int mptcp_bind(struct socket *sock, struct sockaddr_unsized *uaddr, int a
} }
if (sk->sk_family == AF_INET) if (sk->sk_family == AF_INET)
err = inet_bind_sk(ssk, (struct sockaddr *)uaddr, addr_len); err = inet_bind_sk(ssk, uaddr, addr_len);
#if IS_ENABLED(CONFIG_MPTCP_IPV6) #if IS_ENABLED(CONFIG_MPTCP_IPV6)
else if (sk->sk_family == AF_INET6) else if (sk->sk_family == AF_INET6)
err = inet6_bind_sk(ssk, (struct sockaddr *)uaddr, addr_len); err = inet6_bind_sk(ssk, uaddr, addr_len);
#endif #endif
if (!err) if (!err)
mptcp_copy_inaddrs(sk, ssk); mptcp_copy_inaddrs(sk, ssk);

View File

@ -882,7 +882,8 @@ static struct sock *pep_sock_accept(struct sock *sk,
return newsk; return newsk;
} }
static int pep_sock_connect(struct sock *sk, struct sockaddr *addr, int len) static int pep_sock_connect(struct sock *sk, struct sockaddr_unsized *addr,
int len)
{ {
struct pep_sock *pn = pep_sk(sk); struct pep_sock *pn = pep_sk(sk);
int err; int err;

View File

@ -163,7 +163,7 @@ static int pn_socket_bind(struct socket *sock, struct sockaddr_unsized *addr, in
u8 saddr; u8 saddr;
if (sk->sk_prot->bind) if (sk->sk_prot->bind)
return sk->sk_prot->bind(sk, (struct sockaddr *)addr, len); return sk->sk_prot->bind(sk, addr, len);
if (len < sizeof(struct sockaddr_pn)) if (len < sizeof(struct sockaddr_pn))
return -EINVAL; return -EINVAL;
@ -252,7 +252,7 @@ static int pn_socket_connect(struct socket *sock, struct sockaddr_unsized *addr,
pn->resource = pn_sockaddr_get_resource(spn); pn->resource = pn_sockaddr_get_resource(spn);
sock->state = SS_CONNECTING; sock->state = SS_CONNECTING;
err = sk->sk_prot->connect(sk, (struct sockaddr *)addr, len); err = sk->sk_prot->connect(sk, addr, len);
if (err) { if (err) {
sock->state = SS_UNCONNECTED; sock->state = SS_UNCONNECTED;
pn->dobject = 0; pn->dobject = 0;

View File

@ -306,7 +306,8 @@ static struct sctp_transport *sctp_addr_id2transport(struct sock *sk,
* sockaddr_in6 [RFC 2553]), * sockaddr_in6 [RFC 2553]),
* addr_len - the size of the address structure. * addr_len - the size of the address structure.
*/ */
static int sctp_bind(struct sock *sk, struct sockaddr *addr, int addr_len) static int sctp_bind(struct sock *sk, struct sockaddr_unsized *addr,
int addr_len)
{ {
int retval = 0; int retval = 0;
@ -1053,13 +1054,13 @@ static int sctp_setsockopt_bindx(struct sock *sk, struct sockaddr *addrs,
} }
} }
static int sctp_bind_add(struct sock *sk, struct sockaddr *addrs, static int sctp_bind_add(struct sock *sk, struct sockaddr_unsized *addrs,
int addrlen) int addrlen)
{ {
int err; int err;
lock_sock(sk); lock_sock(sk);
err = sctp_setsockopt_bindx(sk, addrs, addrlen, SCTP_BINDX_ADD_ADDR); err = sctp_setsockopt_bindx(sk, (struct sockaddr *)addrs, addrlen, SCTP_BINDX_ADD_ADDR);
release_sock(sk); release_sock(sk);
return err; return err;
} }