Skip to content

Commit 01a8715

Browse files
keesKernel Patches Daemon
authored andcommitted
net: Convert proto callbacks from sockaddr to sockaddr_unspec
Convert struct proto pre_connect(), connect(), bind(), and bind_add() callback function prototypes from struct sockaddr to struct sockaddr_unspec. 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 <[email protected]>
1 parent 43f5494 commit 01a8715

File tree

31 files changed

+88
-77
lines changed

31 files changed

+88
-77
lines changed

fs/dlm/lowcomms.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1126,15 +1126,15 @@ static void writequeue_entry_complete(struct writequeue_entry *e, int completed)
11261126
static int sctp_bind_addrs(struct socket *sock, __be16 port)
11271127
{
11281128
struct sockaddr_storage localaddr;
1129-
struct sockaddr *addr = (struct sockaddr *)&localaddr;
1129+
struct sockaddr_unspec *addr = (struct sockaddr_unspec *)&localaddr;
11301130
int i, addr_len, result = 0;
11311131

11321132
for (i = 0; i < dlm_local_count; i++) {
11331133
memcpy(&localaddr, &dlm_local_addr[i], sizeof(localaddr));
11341134
make_sockaddr(&localaddr, port, &addr_len);
11351135

11361136
if (!i)
1137-
result = kernel_bind(sock, (struct sockaddr_unspec *)addr, addr_len);
1137+
result = kernel_bind(sock, addr, addr_len);
11381138
else
11391139
result = sock_bind_add(sock->sk, addr, addr_len);
11401140

include/net/inet_common.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ struct msghdr;
1919
struct net;
2020
struct page;
2121
struct sock;
22-
struct sockaddr;
2322
struct socket;
2423

2524
int inet_release(struct socket *sock);
@@ -43,7 +42,7 @@ int inet_listen(struct socket *sock, int backlog);
4342
int __inet_listen_sk(struct sock *sk, int backlog);
4443
void inet_sock_destruct(struct sock *sk);
4544
int inet_bind(struct socket *sock, struct sockaddr_unspec *uaddr, int addr_len);
46-
int inet_bind_sk(struct sock *sk, struct sockaddr *uaddr, int addr_len);
45+
int inet_bind_sk(struct sock *sk, struct sockaddr_unspec *uaddr, int addr_len);
4746
/* Don't allocate port at this moment, defer to connect. */
4847
#define BIND_FORCE_ADDRESS_NO_PORT (1 << 0)
4948
/* Grab and release socket lock. */
@@ -52,7 +51,7 @@ int inet_bind_sk(struct sock *sk, struct sockaddr *uaddr, int addr_len);
5251
#define BIND_FROM_BPF (1 << 2)
5352
/* Skip CAP_NET_BIND_SERVICE check. */
5453
#define BIND_NO_CAP_NET_BIND_SERVICE (1 << 3)
55-
int __inet_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len,
54+
int __inet_bind(struct sock *sk, struct sockaddr_unspec *uaddr, int addr_len,
5655
u32 flags);
5756
int inet_getname(struct socket *sock, struct sockaddr *uaddr,
5857
int peer);

include/net/ip.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -261,8 +261,8 @@ static inline u8 ip_sendmsg_scope(const struct inet_sock *inet,
261261
}
262262

263263
/* datagram.c */
264-
int __ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len);
265-
int ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len);
264+
int __ip4_datagram_connect(struct sock *sk, struct sockaddr_unspec *uaddr, int addr_len);
265+
int ip4_datagram_connect(struct sock *sk, struct sockaddr_unspec *uaddr, int addr_len);
266266

267267
void ip4_datagram_release_cb(struct sock *sk);
268268

include/net/ipv6.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1188,10 +1188,10 @@ int do_ipv6_getsockopt(struct sock *sk, int level, int optname,
11881188
int ipv6_getsockopt(struct sock *sk, int level, int optname,
11891189
char __user *optval, int __user *optlen);
11901190

1191-
int __ip6_datagram_connect(struct sock *sk, struct sockaddr *addr,
1191+
int __ip6_datagram_connect(struct sock *sk, struct sockaddr_unspec *addr,
11921192
int addr_len);
1193-
int ip6_datagram_connect(struct sock *sk, struct sockaddr *addr, int addr_len);
1194-
int ip6_datagram_connect_v6_only(struct sock *sk, struct sockaddr *addr,
1193+
int ip6_datagram_connect(struct sock *sk, struct sockaddr_unspec *addr, int addr_len);
1194+
int ip6_datagram_connect_v6_only(struct sock *sk, struct sockaddr_unspec *addr,
11951195
int addr_len);
11961196
int ip6_datagram_dst_update(struct sock *sk, bool fix_sk_saddr);
11971197
void ip6_datagram_release_cb(struct sock *sk);
@@ -1209,7 +1209,7 @@ void inet6_cleanup_sock(struct sock *sk);
12091209
void inet6_sock_destruct(struct sock *sk);
12101210
int inet6_release(struct socket *sock);
12111211
int inet6_bind(struct socket *sock, struct sockaddr_unspec *uaddr, int addr_len);
1212-
int inet6_bind_sk(struct sock *sk, struct sockaddr *uaddr, int addr_len);
1212+
int inet6_bind_sk(struct sock *sk, struct sockaddr_unspec *uaddr, int addr_len);
12131213
int inet6_getname(struct socket *sock, struct sockaddr *uaddr,
12141214
int peer);
12151215
int inet6_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);

include/net/ipv6_stubs.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ extern const struct ipv6_stub *ipv6_stub __read_mostly;
8080

8181
/* A stub used by bpf helpers. Similarly ugly as ipv6_stub */
8282
struct ipv6_bpf_stub {
83-
int (*inet6_bind)(struct sock *sk, struct sockaddr *uaddr, int addr_len,
83+
int (*inet6_bind)(struct sock *sk, struct sockaddr_unspec *uaddr, int addr_len,
8484
u32 flags);
8585
struct sock *(*udp6_lib_lookup)(const struct net *net,
8686
const struct in6_addr *saddr, __be16 sport,

include/net/ping.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ void ping_unhash(struct sock *sk);
5858

5959
int ping_init_sock(struct sock *sk);
6060
void ping_close(struct sock *sk, long timeout);
61-
int ping_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len);
61+
int ping_bind(struct sock *sk, struct sockaddr_unspec *uaddr, int addr_len);
6262
void ping_err(struct sk_buff *skb, int offset, u32 info);
6363
int ping_getfrag(void *from, char *to, int offset, int fraglen, int odd,
6464
struct sk_buff *);

include/net/sock.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1260,10 +1260,10 @@ struct proto {
12601260
void (*close)(struct sock *sk,
12611261
long timeout);
12621262
int (*pre_connect)(struct sock *sk,
1263-
struct sockaddr *uaddr,
1263+
struct sockaddr_unspec *uaddr,
12641264
int addr_len);
12651265
int (*connect)(struct sock *sk,
1266-
struct sockaddr *uaddr,
1266+
struct sockaddr_unspec *uaddr,
12671267
int addr_len);
12681268
int (*disconnect)(struct sock *sk, int flags);
12691269

@@ -1292,9 +1292,9 @@ struct proto {
12921292
size_t len, int flags, int *addr_len);
12931293
void (*splice_eof)(struct socket *sock);
12941294
int (*bind)(struct sock *sk,
1295-
struct sockaddr *addr, int addr_len);
1295+
struct sockaddr_unspec *addr, int addr_len);
12961296
int (*bind_add)(struct sock *sk,
1297-
struct sockaddr *addr, int addr_len);
1297+
struct sockaddr_unspec *addr, int addr_len);
12981298

12991299
int (*backlog_rcv) (struct sock *sk,
13001300
struct sk_buff *skb);
@@ -3085,7 +3085,7 @@ void sock_set_reuseaddr(struct sock *sk);
30853085
void sock_set_reuseport(struct sock *sk);
30863086
void sock_set_sndtimeo(struct sock *sk, s64 secs);
30873087

3088-
int sock_bind_add(struct sock *sk, struct sockaddr *addr, int addr_len);
3088+
int sock_bind_add(struct sock *sk, struct sockaddr_unspec *addr, int addr_len);
30893089

30903090
int sock_get_timeout(long timeo, void *optval, bool old_timeval);
30913091
int sock_copy_user_timeval(struct __kernel_sock_timeval *tv,

include/net/tcp.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -530,7 +530,7 @@ struct sock *tcp_v4_syn_recv_sock(const struct sock *sk, struct sk_buff *skb,
530530
struct request_sock *req_unhash,
531531
bool *own_req);
532532
int tcp_v4_do_rcv(struct sock *sk, struct sk_buff *skb);
533-
int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len);
533+
int tcp_v4_connect(struct sock *sk, struct sockaddr_unspec *uaddr, int addr_len);
534534
int tcp_connect(struct sock *sk);
535535
enum tcp_synack_type {
536536
TCP_SYNACK_NORMAL,

include/net/udp.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -424,7 +424,7 @@ void udp4_hwcsum(struct sk_buff *skb, __be32 src, __be32 dst);
424424
int udp_rcv(struct sk_buff *skb);
425425
int udp_ioctl(struct sock *sk, int cmd, int *karg);
426426
int udp_init_sock(struct sock *sk);
427-
int udp_pre_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len);
427+
int udp_pre_connect(struct sock *sk, struct sockaddr_unspec *uaddr, int addr_len);
428428
int __udp_disconnect(struct sock *sk, int flags);
429429
int udp_disconnect(struct sock *sk, int flags);
430430
__poll_t udp_poll(struct file *file, struct socket *sock, poll_table *wait);

net/core/filter.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5914,7 +5914,7 @@ BPF_CALL_3(bpf_bind, struct bpf_sock_addr_kern *, ctx, struct sockaddr *, addr,
59145914
return err;
59155915
if (((struct sockaddr_in *)addr)->sin_port == htons(0))
59165916
flags |= BIND_FORCE_ADDRESS_NO_PORT;
5917-
return __inet_bind(sk, addr, addr_len, flags);
5917+
return __inet_bind(sk, (struct sockaddr_unspec *)addr, addr_len, flags);
59185918
#if IS_ENABLED(CONFIG_IPV6)
59195919
} else if (addr->sa_family == AF_INET6) {
59205920
if (addr_len < SIN6_LEN_RFC2133)
@@ -5924,7 +5924,8 @@ BPF_CALL_3(bpf_bind, struct bpf_sock_addr_kern *, ctx, struct sockaddr *, addr,
59245924
/* ipv6_bpf_stub cannot be NULL, since it's called from
59255925
* bpf_cgroup_inet6_connect hook and ipv6 is already loaded
59265926
*/
5927-
return ipv6_bpf_stub->inet6_bind(sk, addr, addr_len, flags);
5927+
return ipv6_bpf_stub->inet6_bind(sk, (struct sockaddr_unspec *)addr,
5928+
addr_len, flags);
59285929
#endif /* CONFIG_IPV6 */
59295930
}
59305931
#endif /* CONFIG_INET */

0 commit comments

Comments
 (0)