]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: Convert proto callbacks from sockaddr to sockaddr_unsized
authorKees Cook <kees@kernel.org>
Tue, 4 Nov 2025 00:26:13 +0000 (16:26 -0800)
committerJakub Kicinski <kuba@kernel.org>
Wed, 5 Nov 2025 03:10:33 +0000 (19:10 -0800)
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>
31 files changed:
fs/dlm/lowcomms.c
include/net/inet_common.h
include/net/ip.h
include/net/ipv6.h
include/net/ipv6_stubs.h
include/net/ping.h
include/net/sock.h
include/net/tcp.h
include/net/udp.h
net/core/filter.c
net/core/sock.c
net/ieee802154/socket.c
net/ipv4/af_inet.c
net/ipv4/datagram.c
net/ipv4/ping.c
net/ipv4/raw.c
net/ipv4/tcp_ipv4.c
net/ipv4/udp.c
net/ipv6/af_inet6.c
net/ipv6/datagram.c
net/ipv6/ping.c
net/ipv6/raw.c
net/ipv6/tcp_ipv6.c
net/ipv6/udp.c
net/l2tp/l2tp_ip.c
net/l2tp/l2tp_ip6.c
net/mptcp/pm_kernel.c
net/mptcp/protocol.c
net/phonet/pep.c
net/phonet/socket.c
net/sctp/socket.c

index f832dafdaca82fdfeb3107ab7315a9be4dbe02fa..b3958008ba3f7c396b9625daca18d5bc43902cb4 100644 (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)
 {
        struct sockaddr_storage localaddr;
-       struct sockaddr *addr = (struct sockaddr *)&localaddr;
+       struct sockaddr_unsized *addr = (struct sockaddr_unsized *)&localaddr;
        int i, addr_len, result = 0;
 
        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);
 
                if (!i)
-                       result = kernel_bind(sock, (struct sockaddr_unsized *)addr, addr_len);
+                       result = kernel_bind(sock, addr, addr_len);
                else
                        result = sock_bind_add(sock->sk, addr, addr_len);
 
index ebafd96912bb1a5373729eea40fef1751b452b96..5dd2bf24449efece6158636989ae15bbf8457372 100644 (file)
@@ -19,7 +19,6 @@ struct msghdr;
 struct net;
 struct page;
 struct sock;
-struct sockaddr;
 struct socket;
 
 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);
 void inet_sock_destruct(struct sock *sk);
 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. */
 #define BIND_FORCE_ADDRESS_NO_PORT     (1 << 0)
 /* 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)
 /* Skip CAP_NET_BIND_SERVICE check. */
 #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);
 int inet_getname(struct socket *sock, struct sockaddr *uaddr,
                 int peer);
index 380afb691c419ae71aa56ea64287eb4a1ac5fd39..69d5cef460040558529e1fdd3e9336986e843362 100644 (file)
@@ -261,8 +261,8 @@ static inline u8 ip_sendmsg_scope(const struct inet_sock *inet,
 }
 
 /* datagram.c */
-int __ip4_datagram_connect(struct sock *sk, struct sockaddr *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);
+int ip4_datagram_connect(struct sock *sk, struct sockaddr_unsized *uaddr, int addr_len);
 
 void ip4_datagram_release_cb(struct sock *sk);
 
index 2188bad9a687d68b32b53bb55041a9d3d3b7efc5..74fbf1ad8065a6596487b72af70131919a26c5a2 100644 (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,
                    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 ip6_datagram_connect(struct sock *sk, struct sockaddr *addr, int addr_len);
-int ip6_datagram_connect_v6_only(struct sock *sk, struct sockaddr *addr,
+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_unsized *addr,
                                 int addr_len);
 int ip6_datagram_dst_update(struct sock *sk, bool fix_sk_saddr);
 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);
 int inet6_release(struct socket *sock);
 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 peer);
 int inet6_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);
index 8a3465c8c2c5ce810ab2cd0b5008f63ee2aa0f37..d3013e721b1441158e732b04d94078c0a7e9aa6a 100644 (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 */
 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);
        struct sock *(*udp6_lib_lookup)(const struct net *net,
                                     const struct in6_addr *saddr, __be16 sport,
index 9634b8800814dae4568e86fdf917bbe41d429b4b..05bfd594a64c0e669f81227b796d0a48cea9bfcc 100644 (file)
@@ -58,7 +58,7 @@ void ping_unhash(struct sock *sk);
 
 int  ping_init_sock(struct sock *sk);
 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);
 int  ping_getfrag(void *from, char *to, int offset, int fraglen, int odd,
                  struct sk_buff *);
index 589fbce77217c0c092f962b8d04cf981368fe230..a5f36ea9d46f05970e36e3dc6c10051e5b0ecd42 100644 (file)
@@ -1274,10 +1274,10 @@ struct proto {
        void                    (*close)(struct sock *sk,
                                        long timeout);
        int                     (*pre_connect)(struct sock *sk,
-                                       struct sockaddr *uaddr,
+                                       struct sockaddr_unsized *uaddr,
                                        int addr_len);
        int                     (*connect)(struct sock *sk,
-                                       struct sockaddr *uaddr,
+                                       struct sockaddr_unsized *uaddr,
                                        int addr_len);
        int                     (*disconnect)(struct sock *sk, int flags);
 
@@ -1306,9 +1306,9 @@ struct proto {
                                           size_t len, int flags, int *addr_len);
        void                    (*splice_eof)(struct socket *sock);
        int                     (*bind)(struct sock *sk,
-                                       struct sockaddr *addr, int addr_len);
+                                       struct sockaddr_unsized *addr, int addr_len);
        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,
                                                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_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_copy_user_timeval(struct __kernel_sock_timeval *tv,
index 4fd6d8d1230d0ce9f40b28a2cad10a5c8a1f9716..0aa1f07d036a6b4e72e49609c9ad830026fc66ee 100644 (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,
                                  bool *own_req);
 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);
 enum tcp_synack_type {
        TCP_SYNACK_NORMAL,
index cffedb3e40f24513e44fb7598c0ad917fd15b616..a061d1b22ddc2fcf8ac62eccdf22512d63848838 100644 (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_ioctl(struct sock *sk, int cmd, int *karg);
 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);
 __poll_t udp_poll(struct file *file, struct socket *sock, poll_table *wait);
index 16105f52927daa47cdeec1852072659b408a8a8f..90273da748073720e93a88dde987ea67f1f66d6b 100644 (file)
@@ -5978,7 +5978,7 @@ BPF_CALL_3(bpf_bind, struct bpf_sock_addr_kern *, ctx, struct sockaddr *, addr,
                        return err;
                if (((struct sockaddr_in *)addr)->sin_port == htons(0))
                        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)
        } else if (addr->sa_family == AF_INET6) {
                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
                 * 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_INET */
index f97a0e95899146789534dad8363e926c888d418f..3b74fc71f51c13547591c4e8524d0475fcb27c8e 100644 (file)
@@ -4395,7 +4395,7 @@ bool sk_busy_loop_end(void *p, unsigned long start_time)
 EXPORT_SYMBOL(sk_busy_loop_end);
 #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)
                return -EOPNOTSUPP;
index b93fd85f248a67c90e0096806a2718873dfee4ad..e542fbe113e7be2aaf829b038ee15d2c0c8bc612 100644 (file)
@@ -102,7 +102,7 @@ static int ieee802154_sock_bind(struct socket *sock, struct sockaddr_unsized *ua
        struct sock *sk = sock->sk;
 
        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);
 }
@@ -118,7 +118,7 @@ static int ieee802154_sock_connect(struct socket *sock, struct sockaddr_unsized
        if (uaddr->sa_family == AF_UNSPEC)
                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,
@@ -193,7 +193,7 @@ static void raw_close(struct sock *sk, long timeout)
        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 sockaddr_ieee802154 *uaddr = (struct sockaddr_ieee802154 *)_uaddr;
@@ -227,7 +227,7 @@ out:
        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)
 {
        return -ENOTSUPP;
@@ -485,7 +485,7 @@ static void dgram_close(struct sock *sk, long timeout)
        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 ieee802154_addr haddr;
@@ -563,7 +563,7 @@ static int dgram_ioctl(struct sock *sk, int cmd, int *karg)
 }
 
 /* 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)
 {
        struct sockaddr_ieee802154 *addr = (struct sockaddr_ieee802154 *)uaddr;
index 0844de9ac6a48b2137766a1c5c01880277607c0c..d5ac089356ebc94f3efe83f2a0b88abf9adfcb2e 100644 (file)
@@ -441,7 +441,7 @@ int inet_release(struct socket *sock)
 }
 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;
        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)
 {
-       return inet_bind_sk(sock->sk, (struct sockaddr *)uaddr, addr_len);
+       return inet_bind_sk(sock->sk, uaddr, addr_len);
 }
 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)
 {
        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);
 
        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)
                        return err;
        }
 
        if (data_race(!inet_sk(sk)->inet_num) && inet_autobind(sk))
                return -EAGAIN;
-       return prot->connect(sk, (struct sockaddr *)uaddr, addr_len);
+       return prot->connect(sk, uaddr, addr_len);
 }
 EXPORT_SYMBOL(inet_dgram_connect);
 
@@ -671,12 +671,12 @@ int __inet_stream_connect(struct socket *sock, struct sockaddr_unsized *uaddr,
                        goto out;
 
                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)
                                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)
                        goto out;
 
index c2b2cda1a7e50668ad8fb6852b5e76b173139c34..1614593b6d727000adb9b0ab9a136b4aac050317 100644 (file)
@@ -16,7 +16,7 @@
 #include <net/tcp_states.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 sockaddr_in *usin = (struct sockaddr_in *) uaddr;
@@ -84,7 +84,7 @@ out:
 }
 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;
 
index 5321c5801c64dd2c20ba94fdcb5a677da4be02d7..ad56588107cc8fb15fa1ff3d56046239a88781e3 100644 (file)
@@ -286,7 +286,7 @@ void ping_close(struct sock *sk, long timeout)
 }
 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)
 {
        /* 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. */
 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);
        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;
 }
 
-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) {
                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.
  */
 
-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);
        unsigned short snum;
index d54ebb7df966d561c8f29b390212a4e6140dcada..5998c4cc6f47b39f343cb1b0a9bd688b9d150281 100644 (file)
@@ -697,7 +697,8 @@ static void raw_destroy(struct sock *sk)
 }
 
 /* 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 sockaddr_in *addr = (struct sockaddr_in *) uaddr;
index 40a76da5364a1ccdef521f3d8bb3bcc2c8aff053..b7526a7888cbe296c0f4ba6350772741cfe1765b 100644 (file)
@@ -205,7 +205,7 @@ int tcp_twsk_unique(struct sock *sk, struct sock *sktw, void *twp)
 }
 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)
 {
        /* 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. */
-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 inet_timewait_death_row *tcp_death_row;
index 30dfbf73729dad1e7b26c74a4791fe0a82682a6d..ffe074cb58658741f3cf2037cff9ea79e7f92742 100644 (file)
@@ -2159,7 +2159,8 @@ csum_copy_err:
        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
         * 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);
 
-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;
 
index c92d27e35fbcca7b189a384a227b7a7b7ed2b273..b705751eb73c6b784b74f40ab3d7c0933f8259f0 100644 (file)
@@ -277,7 +277,7 @@ out_sk_release:
        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)
 {
        struct sockaddr_in6 *addr = (struct sockaddr_in6 *)uaddr;
@@ -438,7 +438,7 @@ out_unlock:
        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;
        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 */
 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);
 
index 33ebe93d80e3cb6d897a3c7f714f94c395856023..83e03176819ce940b3a84b2dd91f273490fcc017 100644 (file)
@@ -138,7 +138,7 @@ void ip6_datagram_release_cb(struct sock *sk)
 }
 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)
 {
        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;
 
                err = __ip4_datagram_connect(sk,
-                                            (struct sockaddr *) &sin,
+                                            (struct sockaddr_unsized *)&sin,
                                             sizeof(sin));
 
 ipv4_connected:
@@ -271,7 +271,7 @@ out:
 }
 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;
 
@@ -282,7 +282,7 @@ int ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
 }
 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)
 {
        DECLARE_SOCKADDR(struct sockaddr_in6 *, sin6, uaddr);
index d7a2cdaa26312b44f1fe502d3d40f3e27f961fa8..e4afc651731a3f27f8f930c99cb5ce4acbb1b5cb 100644 (file)
@@ -45,7 +45,7 @@ static int dummy_ipv6_chk_addr(struct net *net, const struct in6_addr *addr,
        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)
 {
        /* This check is replicated from __ip6_datagram_connect() and
index e369f54844dd9456a819db77435eaef33d162932..b4cd05dba9b6d209bfb1024b7e1b0c703f906e5b 100644 (file)
@@ -214,7 +214,8 @@ bool raw6_local_deliver(struct sk_buff *skb, int nexthdr)
 }
 
 /* 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 ipv6_pinfo *np = inet6_sk(sk);
index 06eb90e4078e563bb4c7b5ed95980d70c643414a..7df21c1cba21358b7da1a88400d998e915d0dd39 100644 (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);
 }
 
-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)
 {
        /* 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);
 }
 
-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)
 {
        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;
 #endif
 
-               err = tcp_v4_connect(sk, (struct sockaddr *)&sin, sizeof(sin));
+               err = tcp_v4_connect(sk, (struct sockaddr_unsized *)&sin, sizeof(sin));
 
                if (err) {
                        icsk->icsk_ext_hdr_len = exthdrlen;
index 813a2ba75824d14631642bf6973f65063b2825cb..794c13674e8ab8aa552bdbd90203f9591016cb66 100644 (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)
 {
        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);
 }
 
-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;
 
index 29795d2839e8b00ece63e6e71fa83d53e34f9dda..cac1ff59cb83fbecf9302d1afb0cb39784fac701 100644 (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 sockaddr_l2tpip *addr = (struct sockaddr_l2tpip *)uaddr;
@@ -328,7 +329,8 @@ out:
        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 l2tp_ip_net *pn = l2tp_ip_pernet(sock_net(sk));
index ea232f338dcb65d1905f842b907d2cb8230f2f6b..05a396ba6a3eb64d0985595af2a2ab76e074ca37 100644 (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 ipv6_pinfo *np = inet6_sk(sk);
@@ -383,7 +384,7 @@ out_unlock:
        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)
 {
        struct sockaddr_l2tpip6 *lsa = (struct sockaddr_l2tpip6 *)uaddr;
index e50721c670d0027d7d665deafcb3bffe4d644080..598f01a573c1b9ae8de0f5abe5cb0a56d8a20520 100644 (file)
@@ -867,10 +867,10 @@ static int mptcp_pm_nl_create_listen_socket(struct sock *sk,
                addrlen = sizeof(struct sockaddr_in6);
 #endif
        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)
        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
        if (err)
                return err;
index 53e2b095dfb12f4837061d6bcfc69e03242a5e20..4cd5df01446e314fc3c9fc4cd19cd0add803ecdd 100644 (file)
@@ -3746,7 +3746,8 @@ static int mptcp_ioctl(struct sock *sk, int cmd, int *karg)
        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_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)
-               err = inet_bind_sk(ssk, (struct sockaddr *)uaddr, addr_len);
+               err = inet_bind_sk(ssk, uaddr, addr_len);
 #if IS_ENABLED(CONFIG_MPTCP_IPV6)
        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
        if (!err)
                mptcp_copy_inaddrs(sk, ssk);
index 4db564d9d522b639e9527d48eaa42a1cd9fbfba7..120e711ea78cbda8bd0e10a096bdefbe43f82763 100644 (file)
@@ -882,7 +882,8 @@ drop:
        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);
        int err;
index 9391378083a410252988f6474e46d35b783fc169..4423d483c630adc93af07e0c23a78800b696d4a4 100644 (file)
@@ -163,7 +163,7 @@ static int pn_socket_bind(struct socket *sock, struct sockaddr_unsized *addr, in
        u8 saddr;
 
        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))
                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);
        sock->state = SS_CONNECTING;
 
-       err = sk->sk_prot->connect(sk, (struct sockaddr *)addr, len);
+       err = sk->sk_prot->connect(sk, addr, len);
        if (err) {
                sock->state = SS_UNCONNECTED;
                pn->dobject = 0;
index 940abbced191d42b32c0de45a5207a158488992a..38d2932acebfcfae506dc655753ceb1f7cf9b871 100644 (file)
@@ -306,7 +306,8 @@ static struct sctp_transport *sctp_addr_id2transport(struct sock *sk,
  *             sockaddr_in6 [RFC 2553]),
  *   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;
 
@@ -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,
-               int addrlen)
+static int sctp_bind_add(struct sock *sk, struct sockaddr_unsized *addrs,
+                        int addrlen)
 {
        int err;
 
        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);
        return err;
 }