net: Introduce struct sockaddr_unspec
Subsystems (64)
v3 cover net: Introduce struct sockaddr_unspec
Hi!
v3:
- fix missed kernel_connect/bind casts in bpf selftests
- fix missed kernel_connect cast in samples/
- drop "bpf: Add size validation to bpf_sock_addr_set_sun_path()", which is technically unrelated to the sockaddr conversion
v2: https://lore.kernel.org/linux-hardening/[email protected]/
v1: https://lore.kernel.org/all/[email protected]/
The historically fixed-size struct sockaddr is part of UAPI and embedded in many existing structures. The kernel uses struct sockaddr extensively within the kernel to represent arbitrarily sized sockaddr structures, which caused problems with the compiler's ability to determine object sizes correctly. The "temporary" solution was to make sockaddr explicitly use a flexible array, but this causes problems for embedding struct sockaddr in structures, where once again the compiler has to guess about the size of such objects, and causes thousands of warnings under the coming -Wflex-array-member-not-at-end warning.
Switching to sockaddr_storage internally everywhere wastes a lot of memory, so we are left with needing two changes:
- introduction of an explicitly arbitrarily sized sockaddr struct
- switch struct sockaddr back to being fixed size
Doing the latter step requires all "arbitrarily sized" uses of struct sockaddr to be replaced with the new struct from the first step.
So, introduce the new struct and do enough conversions that we can switch sockaddr back to a fixed-size sa_data.
Thanks!
-Kees
Kees Cook (9):
net: Add struct sockaddr_unspec for sockaddr of unknown length net/l2tp: Add missing sa_family validation in
pppol2tp_sockaddr_get_info
net: Convert proto_ops bind() callbacks to use sockaddr_unspec
net: Convert proto_ops connect() callbacks to use sockaddr_unspec
net: Remove struct sockaddr from net.h
net: Convert proto callbacks from sockaddr to sockaddr_unspec
bpf: Convert cgroup sockaddr filters to use sockaddr_unspec
consistently
bpf: Convert bpf_sock_addr_kern "uaddr" to sockaddr_unspec
net: Convert struct sockaddr to fixed-size "sa_data[14]"
include/linux/bpf-cgroup.h | 17 ++++++++------ include/linux/filter.h | 2 +- include/linux/net.h | 9 ++++---- include/linux/socket.h | 23 +++++++++++++++---- include/net/inet_common.h | 13 +++++------ include/net/ip.h | 4 ++-- include/net/ipv6.h | 10 ++++---- include/net/ipv6_stubs.h | 2 +- include/net/ping.h | 2 +- include/net/sctp/sctp.h | 2 +- include/net/sock.h | 14 +++++------ include/net/tcp.h | 2 +- include/net/udp.h | 2 +- include/net/vsock_addr.h | 2 +- net/rds/rds.h | 2 +- net/smc/smc.h | 4 ++-- .../perf/trace/beauty/include/linux/socket.h | 5 +--- crypto/af_alg.c | 2 +- drivers/block/drbd/drbd_receiver.c | 6 ++--- drivers/infiniband/hw/erdma/erdma_cm.c | 6 ++--- drivers/infiniband/sw/siw/siw_cm.c | 8 +++---- drivers/isdn/mISDN/l1oip_core.c | 2 +- drivers/isdn/mISDN/socket.c | 4 ++-- drivers/net/ppp/pppoe.c | 4 ++-- drivers/net/ppp/pptp.c | 8 +++---- drivers/net/wireless/ath/ath10k/qmi.c | 2 +- drivers/net/wireless/ath/ath11k/qmi.c | 2 +- drivers/net/wireless/ath/ath12k/qmi.c | 2 +- drivers/nvme/host/tcp.c | 4 ++-- drivers/nvme/target/tcp.c | 2 +- drivers/slimbus/qcom-ngd-ctrl.c | 2 +- drivers/target/iscsi/iscsi_target_login.c | 2 +- drivers/xen/pvcalls-back.c | 4 ++-- fs/afs/rxrpc.c | 6 ++--- fs/coredump.c | 2 +- fs/dlm/lowcomms.c | 8 +++---- fs/ocfs2/cluster/tcp.c | 6 ++--- fs/smb/client/connect.c | 4 ++-- fs/smb/server/transport_tcp.c | 4 ++-- kernel/bpf/cgroup.c | 8 +++---- net/9p/trans_fd.c | 8 +++---- net/appletalk/ddp.c | 4 ++-- net/atm/pvc.c | 4 ++-- net/atm/svc.c | 4 ++-- net/ax25/af_ax25.c | 4 ++-- net/bluetooth/hci_sock.c | 2 +- net/bluetooth/iso.c | 6 ++--- net/bluetooth/l2cap_sock.c | 4 ++-- net/bluetooth/rfcomm/core.c | 6 ++--- net/bluetooth/rfcomm/sock.c | 5 ++-- net/bluetooth/sco.c | 4 ++-- net/caif/caif_socket.c | 2 +- net/can/bcm.c | 2 +- net/can/isotp.c | 2 +- net/can/j1939/socket.c | 4 ++-- net/can/raw.c | 2 +- net/ceph/messenger.c | 2 +- net/core/dev.c | 2 +- net/core/dev_ioctl.c | 2 +- net/core/filter.c | 5 ++-- net/core/sock.c | 6 ++--- net/ieee802154/socket.c | 12 +++++----- net/ipv4/af_inet.c | 16 ++++++------- net/ipv4/arp.c | 2 +- net/ipv4/datagram.c | 4 ++-- net/ipv4/ping.c | 8 +++---- net/ipv4/raw.c | 3 ++- net/ipv4/tcp.c | 2 +- net/ipv4/tcp_ipv4.c | 4 ++-- net/ipv4/udp.c | 6 +++-- net/ipv4/udp_tunnel_core.c | 4 ++-- net/ipv6/af_inet6.c | 6 ++--- net/ipv6/datagram.c | 8 +++---- net/ipv6/ip6_udp_tunnel.c | 4 ++-- net/ipv6/ping.c | 2 +- net/ipv6/raw.c | 3 ++- net/ipv6/tcp_ipv6.c | 6 ++--- net/ipv6/udp.c | 5 ++-- net/iucv/af_iucv.c | 6 ++--- net/l2tp/l2tp_core.c | 8 +++---- net/l2tp/l2tp_ip.c | 6 +++-- net/l2tp/l2tp_ip6.c | 5 ++-- net/l2tp/l2tp_ppp.c | 9 +++++++- net/llc/af_llc.c | 4 ++-- net/mctp/af_mctp.c | 4 ++-- net/mctp/test/route-test.c | 2 +- net/mctp/test/utils.c | 5 ++-- net/mptcp/pm_kernel.c | 4 ++-- net/mptcp/protocol.c | 5 ++-- net/mptcp/subflow.c | 4 ++-- net/netfilter/ipvs/ip_vs_sync.c | 6 ++--- net/netlink/af_netlink.c | 4 ++-- net/netrom/af_netrom.c | 6 ++--- net/nfc/llcp_sock.c | 6 ++--- net/nfc/rawsock.c | 2 +- net/packet/af_packet.c | 15 ++++++------ net/phonet/pep.c | 3 ++- net/phonet/socket.c | 10 ++++---- net/qrtr/af_qrtr.c | 4 ++-- net/qrtr/ns.c | 2 +- net/rds/af_rds.c | 2 +- net/rds/bind.c | 2 +- net/rds/tcp_connect.c | 4 ++-- net/rds/tcp_listen.c | 2 +- net/rose/af_rose.c | 4 ++-- net/rxrpc/af_rxrpc.c | 4 ++-- net/rxrpc/rxperf.c | 2 +- net/sctp/socket.c | 13 ++++++----- net/smc/af_smc.c | 6 ++--- net/socket.c | 14 +++++------ net/sunrpc/clnt.c | 6 ++--- net/sunrpc/svcsock.c | 2 +- net/sunrpc/xprtsock.c | 9 ++++---- net/tipc/socket.c | 6 ++--- net/unix/af_unix.c | 12 +++++----- net/vmw_vsock/af_vsock.c | 6 ++--- net/vmw_vsock/vsock_addr.c | 2 +- net/x25/af_x25.c | 4 ++-- net/xdp/xsk.c | 2 +- samples/qmi/qmi_sample_client.c | 2 +- .../selftests/bpf/test_kmods/bpf_testmod.c | 4 ++-- 121 files changed, 326 insertions(+), 290 deletions(-)
Signature · 1 line
2.34.1
PATCH v3 1/9 net: Add struct sockaddr_unspec for sockaddr of unknown length
Add flexible sockaddr structure to support addresses longer than the traditional 14-byte struct sockaddr::sa_data limitation without requiring the full 128-byte sa_data of struct sockaddr_storage. This allows the network APIs to pass around a pointer to an object that isn't lying to the compiler about how big it is, but must be accompanied by its actual size as an additional parameter.
It's possible we may way to migrate to including the size with the struct in the future, e.g.:
struct sockaddr_unspec {
u16 sa_data_len;
u16 sa_family;
u8 sa_data[] __counted_by(sa_data_len);
};--- include/linux/socket.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)
include/linux/socket.h +17 -0
@@ -40,6 +40,23 @@ struct sockaddr { }; }; +/** +* struct sockaddr_unspec - Unspecified size sockaddr for callbacks +* @sa_family: Address family (AF_UNIX, AF_INET, AF_INET6, etc.) +* @sa_data: Flexible array for address data +* +* This structure is designed for callback interfaces where the +* total size is known via the sockaddr_len parameter. Unlike struct +* sockaddr which has a fixed 14-byte sa_data limit or struct +* sockaddr_storage which has a fixed 128-byte sa_data limit, this +* structure can accommodate addresses of any size, but must be used +* carefully. +*/ +struct sockaddr_unspec { +__kernel_sa_family_t sa_family;/* address family, AF_xxx */ +char sa_data[];/* flexible address data */ +}; +struct linger {int l_onoff;/* Linger active */ int l_linger;/* How long to linger for */
Signature · 1 line
2.34.1
Re: [PATCH v3 1/9] net: Add struct sockaddr_unspec for sockaddr of unknown length
Quoted 7 lines · On Mon, 20 Oct 2025 14:26:30 -0700 Kees Cook <[email protected]> wrote:
Add flexible sockaddr structure to support addresses longer than the traditional 14-byte struct
sockaddr::sa_datalimitation without requiring the full 128-bytesa_dataof structsockaddr_storage. This allows the network APIs to pass around a pointer to an object that isn't lying to the compiler about how big it is, but must be accompanied by its actual size as an additional parameter.
Quoted 8 lines
It's possible we may way to migrate to including the size with the struct in the future, e.g.:
struct sockaddr_unspec { u16 sa_data_len; u16 sa_family; u8 sa_data[] __counted_by(sa_data_len); };
One on the historic Unix implementations split the 'sa_family' field into two single byte fields - the second one containing the length. That might work - although care would be needed not to pass a length back to userspace.
NetBSD certainly forbid declaring variables of type 'sockaddr storage', the kernel could only use pointers to it.
These days that might be enforcable by the compiler.
David
Re: [PATCH v3 1/9] net: Add struct sockaddr_unspec for sockaddr of unknown length
Quoted 19 lines · David Laight
Quoted 7 lines · On Mon, 20 Oct 2025 14:26:30 -0700 Kees Cook <[email protected]> wrote:
Add flexible sockaddr structure to support addresses longer than the traditional 14-byte struct
sockaddr::sa_datalimitation without requiring the full 128-bytesa_dataof structsockaddr_storage. This allows the network APIs to pass around a pointer to an object that isn't lying to the compiler about how big it is, but must be accompanied by its actual size as an additional parameter.Quoted 8 lines
It's possible we may way to migrate to including the size with the struct in the future, e.g.:
struct sockaddr_unspec { u16 sa_data_len; u16 sa_family; u8 sa_data[] __counted_by(sa_data_len); };
Quoted 4 lines
One on the historic Unix implementations split the '
sa_family' field into two single byte fields - the second one containing the length. That might work - although care would be needed not to pass a length back to userspace.
I think this is just asking for trouble -- leaving that inline could be hard to track down places that needed filtering out.
It might be easier to move to a separate struct like I suggest above, though maybe as:
struct sockaddr_sized {
u16 sa_data_len;
struct {
u16 sa_family;
u8 sa_data[] __counted_by(sa_data_len);
} sa_unspec;
};(So it's easier to cast between implementation-specific sockaddr and the "sa_unspec" member.)
And then pass that around. But I think that'll require a LOT of refactoring. But that could happen separately from this change, which is to just get us back to the existing state of passing around an unknown sized object but now we're not lying to the compiler about its size.
Signature · 1 line
Kees Cook
Re: [PATCH v3 1/9] net: Add struct sockaddr_unspec for sockaddr of unknown length
Quoted 39 lines · On Tue, 21 Oct 2025 12:42:10 -0700 Kees Cook <[email protected]> wrote:
Quoted 19 lines · David Laight
Quoted 7 lines · On Mon, 20 Oct 2025 14:26:30 -0700 Kees Cook <[email protected]> wrote:
Add flexible sockaddr structure to support addresses longer than the traditional 14-byte struct
sockaddr::sa_datalimitation without requiring the full 128-bytesa_dataof structsockaddr_storage. This allows the network APIs to pass around a pointer to an object that isn't lying to the compiler about how big it is, but must be accompanied by its actual size as an additional parameter.Quoted 8 lines
It's possible we may way to migrate to including the size with the struct in the future, e.g.:
struct sockaddr_unspec { u16 sa_data_len; u16 sa_family; u8 sa_data[] __counted_by(sa_data_len); };Quoted 4 lines
One on the historic Unix implementations split the '
sa_family' field into two single byte fields - the second one containing the length. That might work - although care would be needed not to pass a length back to userspace.I think this is just asking for trouble -- leaving that inline could be hard to track down places that needed filtering out.
It might be easier to move to a separate struct like I suggest above, though maybe as:
struct sockaddr_sized { u16 sa_data_len; struct { u16 sa_family; u8 sa_data[] __counted_by(sa_data_len); } sa_unspec; };
Quoted 7 lines
(So it's easier to cast between implementation-specific sockaddr and the "
sa_unspec" member.)And then pass that around. But I think that'll require a LOT of refactoring. But that could happen separately from this change, which is to just get us back to the existing state of passing around an unknown sized object but now we're not lying to the compiler about its size.
The problem with that is it misaligns things later on. And you really want to be using the length from the user, which includes sa_family.
I'm not sure it even works if the extra sa_data_len is u32 (or even u64).
I did wonder if 'union casts' would help.
They would require a union of pointers to all possible sockaddr formats. Annoyingly I don't think you can avoid the need for the cast on the call sites for a lot of the functions - unless they are renamed to have unique names (so a #define can add the cast).
If you do add a #define, it can generate the size from that of the supplied address structure (and error things that are stupidly short).
David
Re: [PATCH v3 1/9] net: Add struct sockaddr_unspec for sockaddr of unknown length
Quoted 2 lines · David Laight
If you do add a #define, it can generate the size from that of the supplied address structure (and error things that are stupidly short).
I have more patches coming that consolidate all the open-coded casting and size checking into a macro. So far, only a couple places weren't doing the full checking.
Signature · 1 line
Kees Cook
Paolo Abeni
maintainerRe: [PATCH v3 1/9] net: Add struct sockaddr_unspec for sockaddr of unknown length
In reply to Kees CookQuoted 7 lines · Kees Cook
Add flexible sockaddr structure to support addresses longer than the traditional 14-byte struct
sockaddr::sa_datalimitation without requiring the full 128-bytesa_dataof structsockaddr_storage. This allows the network APIs to pass around a pointer to an object that isn't lying to the compiler about how big it is, but must be accompanied by its actual size as an additional parameter.
Quoted 8 lines
It's possible we may way to migrate to including the size with the struct in the future, e.g.:
struct sockaddr_unspec { u16 sa_data_len; u16 sa_family; u8 sa_data[] __counted_by(sa_data_len); };
Side note: sockaddr_unspec is possibly not the optimal name, as AF_UNSPEC has a specific meaning/semantic.
Name-wise, I think 'sockaddr_sized' would be better, but I agree with David the struct may cause unaligned access problems.
/P
Re: [PATCH v3 1/9] net: Add struct sockaddr_unspec for sockaddr of unknown length
Quoted 17 lines · On Thu, 23 Oct 2025 12:43:06 +0200 Paolo Abeni <[email protected]> wrote:
Quoted 7 lines · Kees Cook
Add flexible sockaddr structure to support addresses longer than the traditional 14-byte struct
sockaddr::sa_datalimitation without requiring the full 128-bytesa_dataof structsockaddr_storage. This allows the network APIs to pass around a pointer to an object that isn't lying to the compiler about how big it is, but must be accompanied by its actual size as an additional parameter.Quoted 8 lines
It's possible we may way to migrate to including the size with the struct in the future, e.g.:
struct sockaddr_unspec { u16 sa_data_len; u16 sa_family; u8 sa_data[] __counted_by(sa_data_len); };
Quoted 4 lines
Side note:
sockaddr_unspecis possibly not the optimal name, asAF_UNSPEChas a specific meaning/semantic.Name-wise, I think '
sockaddr_sized' would be better,
Or even sockaddr_unsized ?
Quoted 1 line
but I agree with David the struct may cause unaligned access problems.
It probably also wants the 'sized_by' attribute rather than 'counted_by'. So wherever the length is saved it is the length the user supplied for the structure (or the sizeof the protocol-specific one).
David
Quoted 4 lines
/P
Re: [PATCH v3 1/9] net: Add struct sockaddr_unspec for sockaddr of unknown length
In reply to Paolo AbeniQuoted 17 lines · Paolo Abeni
Quoted 7 lines · Kees Cook
Add flexible sockaddr structure to support addresses longer than the traditional 14-byte struct
sockaddr::sa_datalimitation without requiring the full 128-bytesa_dataof structsockaddr_storage. This allows the network APIs to pass around a pointer to an object that isn't lying to the compiler about how big it is, but must be accompanied by its actual size as an additional parameter.Quoted 8 lines
It's possible we may way to migrate to including the size with the struct in the future, e.g.:
struct sockaddr_unspec { u16 sa_data_len; u16 sa_family; u8 sa_data[] __counted_by(sa_data_len); };
Quoted 5 lines
Side note:
sockaddr_unspecis possibly not the optimal name, asAF_UNSPEChas a specific meaning/semantic.Name-wise, I think '
sockaddr_sized' would be better, but I agree with David the struct may cause unaligned access problems.
I'll go with sockaddr_unsized -- doing the sockaddr_sized variant is a much more involved change. I just want to get us to where we are today but with no lying to the compiler about sizes. :)
Signature · 1 line
Kees Cook
Paolo Abeni
maintainerRe: [PATCH v3 1/9] net: Add struct sockaddr_unspec for sockaddr of unknown length
In reply to Kees CookQuoted 10 lines · Kees Cook
Add flexible sockaddr structure to support addresses longer than the traditional 14-byte struct
sockaddr::sa_datalimitation without requiring the full 128-bytesa_dataof structsockaddr_storage. This allows the network APIs to pass around a pointer to an object that isn't lying to the compiler about how big it is, but must be accompanied by its actual size as an additional parameter.It's possible we may way to migrate to including the size with the struct in the future, e.g.:
Quoted 7 lines
struct sockaddr_unspec { u16 sa_data_len; u16 sa_family; u8 sa_data[] __counted_by(sa_data_len); };Signed-off-by Kees Cook <[email protected]>
Another side note: please include the 'net-next' subj prefix in next submissions, otherwise patchwork could be fouled, and the patches will not be picked by our CI - I guess we need all the possible testing done here ;)
/P
Re: [PATCH v3 1/9] net: Add struct sockaddr_unspec for sockaddr of unknown length
Quoted 17 lines · Paolo Abeni
Quoted 16 lines · Kees Cook
Add flexible sockaddr structure to support addresses longer than the traditional 14-byte struct
sockaddr::sa_datalimitation without requiring the full 128-bytesa_dataof structsockaddr_storage. This allows the network APIs to pass around a pointer to an object that isn't lying to the compiler about how big it is, but must be accompanied by its actual size as an additional parameter.It's possible we may way to migrate to including the size with the struct in the future, e.g.:
struct sockaddr_unspec { u16 sa_data_len; u16 sa_family; u8 sa_data[] __counted_by(sa_data_len); };
Quoted 6 lines
Quoted 1 line
Signed-off-by Kees Cook <[email protected]>Another side note: please include the 'net-next' subj prefix in next submissions, otherwise patchwork could be fouled, and the patches will not be picked by our CI - I guess we need all the possible testing done here ;)
Okay, I've tweaked my workflow automation to attempt this now. I had a bit of a catch-22 in that I generated the CC list after "git format-patch" (and format-patch is what has the --prefix option, so I couldn't see if netdev@ was in the CC list yet...) Anyway, it should be part of my automation now...
Signature · 1 line
Kees Cook
PATCH v3 2/9 net/l2tp: Add missing sa_family validation in pppol2tp_sockaddr_get_info
In reply to Kees CookWhile reviewing the struct proto_ops connect() and bind() callback implementations, I noticed that there doesn't appear to be any validation that AF_PPPOX sockaddr structures actually have sa_family set to AF_PPPOX. The pppol2tp_sockaddr_get_info() checks only look at the sizes.
I don't see any way that this might actually cause problems as specific info fields are being populated, for which the existing size checks are correct, but it stood out as a missing address family check.
Add the check and return -EAFNOSUPPORT on mismatch.
--- net/l2tp/l2tp_ppp.c | 7 +++++++ 1 file changed, 7 insertions(+)
net/l2tp/l2tp_ppp.c +7 -0
@@ -535,6 +535,13 @@ struct l2tp_connect_info {static int pppol2tp_sockaddr_get_info (const void *sa,int sa_len,struct l2tp_connect_info *info) { +const struct sockaddr_unspec *sockaddr = sa; + + if (sa_len < offsetofend(struct sockaddr, sa_family)) +return -EINVAL ; +if (sockaddr->sa_family !=AF_PPPOX ) +return -EAFNOSUPPORT ; +switch (sa_len) {case sizeof (struct sockaddr_pppol2tp ): {
Signature · 1 line
2.34.1
Paolo Abeni
maintainerRe: [PATCH v3 2/9] net/l2tp: Add missing sa_family validation in pppol2tp_sockaddr_get_info
Quoted 22 lines · Kees Cook
While reviewing the struct
proto_opsconnect()andbind()callback implementations, I noticed that there doesn't appear to be any validation thatAF_PPPOXsockaddr structures actually havesa_familyset toAF_PPPOX. Thepppol2tp_sockaddr_get_info()checks only look at the sizes.I don't see any way that this might actually cause problems as specific info fields are being populated, for which the existing size checks are correct, but it stood out as a missing address family check.
Add the check and return
-EAFNOSUPPORTon mismatch.Signed-off-by Kees Cook <[email protected]>--- net/l2tp/l2tp_ppp.c | 7 +++++++ 1 file changed, 7 insertions(+)net/l2tp/l2tp_ppp.c +0
-0
net/l2tp/l2tp_ppp.c struct l2tp_connect_info { · line 543
Quoted 9 lines
net/l2tp/l2tp_ppp.c +6
-0@@ -535,6 +535,13 @@ struct l2tp_connect_info {static int pppol2tp_sockaddr_get_info (const void *sa,int sa_len,struct l2tp_connect_info *info) { +const struct sockaddr_unspec *sockaddr = sa; + + if (sa_len < offsetofend(struct sockaddr, sa_family)) +return -EINVAL ; +if (sockaddr->sa_family !=AF_PPPOX ) +return -EAFNOSUPPORT ;
I fear we can't introduce this check, as it could break existing user-space application currently passing random data into sa_family but still able to connect successfully.
/P
Re: [PATCH v3 2/9] net/l2tp: Add missing sa_family validation in pppol2tp_sockaddr_get_info
Quoted 28 lines · Paolo Abeni
Quoted 27 lines · Kees Cook
While reviewing the struct
proto_opsconnect()andbind()callback implementations, I noticed that there doesn't appear to be any validation thatAF_PPPOXsockaddr structures actually havesa_familyset toAF_PPPOX. Thepppol2tp_sockaddr_get_info()checks only look at the sizes.I don't see any way that this might actually cause problems as specific info fields are being populated, for which the existing size checks are correct, but it stood out as a missing address family check.
Add the check and return
-EAFNOSUPPORTon mismatch.Signed-off-by Kees Cook <[email protected]>--- net/l2tp/l2tp_ppp.c | 7 +++++++ 1 file changed, 7 insertions(+)net/l2tp/l2tp_ppp.c +2
-0@@ -535,6 +535,13 @@ struct l2tp_connect_info {static int pppol2tp_sockaddr_get_info (const void *sa,int sa_len,struct l2tp_connect_info *info) { +const struct sockaddr_unspec *sockaddr = sa; +
Quoted 8 lines
net/l2tp/l2tp_ppp.c struct l2tp_connect_info { · line 543
Quoted 4 lines
net/l2tp/l2tp_ppp.c +4
-0+ if (sa_len < offsetofend(struct sockaddr, sa_family)) +return -EINVAL ; +if (sockaddr->sa_family !=AF_PPPOX ) +return -EAFNOSUPPORT ;I fear we can't introduce this check, as it could break existing user-space application currently passing random data into
sa_familybut still able to connect successfully.
Isn't sa_family kind of the critical determining factor on how the network stack decides to handle sockaddr stuff? I'll drop it for now, I guess, but that's surprising to me.
-Kees
Signature · 1 line
Kees Cook
PATCH v3 3/9 net: Convert proto_ops bind() callbacks to use sockaddr_unspec
In reply to Kees CookUpdate all struct proto_ops bind() callback function prototypes from "struct sockaddr *" to "struct sockaddr_unspec *" to avoid lying to the compiler about object sizes. Calls into struct proto handlers gain casts that will be removed in the struct proto conversion patch.
No binary changes expected.
--- include/linux/net.h | 4 ++-- include/net/inet_common.h | 2 +- include/net/ipv6.h | 2 +- include/net/sock.h | 2 +- net/rds/rds.h | 2 +- net/smc/smc.h | 2 +- crypto/af_alg.c | 2 +- drivers/block/drbd/drbd_receiver.c | 4 ++-- drivers/infiniband/hw/erdma/erdma_cm.c | 4 ++-- drivers/infiniband/sw/siw/siw_cm.c | 6 +++--- drivers/isdn/mISDN/l1oip_core.c | 2 +- drivers/isdn/mISDN/socket.c | 4 ++-- drivers/net/ppp/pptp.c | 4 ++-- drivers/nvme/host/tcp.c | 2 +- drivers/nvme/target/tcp.c | 2 +- drivers/target/iscsi/iscsi_target_login.c | 2 +- drivers/xen/pvcalls-back.c | 2 +- fs/afs/rxrpc.c | 6 +++--- fs/dlm/lowcomms.c | 6 +++--- fs/ocfs2/cluster/tcp.c | 4 ++-- fs/smb/client/connect.c | 2 +- fs/smb/server/transport_tcp.c | 4 ++-- net/9p/trans_fd.c | 2 +- net/appletalk/ddp.c | 2 +- net/atm/pvc.c | 4 ++-- net/atm/svc.c | 2 +- net/ax25/af_ax25.c | 2 +- net/bluetooth/hci_sock.c | 2 +- net/bluetooth/iso.c | 4 ++-- net/bluetooth/l2cap_sock.c | 2 +- net/bluetooth/rfcomm/core.c | 4 ++-- net/bluetooth/rfcomm/sock.c | 2 +- net/bluetooth/sco.c | 2 +- net/can/isotp.c | 2 +- net/can/j1939/socket.c | 2 +- net/can/raw.c | 2 +- net/core/sock.c | 2 +- net/ieee802154/socket.c | 4 ++-- net/ipv4/af_inet.c | 4 ++-- net/ipv4/udp_tunnel_core.c | 2 +- net/ipv6/af_inet6.c | 4 ++-- net/ipv6/ip6_udp_tunnel.c | 2 +- net/iucv/af_iucv.c | 2 +- net/l2tp/l2tp_core.c | 4 ++-- net/llc/af_llc.c | 2 +- net/mctp/af_mctp.c | 2 +- net/mctp/test/route-test.c | 2 +- net/mptcp/protocol.c | 6 +++--- net/mptcp/subflow.c | 2 +- net/netfilter/ipvs/ip_vs_sync.c | 4 ++-- net/netlink/af_netlink.c | 2 +- net/netrom/af_netrom.c | 2 +- net/nfc/llcp_sock.c | 4 ++-- net/packet/af_packet.c | 11 ++++++----- net/phonet/socket.c | 8 ++++---- net/qrtr/af_qrtr.c | 2 +- net/qrtr/ns.c | 2 +- net/rds/bind.c | 2 +- net/rds/tcp_connect.c | 2 +- net/rds/tcp_listen.c | 2 +- net/rose/af_rose.c | 2 +- net/rxrpc/af_rxrpc.c | 2 +- net/rxrpc/rxperf.c | 2 +- net/smc/af_smc.c | 2 +- net/socket.c | 6 +++--- net/sunrpc/clnt.c | 4 ++-- net/sunrpc/svcsock.c | 2 +- net/sunrpc/xprtsock.c | 4 ++-- net/tipc/socket.c | 4 ++-- net/unix/af_unix.c | 4 ++-- net/vmw_vsock/af_vsock.c | 4 ++-- net/x25/af_x25.c | 2 +- net/xdp/xsk.c | 2 +- tools/testing/selftests/bpf/test_kmods/bpf_testmod.c | 2 +- 74 files changed, 113 insertions(+), 112 deletions(-)
include/linux/net.h +2 -2
@@ -163,7 +163,7 @@ struct proto_ops {struct module *owner;int (*release) (struct socket *sock);int (*bind) (struct socket *sock, -struct sockaddr *myaddr, +struct sockaddr_unspec *myaddr,int sockaddr_len); int (*connect) (struct socket *sock, struct sockaddr *vaddr,
@@ -345,7 +345,7 @@ int kernel_sendmsg(struct socket *sock, struct msghdr *msg, struct kvec *vec,int kernel_recvmsg (struct socket *sock,struct msghdr *msg,struct kvec *vec,size_t num,size_t len,int flags); -int kernel_bind (struct socket *sock,struct sockaddr *addr,int addrlen); +int kernel_bind (struct socket *sock,struct sockaddr_unspec *addr,int addrlen);int kernel_listen (struct socket *sock,int backlog);int kernel_accept (struct socket *sock,struct socket **newsock,int flags); int kernel_connect(struct socket *sock, struct sockaddr *addr, int addrlen,
include/net/inet_common.h +1 -1
@@ -42,7 +42,7 @@ int inet_shutdown(struct socket *sock, int how);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 *uaddr,int addr_len); +int inet_bind (struct socket *sock,struct sockaddr_unspec *uaddr,int addr_len);int inet_bind_sk (struct sock *sk,struct sockaddr *uaddr,int addr_len);/* Don't allocate port at this moment, defer to connect. */ #define BIND_FORCE_ADDRESS_NO_PORT (1 << 0)
include/net/ipv6.h +1 -1
@@ -1208,7 +1208,7 @@ void ipv6_local_rxpmtu(struct sock *sk, struct flowi6 *fl6, u32 mtu);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 *uaddr,int addr_len); +int inet6_bind (struct socket *sock,struct sockaddr_unspec *uaddr,int addr_len);int inet6_bind_sk (struct sock *sk,struct sockaddr *uaddr,int addr_len);int inet6_getname (struct socket *sock,struct sockaddr *uaddr,int peer);
include/net/sock.h +1 -1
@@ -1901,7 +1901,7 @@ int sock_cmsg_send(struct sock *sk, struct msghdr *msg,* Functions to fill in entries in struct proto_ops when a protocol * does not implement a particular function. */ -int sock_no_bind (struct socket *,struct sockaddr *,int ); +int sock_no_bind (struct socket *sock,struct sockaddr_unspec *saddr,int len);int sock_no_connect (struct socket *,struct sockaddr *,int ,int );int sock_no_socketpair (struct socket *,struct socket *);int sock_no_accept (struct socket *,struct socket *,struct proto_accept_arg *);
net/rds/rds.h +1 -1
@@ -735,7 +735,7 @@ extern wait_queue_head_t rds_poll_waitq;/* bind.c */ -int rds_bind (struct socket *sock,struct sockaddr *uaddr,int addr_len); +int rds_bind (struct socket *sock,struct sockaddr_unspec *uaddr,int addr_len);void rds_remove_bound (struct rds_sock *rs);struct rds_sock *rds_find_bound (const struct in6_addr *addr,__be16 port,__u32 scope_id);
net/smc/smc.h +1 -1
@@ -42,7 +42,7 @@ void smc_unhash_sk(struct sock *sk);void smc_release_cb (struct sock *sk);int smc_release (struct socket *sock); -int smc_bind (struct socket *sock,struct sockaddr *uaddr, +int smc_bind (struct socket *sock,struct sockaddr_unspec *uaddr,int addr_len);int smc_connect (struct socket *sock,struct sockaddr *addr,int alen,int flags);
crypto/af_alg.c +1 -1
@@ -145,7 +145,7 @@ void af_alg_release_parent(struct sock *sk) }EXPORT_SYMBOL_GPL (af_alg_release_parent); -static int alg_bind (struct socket *sock,struct sockaddr *uaddr,int addr_len) +static int alg_bind (struct socket *sock,struct sockaddr_unspec *uaddr,int addr_len) {const u32 allowed =CRYPTO_ALG_KERN_DRIVER_ONLY ;struct sock *sk = sock->sk;
drivers/block/drbd/drbd_receiver.c +2 -2
@@ -450,7 +450,7 @@ static struct socket *drbd_try_connect(struct drbd_connection *connection)* a free one dynamically. */ what ="bind before connect" ; - err = sock->ops->bind (sock, (struct sockaddr *) &src_in6, my_addr_len); + err = sock->ops->bind (sock, (struct sockaddr_unspec *) &src_in6, my_addr_len);if (err <0 ) goto out;
@@ -537,7 +537,7 @@ static int prepare_listen_socket(struct drbd_connection *connection, struct accedrbd_setbufsize (s_listen, sndbuf_size, rcvbuf_size); what ="bind before listen" ; - err = s_listen->ops->bind (s_listen, (struct sockaddr *)&my_addr, my_addr_len); + err = s_listen->ops->bind (s_listen, (struct sockaddr_unspec *)&my_addr, my_addr_len);if (err <0 ) goto out;
drivers/infiniband/hw/erdma/erdma_cm.c +2 -2
@@ -993,7 +993,7 @@ static int kernel_bindconnect(struct socket *s, struct sockaddr *laddr,int ret;sock_set_reuseaddr (s->sk); - ret = s->ops->bind (s, laddr, laddrlen); + ret = s->ops->bind (s, (struct sockaddr_unspec *)laddr, laddrlen);if (ret)return ret; ret = s->ops->connect (s, raddr, raddrlen, flags);
@@ -1315,7 +1315,7 @@ int erdma_create_listen(struct iw_cm_id *id, int backlog)if (ipv4_is_zeronet (laddr->sin_addr.s_addr)) s->sk->sk_bound_dev_if = dev->netdev->ifindex; - ret = s->ops->bind (s, (struct sockaddr *)laddr, + ret = s->ops->bind (s, (struct sockaddr_unspec *)laddr,sizeof (struct sockaddr_in ));if (ret) goto error;
drivers/infiniband/sw/siw/siw_cm.c +3 -3
@@ -1340,7 +1340,7 @@ static int kernel_bindconnect(struct socket *s, struct sockaddr *laddr,return rv; } - rv = s->ops->bind (s, laddr, size); + rv = s->ops->bind (s, (struct sockaddr_unspec *)laddr, size);if (rv <0 )return rv;
@@ -1789,7 +1789,7 @@ int siw_create_listen(struct iw_cm_id *id, int backlog) goto error; } } - rv = s->ops->bind (s, (struct sockaddr *)laddr, + rv = s->ops->bind (s, (struct sockaddr_unspec *)laddr,sizeof (struct sockaddr_in )); }else {struct sockaddr_in6 *laddr = &to_sockaddr_in6 (id->local_addr);
@@ -1813,7 +1813,7 @@ int siw_create_listen(struct iw_cm_id *id, int backlog) goto error; } } - rv = s->ops->bind (s, (struct sockaddr *)laddr, + rv = s->ops->bind (s, (struct sockaddr_unspec *)laddr,sizeof (struct sockaddr_in6 )); }if (rv) {
drivers/isdn/mISDN/l1oip_core.c +1 -1
@@ -676,7 +676,7 @@ l1oip_socket_thread(void *data) hc->sin_remote.sin_port =htons ((unsigned short )hc->remoteport);/* bind to incoming port */ -if (socket->ops->bind (socket, (struct sockaddr *)&hc->sin_local, +if (socket->ops->bind (socket, (struct sockaddr_unspec *)&hc->sin_local,sizeof (hc->sin_local))) {printk (KERN_ERR "%s: Failed to bind socket to port %d.\n" , __func__, hc->localport);
drivers/isdn/mISDN/socket.c +2 -2
@@ -462,7 +462,7 @@ static int data_sock_getsockopt(struct socket *sock, int level, int optname, }static int -data_sock_bind (struct socket *sock,struct sockaddr *addr,int addr_len) +data_sock_bind (struct socket *sock,struct sockaddr_unspec *addr,int addr_len) {struct sockaddr_mISDN *maddr = (struct sockaddr_mISDN *) addr;struct sock *sk = sock->sk;
@@ -696,7 +696,7 @@ base_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) }static int -base_sock_bind (struct socket *sock,struct sockaddr *addr,int addr_len) +base_sock_bind (struct socket *sock,struct sockaddr_unspec *addr,int addr_len) {struct sockaddr_mISDN *maddr = (struct sockaddr_mISDN *) addr;struct sock *sk = sock->sk;
drivers/net/ppp/pptp.c +2 -2
@@ -382,8 +382,8 @@ static int pptp_rcv(struct sk_buff *skb)return NET_RX_DROP ; } -static int pptp_bind (struct socket *sock,struct sockaddr *uservaddr, -int sockaddr_len) +static int pptp_bind (struct socket *sock,struct sockaddr_unspec *uservaddr, +int sockaddr_len) {struct sock *sk = sock->sk;struct sockaddr_pppox *sp = (struct sockaddr_pppox *) uservaddr;
drivers/nvme/host/tcp.c +1 -1
@@ -1831,7 +1831,7 @@ static int nvme_tcp_alloc_queue(struct nvme_ctrl *nctrl, int qid,sk_set_memalloc (queue->sock->sk);if (nctrl->opts->mask &NVMF_OPT_HOST_TRADDR ) { - ret =kernel_bind (queue->sock, (struct sockaddr *)&ctrl->src_addr, + ret =kernel_bind (queue->sock, (struct sockaddr_unspec *)&ctrl->src_addr,sizeof (ctrl->src_addr));if (ret) { dev_err(nctrl->device,
drivers/nvme/target/tcp.c +1 -1
@@ -2055,7 +2055,7 @@ static int nvmet_tcp_add_port(struct nvmet_port *nport)if (so_priority >0 )sock_set_priority (port->sock->sk, so_priority); - ret =kernel_bind (port->sock, (struct sockaddr *)&port->addr, + ret =kernel_bind (port->sock, (struct sockaddr_unspec *)&port->addr,sizeof (port->addr));if (ret) {pr_err ("failed to bind port socket %d\n" , ret);
drivers/target/iscsi/iscsi_target_login.c +1 -1
@@ -822,7 +822,7 @@ int iscsit_setup_np(sock_set_reuseaddr (sock->sk);ip_sock_set_freebind (sock->sk); - ret =kernel_bind (sock, (struct sockaddr *)&np->np_sockaddr, len); + ret =kernel_bind (sock, (struct sockaddr_unspec *)&np->np_sockaddr, len);if (ret <0 ) {pr_err ("kernel_bind() failed: %d\n" , ret); goto fail;
drivers/xen/pvcalls-back.c +1 -1
@@ -650,7 +650,7 @@ static int pvcalls_back_bind(struct xenbus_device *dev,if (ret <0 ) goto out; - ret =inet_bind (map->sock, (struct sockaddr *)&req->u.bind.addr, + ret =inet_bind (map->sock, (struct sockaddr_unspec *)&req->u.bind.addr, req->u.bind.len);if (ret <0 ) goto out;
fs/afs/rxrpc.c +3 -3
@@ -82,16 +82,16 @@ int afs_open_socket(struct afs_net *net)if (ret <0 )pr_err ("Couldn't create RxGK CM key: %d\n" , ret); - ret =kernel_bind (socket, (struct sockaddr *) &srx,sizeof (srx)); + ret =kernel_bind (socket, (struct sockaddr_unspec *) &srx,sizeof (srx));if (ret == -EADDRINUSE ) { srx.transport.sin6.sin6_port =0 ; - ret =kernel_bind (socket, (struct sockaddr *) &srx,sizeof (srx)); + ret =kernel_bind (socket, (struct sockaddr_unspec *) &srx,sizeof (srx)); }if (ret <0 ) goto error_2; srx.srx_service =YFS_CM_SERVICE ; - ret =kernel_bind (socket, (struct sockaddr *) &srx,sizeof (srx)); + ret =kernel_bind (socket, (struct sockaddr_unspec *) &srx,sizeof (srx));if (ret <0 ) goto error_2;
fs/dlm/lowcomms.c +3 -3
@@ -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, addr, addr_len); + result =kernel_bind (sock, (struct sockaddr_unspec *)addr, addr_len);else result =sock_bind_add (sock->sk, addr, addr_len);
@@ -1813,7 +1813,7 @@ static int dlm_tcp_bind(struct socket *sock)memcpy (&src_addr, &dlm_local_addr[0 ],sizeof (src_addr));make_sockaddr (&src_addr,0 , &addr_len); - result =kernel_bind (sock, (struct sockaddr *)&src_addr, + result =kernel_bind (sock, (struct sockaddr_unspec *)&src_addr, addr_len);if (result <0 ) {/* This *may* not indicate a critical error */
@@ -1852,7 +1852,7 @@ static int dlm_tcp_listen_bind(struct socket *sock)/* Bind to our port */ make_sockaddr (&dlm_local_addr[0 ], dlm_config.ci_tcp_port, &addr_len); -return kernel_bind (sock, (struct sockaddr *)&dlm_local_addr[0 ], +return kernel_bind (sock, (struct sockaddr_unspec *)&dlm_local_addr[0 ], addr_len); }
fs/ocfs2/cluster/tcp.c +2 -2
@@ -1615,7 +1615,7 @@ static void o2net_start_connect(struct work_struct *work) myaddr.sin_addr.s_addr = mynode->nd_ipv4_address; myaddr.sin_port =htons (0 );/* any port */ - ret = sock->ops->bind (sock, (struct sockaddr *)&myaddr, + ret = sock->ops->bind (sock, (struct sockaddr_unspec *)&myaddr,sizeof (myaddr));if (ret) { mlog(ML_ERROR, "bind failed with %d at address %pI4\n",
@@ -2002,7 +2002,7 @@ static int o2net_open_listening_sock(__be32 addr, __be16 port)INIT_WORK (&o2net_listen_work, o2net_accept_many); sock->sk->sk_reuse =SK_CAN_REUSE ; - ret = sock->ops->bind (sock, (struct sockaddr *)&sin,sizeof (sin)); + ret = sock->ops->bind (sock, (struct sockaddr_unspec *)&sin,sizeof (sin));if (ret <0 ) {printk (KERN_ERR "o2net: Error %d while binding socket at " "%pI4:%u\n" , ret, &addr,ntohs (port));
fs/smb/client/connect.c +1 -1
@@ -3112,7 +3112,7 @@ bind_socket(struct TCP_Server_Info *server)struct socket *socket = server->ssocket; rc =kernel_bind (socket, - (struct sockaddr *) &server->srcaddr, + (struct sockaddr_unspec *) &server->srcaddr,sizeof (server->srcaddr));if (rc <0 ) {struct sockaddr_in *saddr4;
fs/smb/server/transport_tcp.c +2 -2
@@ -519,10 +519,10 @@ static int create_socket(struct interface *iface) }if (ipv4) - ret =kernel_bind (ksmbd_socket, (struct sockaddr *)&sin, + ret =kernel_bind (ksmbd_socket, (struct sockaddr_unspec *)&sin,sizeof (sin));else - ret =kernel_bind (ksmbd_socket, (struct sockaddr *)&sin6, + ret =kernel_bind (ksmbd_socket, (struct sockaddr_unspec *)&sin6,sizeof (sin6));if (ret) {pr_err ("Failed to bind socket: %d\n" , ret);
net/9p/trans_fd.c +1 -1
@@ -966,7 +966,7 @@ static int p9_bind_privport(struct socket *sock) ((struct sockaddr_in *)&stor)->sin_port =htons ((ushort )port); else ((struct sockaddr_in6 *)&stor)->sin6_port =htons ((ushort )port); - err =kernel_bind (sock, (struct sockaddr *)&stor,sizeof (stor)); + err =kernel_bind (sock, (struct sockaddr_unspec *)&stor,sizeof (stor));if (err != -EADDRINUSE )break ; }
net/appletalk/ddp.c +1 -1
@@ -1149,7 +1149,7 @@ static int atalk_autobind(struct sock *sk) }/* Set the address 'our end' of the connection */ -static int atalk_bind (struct socket *sock,struct sockaddr *uaddr,int addr_len) +static int atalk_bind (struct socket *sock,struct sockaddr_unspec *uaddr,int addr_len) {struct sockaddr_at *addr = (struct sockaddr_at *)uaddr;struct sock *sk = sock->sk;
net/atm/pvc.c +2 -2
@@ -24,7 +24,7 @@ static int pvc_shutdown(struct socket *sock, int how)return 0 ; } -static int pvc_bind (struct socket *sock,struct sockaddr *sockaddr, +static int pvc_bind (struct socket *sock,struct sockaddr_unspec *sockaddr,int sockaddr_len) {struct sock *sk = sock->sk;
@@ -59,7 +59,7 @@ static int pvc_bind(struct socket *sock, struct sockaddr *sockaddr,static int pvc_connect (struct socket *sock,struct sockaddr *sockaddr,int sockaddr_len,int flags) { -return pvc_bind (sock, sockaddr, sockaddr_len); +return pvc_bind (sock, (struct sockaddr_unspec *)sockaddr, sockaddr_len); } static int pvc_setsockopt(struct socket *sock, int level, int optname,
net/atm/svc.c +1 -1
@@ -97,7 +97,7 @@ static int svc_release(struct socket *sock)return 0 ; } -static int svc_bind (struct socket *sock,struct sockaddr *sockaddr, +static int svc_bind (struct socket *sock,struct sockaddr_unspec *sockaddr,int sockaddr_len) {DEFINE_WAIT (wait);
net/ax25/af_ax25.c +1 -1
@@ -1094,7 +1094,7 @@ static int ax25_release(struct socket *sock)* that we've implemented support for SO_BINDTODEVICE. It is however small * and trivially backward compatible. */ -static int ax25_bind (struct socket *sock,struct sockaddr *uaddr,int addr_len) +static int ax25_bind (struct socket *sock,struct sockaddr_unspec *uaddr,int addr_len) {struct sock *sk = sock->sk;struct full_sockaddr_ax25 *addr = (struct full_sockaddr_ax25 *)uaddr;
net/bluetooth/hci_sock.c +1 -1
@@ -1185,7 +1185,7 @@ static int hci_sock_compat_ioctl(struct socket *sock, unsigned int cmd, }#endif -static int hci_sock_bind (struct socket *sock,struct sockaddr *addr, +static int hci_sock_bind (struct socket *sock,struct sockaddr_unspec *addr,int addr_len) {struct sockaddr_hci haddr;
net/bluetooth/iso.c +2 -2
@@ -944,7 +944,7 @@ static int iso_sock_create(struct net *net, struct socket *sock, int protocol,return 0 ; } -static int iso_sock_bind_bc (struct socket *sock,struct sockaddr *addr, +static int iso_sock_bind_bc (struct socket *sock,struct sockaddr_unspec *addr,int addr_len) {struct sockaddr_iso *sa = (struct sockaddr_iso *)addr;
@@ -1022,7 +1022,7 @@ static int iso_sock_bind_pa_sk(struct sock *sk, struct sockaddr_iso *sa,return err; } -static int iso_sock_bind (struct socket *sock,struct sockaddr *addr, +static int iso_sock_bind (struct socket *sock,struct sockaddr_unspec *addr,int addr_len) {struct sockaddr_iso *sa = (struct sockaddr_iso *)addr;
net/bluetooth/l2cap_sock.c +1 -1
@@ -80,7 +80,7 @@ static int l2cap_validate_le_psm(u16 psm)return 0 ; } -static int l2cap_sock_bind (struct socket *sock,struct sockaddr *addr,int alen) +static int l2cap_sock_bind (struct socket *sock,struct sockaddr_unspec *addr,int alen) {struct sock *sk = sock->sk;struct l2cap_chan *chan =l2cap_pi (sk)->chan;
net/bluetooth/rfcomm/core.c +2 -2
@@ -781,7 +781,7 @@ static struct rfcomm_session *rfcomm_session_create(bdaddr_t *src, addr.l2_psm =0 ; addr.l2_cid =0 ; addr.l2_bdaddr_type =BDADDR_BREDR ; - *err =kernel_bind (sock, (struct sockaddr *) &addr,sizeof (addr)); + *err =kernel_bind (sock, (struct sockaddr_unspec *)&addr,sizeof (addr));if (*err <0 ) goto failed;
@@ -2068,7 +2068,7 @@ static int rfcomm_add_listener(bdaddr_t *ba) addr.l2_psm =cpu_to_le16 (L2CAP_PSM_RFCOMM ); addr.l2_cid =0 ; addr.l2_bdaddr_type =BDADDR_BREDR ; - err =kernel_bind (sock, (struct sockaddr *) &addr,sizeof (addr)); + err =kernel_bind (sock, (struct sockaddr_unspec *)&addr,sizeof (addr));if (err <0 ) {BT_ERR ("Bind failed %d" , err); goto failed;
net/bluetooth/rfcomm/sock.c +1 -1
@@ -324,7 +324,7 @@ static int rfcomm_sock_create(struct net *net, struct socket *sock,return 0 ; } -static int rfcomm_sock_bind (struct socket *sock,struct sockaddr *addr,int addr_len) +static int rfcomm_sock_bind (struct socket *sock,struct sockaddr_unspec *addr,int addr_len) {struct sockaddr_rc sa;struct sock *sk = sock->sk;
net/bluetooth/sco.c +1 -1
@@ -605,7 +605,7 @@ static int sco_sock_create(struct net *net, struct socket *sock, int protocol,return 0 ; } -static int sco_sock_bind (struct socket *sock,struct sockaddr *addr, +static int sco_sock_bind (struct socket *sock,struct sockaddr_unspec *addr,int addr_len) {struct sockaddr_sco *sa = (struct sockaddr_sco *) addr;
net/can/isotp.c +1 -1
@@ -1246,7 +1246,7 @@ static int isotp_release(struct socket *sock)return 0 ; } -static int isotp_bind (struct socket *sock,struct sockaddr *uaddr,int len) +static int isotp_bind (struct socket *sock,struct sockaddr_unspec *uaddr,int len) {struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;struct sock *sk = sock->sk;
net/can/j1939/socket.c +1 -1
@@ -440,7 +440,7 @@ static int j1939_sk_sanity_check(struct sockaddr_can *addr, int len)return 0 ; } -static int j1939_sk_bind (struct socket *sock,struct sockaddr *uaddr,int len) +static int j1939_sk_bind (struct socket *sock,struct sockaddr_unspec *uaddr,int len) {struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;struct j1939_sock *jsk =j1939_sk (sock->sk);
net/can/raw.c +1 -1
@@ -449,7 +449,7 @@ static int raw_release(struct socket *sock)return 0 ; } -static int raw_bind (struct socket *sock,struct sockaddr *uaddr,int len) +static int raw_bind (struct socket *sock,struct sockaddr_unspec *uaddr,int len) {struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;struct sock *sk = sock->sk;
net/core/sock.c +1 -1
@@ -3420,7 +3420,7 @@ EXPORT_SYMBOL_GPL(sk_set_peek_off);* function, some default processing is provided. */ -int sock_no_bind (struct socket *sock,struct sockaddr *saddr,int len) +int sock_no_bind (struct socket *sock,struct sockaddr_unspec *saddr,int len) {return -EOPNOTSUPP ; }
net/ieee802154/socket.c +2 -2
@@ -96,13 +96,13 @@ static int ieee802154_sock_sendmsg(struct socket *sock, struct msghdr *msg,return sk->sk_prot->sendmsg (sk, msg, len); } -static int ieee802154_sock_bind (struct socket *sock,struct sockaddr *uaddr, +static int ieee802154_sock_bind (struct socket *sock,struct sockaddr_unspec *uaddr,int addr_len) {struct sock *sk = sock->sk;if (sk->sk_prot->bind) -return sk->sk_prot->bind (sk, uaddr, addr_len); +return sk->sk_prot->bind (sk, (struct sockaddr *)uaddr, addr_len);return sock_no_bind (sock, uaddr, addr_len); }
net/ipv4/af_inet.c +2 -2
@@ -464,9 +464,9 @@ int inet_bind_sk(struct sock *sk, struct sockaddr *uaddr, int addr_len)return __inet_bind (sk, uaddr, addr_len, flags); } -int inet_bind (struct socket *sock,struct sockaddr *uaddr,int addr_len) +int inet_bind (struct socket *sock,struct sockaddr_unspec *uaddr,int addr_len) { -return inet_bind_sk (sock->sk, uaddr, addr_len); +return inet_bind_sk (sock->sk, (struct sockaddr *)uaddr, addr_len); }EXPORT_SYMBOL (inet_bind);
net/ipv4/udp_tunnel_core.c +1 -1
@@ -29,7 +29,7 @@ int udp_sock_create4(struct net *net, struct udp_port_cfg *cfg, udp_addr.sin_family =AF_INET ; udp_addr.sin_addr = cfg->local_ip; udp_addr.sin_port = cfg->local_udp_port; - err =kernel_bind (sock, (struct sockaddr *)&udp_addr, + err =kernel_bind (sock, (struct sockaddr_unspec *)&udp_addr,sizeof (udp_addr));if (err <0 ) goto error;
net/ipv6/af_inet6.c +2 -2
@@ -465,9 +465,9 @@ 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 *uaddr,int addr_len) +int inet6_bind (struct socket *sock,struct sockaddr_unspec *uaddr,int addr_len) { -return inet6_bind_sk (sock->sk, uaddr, addr_len); +return inet6_bind_sk (sock->sk, (struct sockaddr *)uaddr, addr_len); }EXPORT_SYMBOL (inet6_bind);
net/ipv6/ip6_udp_tunnel.c +1 -1
@@ -40,7 +40,7 @@ int udp_sock_create6(struct net *net, struct udp_port_cfg *cfg,memcpy (&udp6_addr.sin6_addr, &cfg->local_ip6,sizeof (udp6_addr.sin6_addr)); udp6_addr.sin6_port = cfg->local_udp_port; - err =kernel_bind (sock, (struct sockaddr *)&udp6_addr, + err =kernel_bind (sock, (struct sockaddr_unspec *)&udp6_addr,sizeof (udp6_addr));if (err <0 ) goto error;
net/iucv/af_iucv.c +1 -1
@@ -562,7 +562,7 @@ static void __iucv_auto_name(struct iucv_sock *iucv) }/* Bind an unbound socket */ -static int iucv_sock_bind (struct socket *sock,struct sockaddr *addr, +static int iucv_sock_bind (struct socket *sock,struct sockaddr_unspec *addr,int addr_len) { DECLARE_SOCKADDR(struct sockaddr_iucv *, sa, addr);
net/l2tp/l2tp_core.c +2 -2
@@ -1503,7 +1503,7 @@ static int l2tp_tunnel_sock_create(struct net *net,memcpy (&ip6_addr.l2tp_addr, cfg->local_ip6,sizeof (ip6_addr.l2tp_addr)); ip6_addr.l2tp_conn_id = tunnel_id; - err =kernel_bind (sock, (struct sockaddr *)&ip6_addr, + err =kernel_bind (sock, (struct sockaddr_unspec *)&ip6_addr,sizeof (ip6_addr));if (err <0 ) goto out;
@@ -1530,7 +1530,7 @@ static int l2tp_tunnel_sock_create(struct net *net, ip_addr.l2tp_family =AF_INET ; ip_addr.l2tp_addr = cfg->local_ip; ip_addr.l2tp_conn_id = tunnel_id; - err =kernel_bind (sock, (struct sockaddr *)&ip_addr, + err =kernel_bind (sock, (struct sockaddr_unspec *)&ip_addr,sizeof (ip_addr));if (err <0 ) goto out;
net/llc/af_llc.c +1 -1
@@ -337,7 +337,7 @@ static int llc_ui_autobind(struct socket *sock, struct sockaddr_llc *addr)* otherwise all hell will break loose. * Returns: 0 upon success, negative otherwise. */ -static int llc_ui_bind (struct socket *sock,struct sockaddr *uaddr,int addrlen) +static int llc_ui_bind (struct socket *sock,struct sockaddr_unspec *uaddr,int addrlen) {struct sockaddr_llc *addr = (struct sockaddr_llc *)uaddr;struct sock *sk = sock->sk;
net/mctp/af_mctp.c +1 -1
@@ -49,7 +49,7 @@ static bool mctp_sockaddr_ext_is_ok(const struct sockaddr_mctp_ext *addr) !addr->__smctp_pad0[2 ]; } -static int mctp_bind (struct socket *sock,struct sockaddr *addr,int addrlen) +static int mctp_bind (struct socket *sock,struct sockaddr_unspec *addr,int addrlen) {struct sock *sk = sock->sk; struct mctp_sock *msk = container_of(sk, struct mctp_sock, sk);
net/mctp/test/route-test.c +1 -1
@@ -205,7 +205,7 @@ static void __mctp_route_test_init(struct kunit *test, addr.smctp_network = netid; addr.smctp_addr.s_addr =8 ; addr.smctp_type =0 ; - rc =kernel_bind (sock, (struct sockaddr *)&addr,sizeof (addr)); + rc =kernel_bind (sock, (struct sockaddr_unspec *)&addr,sizeof (addr));KUNIT_ASSERT_EQ (test, rc,0 ); *devp = dev;
net/mptcp/protocol.c +3 -3
@@ -3832,7 +3832,7 @@ static struct proto mptcp_prot = { .no_autobind = true, }; -static int mptcp_bind (struct socket *sock,struct sockaddr *uaddr,int addr_len) +static int mptcp_bind (struct socket *sock,struct sockaddr_unspec *uaddr,int addr_len) {struct mptcp_sock *msk =mptcp_sk (sock->sk);struct sock *ssk, *sk = sock->sk;
@@ -3846,10 +3846,10 @@ static int mptcp_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) }if (sk->sk_family ==AF_INET ) - err =inet_bind_sk (ssk, uaddr, addr_len); + err =inet_bind_sk (ssk, (struct sockaddr *)uaddr, addr_len);#if IS_ENABLED (CONFIG_MPTCP_IPV6 ) else if (sk->sk_family == AF_INET6) - err =inet6_bind_sk (ssk, uaddr, addr_len); + err =inet6_bind_sk (ssk, (struct sockaddr *)uaddr, addr_len);#endif if (!err)mptcp_copy_inaddrs (sk, ssk);
net/mptcp/subflow.c +1 -1
@@ -1660,7 +1660,7 @@ int __mptcp_subflow_connect(struct sock *sk, const struct mptcp_pm_local *local, addrlen =sizeof (struct sockaddr_in6 );#endif ssk->sk_bound_dev_if = local->ifindex; - err =kernel_bind (sf, (struct sockaddr *)&addr, addrlen); + err =kernel_bind (sf, (struct sockaddr_unspec *)&addr, addrlen);if (err) {MPTCP_INC_STATS (sock_net (sk),MPTCP_MIB_JOINSYNTXBINDERR ); pr_debug("msk=%p local=%d remote=%d bind error: %d\n",
net/netfilter/ipvs/ip_vs_sync.c +2 -2
@@ -1435,7 +1435,7 @@ static int bind_mcastif_addr(struct socket *sock, struct net_device *dev) sin.sin_addr.s_addr = addr; sin.sin_port =0 ; -return kernel_bind (sock, (struct sockaddr *)&sin,sizeof (sin)); +return kernel_bind (sock, (struct sockaddr_unspec *)&sin,sizeof (sin)); } static void get_mcast_sockaddr(union ipvs_sockaddr *sa, int *salen,
@@ -1542,7 +1542,7 @@ static int make_receive_sock(struct netns_ipvs *ipvs, int id,get_mcast_sockaddr (&mcast_addr, &salen, &ipvs->bcfg, id); sock->sk->sk_bound_dev_if = dev->ifindex; - result =kernel_bind (sock, (struct sockaddr *)&mcast_addr, salen); + result =kernel_bind (sock, (struct sockaddr_unspec *)&mcast_addr, salen);if (result <0 ) {pr_err ("Error binding to the multicast addr\n" ); goto error;
net/netlink/af_netlink.c +1 -1
@@ -968,7 +968,7 @@ static void netlink_undo_bind(int group, long unsigned int groups, nlk->netlink_unbind (sock_net (sk), undo +1 ); } -static int netlink_bind (struct socket *sock,struct sockaddr *addr, +static int netlink_bind (struct socket *sock,struct sockaddr_unspec *addr,int addr_len) {struct sock *sk = sock->sk;
net/netrom/af_netrom.c +1 -1
@@ -561,7 +561,7 @@ static int nr_release(struct socket *sock)return 0 ; } -static int nr_bind (struct socket *sock,struct sockaddr *uaddr,int addr_len) +static int nr_bind (struct socket *sock,struct sockaddr_unspec *uaddr,int addr_len) {struct sock *sk = sock->sk;struct nr_sock *nr =nr_sk (sk);
net/nfc/llcp_sock.c +2 -2
@@ -56,7 +56,7 @@ static struct proto llcp_sock_proto = { .obj_size = sizeof(struct nfc_llcp_sock), }; -static int llcp_sock_bind (struct socket *sock,struct sockaddr *addr,int alen) +static int llcp_sock_bind (struct socket *sock,struct sockaddr_unspec *addr,int alen) {struct sock *sk = sock->sk;struct nfc_llcp_sock *llcp_sock =nfc_llcp_sock (sk);
@@ -146,7 +146,7 @@ static int llcp_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)return ret; } -static int llcp_raw_sock_bind (struct socket *sock,struct sockaddr *addr, +static int llcp_raw_sock_bind (struct socket *sock,struct sockaddr_unspec *addr,int alen) {struct sock *sk = sock->sk;
net/packet/af_packet.c +6 -5
@@ -3279,11 +3279,12 @@ static int packet_do_bind(struct sock *sk, const char *name, int ifindex,* Bind a packet socket to a device */ -static int packet_bind_spkt (struct socket *sock,struct sockaddr *uaddr, +static int packet_bind_spkt (struct socket *sock,struct sockaddr_unspec *uaddr,int addr_len) {struct sock *sk = sock->sk; -char name[sizeof (uaddr->sa_data_min) +1 ]; +struct sockaddr *sa = (struct sockaddr *)uaddr; +char name[sizeof (sa->sa_data_min) +1 ];/* * Check legality
@@ -3294,13 +3295,13 @@ static int packet_bind_spkt(struct socket *sock, struct sockaddr *uaddr,/* uaddr->sa_data comes from the userspace, it's not guaranteed to be * zero-terminated. */ -memcpy (name, uaddr->sa_data,sizeof (uaddr->sa_data_min)); - name[sizeof (uaddr->sa_data_min)] =0 ; +memcpy (name, sa->sa_data,sizeof (sa->sa_data_min)); + name[sizeof (sa->sa_data_min)] =0 ;return packet_do_bind (sk, name,0 ,0 ); } -static int packet_bind (struct socket *sock,struct sockaddr *uaddr,int addr_len) +static int packet_bind (struct socket *sock,struct sockaddr_unspec *uaddr,int addr_len) {struct sockaddr_ll *sll = (struct sockaddr_ll *)uaddr;struct sock *sk = sock->sk;
net/phonet/socket.c +4 -4
@@ -153,7 +153,7 @@ EXPORT_SYMBOL(pn_sock_unhash);static DEFINE_MUTEX (port_mutex); -static int pn_socket_bind (struct socket *sock,struct sockaddr *addr,int len) +static int pn_socket_bind (struct socket *sock,struct sockaddr_unspec *addr,int len) {struct sock *sk = sock->sk;struct pn_sock *pn =pn_sk (sk);
@@ -163,7 +163,7 @@ static int pn_socket_bind(struct socket *sock, struct sockaddr *addr, int len)u8 saddr;if (sk->sk_prot->bind) -return sk->sk_prot->bind (sk, addr, len); +return sk->sk_prot->bind (sk, (struct sockaddr *)addr, len);if (len <sizeof (struct sockaddr_pn ))return -EINVAL ;
@@ -206,8 +206,8 @@ static int pn_socket_autobind(struct socket *sock)memset (&sa,0 ,sizeof (sa)); sa.spn_family =AF_PHONET ; - err =pn_socket_bind (sock, (struct sockaddr *)&sa, -sizeof (struct sockaddr_pn )); + err =pn_socket_bind (sock, (struct sockaddr_unspec *)&sa, +sizeof (struct sockaddr_pn ));if (err != -EINVAL )return err;BUG_ON (!pn_port (pn_sk (sock->sk)->sobject));
net/qrtr/af_qrtr.c +1 -1
@@ -824,7 +824,7 @@ static int qrtr_autobind(struct socket *sock) }/* Bind socket to specified sockaddr. */ -static int qrtr_bind (struct socket *sock,struct sockaddr *saddr,int len) +static int qrtr_bind (struct socket *sock,struct sockaddr_unspec *saddr,int len) { DECLARE_SOCKADDR(struct sockaddr_qrtr *, addr, saddr);struct qrtr_sock *ipc =qrtr_sk (sock->sk);
net/qrtr/ns.c +1 -1
@@ -714,7 +714,7 @@ int qrtr_ns_init(void) sq.sq_port =QRTR_PORT_CTRL ; qrtr_ns.local_node = sq.sq_node; - ret =kernel_bind (qrtr_ns.sock, (struct sockaddr *)&sq,sizeof (sq)); + ret =kernel_bind (qrtr_ns.sock, (struct sockaddr_unspec *)&sq,sizeof (sq));if (ret <0 ) {pr_err ("failed to bind to socket\n" ); goto err_wq;
net/rds/bind.c +1 -1
@@ -160,7 +160,7 @@ void rds_remove_bound(struct rds_sock *rs) rs->rs_bound_addr = in6addr_any; } -int rds_bind (struct socket *sock,struct sockaddr *uaddr,int addr_len) +int rds_bind (struct socket *sock,struct sockaddr_unspec *uaddr,int addr_len) {struct sock *sk = sock->sk;struct rds_sock *rs =rds_sk_to_rs (sk);
net/rds/tcp_connect.c +1 -1
@@ -145,7 +145,7 @@ int rds_tcp_conn_path_connect(struct rds_conn_path *cp) addrlen =sizeof (sin); } - ret =kernel_bind (sock, addr, addrlen); + ret =kernel_bind (sock, (struct sockaddr_unspec *)addr, addrlen);if (ret) {rdsdebug ("bind failed with %d at address %pI6c\n" , ret, &conn->c_laddr);
net/rds/tcp_listen.c +1 -1
@@ -290,7 +290,7 @@ struct socket *rds_tcp_listen_init(struct net *net, bool isv6) addr_len =sizeof (*sin); } - ret =kernel_bind (sock, (struct sockaddr *)&ss, addr_len); + ret =kernel_bind (sock, (struct sockaddr_unspec *)&ss, addr_len);if (ret <0 ) {rdsdebug ("could not bind %s listener socket: %d\n" , isv6 ?"IPv6" :"IPv4" , ret);
net/rose/af_rose.c +1 -1
@@ -693,7 +693,7 @@ static int rose_release(struct socket *sock)return 0 ; } -static int rose_bind (struct socket *sock,struct sockaddr *uaddr,int addr_len) +static int rose_bind (struct socket *sock,struct sockaddr_unspec *uaddr,int addr_len) {struct sock *sk = sock->sk;struct rose_sock *rose =rose_sk (sk);
net/rxrpc/af_rxrpc.c +1 -1
@@ -127,7 +127,7 @@ static int rxrpc_validate_address(struct rxrpc_sock *rx,/* * bind a local address to an RxRPC socket */ -static int rxrpc_bind (struct socket *sock,struct sockaddr *saddr,int len) +static int rxrpc_bind (struct socket *sock,struct sockaddr_unspec *saddr,int len) {struct sockaddr_rxrpc *srx = (struct sockaddr_rxrpc *)saddr;struct rxrpc_local *local;
net/rxrpc/rxperf.c +1 -1
@@ -211,7 +211,7 @@ static int rxperf_open_socket(void) ret =rxrpc_sock_set_security_keyring (socket->sk, rxperf_sec_keyring); - ret =kernel_bind (socket, (struct sockaddr *)&srx,sizeof (srx)); + ret =kernel_bind (socket, (struct sockaddr_unspec *)&srx,sizeof (srx));if (ret <0 ) goto error_2;
net/smc/af_smc.c +1 -1
@@ -421,7 +421,7 @@ static struct sock *smc_sock_alloc(struct net *net, struct socket *sock,return sk; } -int smc_bind (struct socket *sock,struct sockaddr *uaddr, +int smc_bind (struct socket *sock,struct sockaddr_unspec *uaddr,int addr_len) {struct sockaddr_in *addr = (struct sockaddr_in *)uaddr;
net/socket.c +3 -3
@@ -1872,7 +1872,7 @@ int __sys_bind_socket(struct socket *sock, struct sockaddr_storage *address, addrlen);if (!err) err =READ_ONCE (sock->ops)->bind (sock, - (struct sockaddr *)address, + (struct sockaddr_unspec *)address, addrlen);return err; }
@@ -3583,13 +3583,13 @@ static long compat_sock_ioctl(struct file *file, unsigned int cmd,* Returns 0 or an error. */ -int kernel_bind (struct socket *sock,struct sockaddr *addr,int addrlen) +int kernel_bind (struct socket *sock,struct sockaddr_unspec *addr,int addrlen) {struct sockaddr_storage address;memcpy (&address, addr, addrlen); -return READ_ONCE (sock->ops)->bind (sock, (struct sockaddr *)&address, +return READ_ONCE (sock->ops)->bind (sock, (struct sockaddr_unspec *)&address, addrlen); }EXPORT_SYMBOL (kernel_bind);
net/sunrpc/clnt.c +2 -2
@@ -1457,12 +1457,12 @@ static int rpc_sockname(struct net *net, struct sockaddr *sap, size_t salen,switch (sap->sa_family) {case AF_INET : err =kernel_bind (sock, - (struct sockaddr *)&rpc_inaddr_loopback, + (struct sockaddr_unspec *)&rpc_inaddr_loopback,sizeof (rpc_inaddr_loopback));break ;case AF_INET6 : err =kernel_bind (sock, - (struct sockaddr *)&rpc_in6addr_loopback, + (struct sockaddr_unspec *)&rpc_in6addr_loopback,sizeof (rpc_in6addr_loopback));break ;default :
net/sunrpc/svcsock.c +1 -1
@@ -1557,7 +1557,7 @@ static struct svc_xprt *svc_create_socket(struct svc_serv *serv,ip6_sock_set_v6only (sock->sk);if (type ==SOCK_STREAM ) sock->sk->sk_reuse =SK_CAN_REUSE ;/* allow address reuse */ - error =kernel_bind (sock, sin, len); + error =kernel_bind (sock, (struct sockaddr_unspec *)sin, len);if (error <0 ) goto bummer;
net/sunrpc/xprtsock.c +2 -2
@@ -1845,8 +1845,8 @@ static int xs_bind(struct sock_xprt *transport, struct socket *sock)memcpy (&myaddr, &transport->srcaddr, transport->xprt.addrlen); do { rpc_set_port((struct sockaddr *)&myaddr, port); - err = kernel_bind(sock, (struct sockaddr *)&myaddr, - transport->xprt.addrlen); + err = kernel_bind(sock, (struct sockaddr_unspec *)&myaddr, + transport->xprt.addrlen); if (err == 0) { if (transport->xprt.reuseport) transport->srcport = port;
net/tipc/socket.c +2 -2
@@ -710,7 +710,7 @@ int tipc_sk_bind(struct socket *sock, struct sockaddr *skaddr, int alen)return res; } -static int tipc_bind (struct socket *sock,struct sockaddr *skaddr,int alen) +static int tipc_bind (struct socket *sock,struct sockaddr_unspec *skaddr,int alen) {struct tipc_uaddr *ua = (struct tipc_uaddr *)skaddr;u32 atype = ua->addrtype;
@@ -726,7 +726,7 @@ static int tipc_bind(struct socket *sock, struct sockaddr *skaddr, int alen)return -EACCES ; } } -return tipc_sk_bind (sock, skaddr, alen); +return tipc_sk_bind (sock, (struct sockaddr *)skaddr, alen); }/**
net/unix/af_unix.c +2 -2
@@ -854,7 +854,7 @@ static int unix_listen(struct socket *sock, int backlog) }static int unix_release (struct socket *); -static int unix_bind (struct socket *,struct sockaddr *,int ); +static int unix_bind (struct socket *,struct sockaddr_unspec *,int );static int unix_stream_connect (struct socket *,struct sockaddr *,int addr_len,int flags);static int unix_socketpair (struct socket *,struct socket *);
@@ -1477,7 +1477,7 @@ static int unix_bind_abstract(struct sock *sk, struct sockaddr_un *sunaddr,return err; } -static int unix_bind (struct socket *sock,struct sockaddr *uaddr,int addr_len) +static int unix_bind (struct socket *sock,struct sockaddr_unspec *uaddr,int addr_len) {struct sockaddr_un *sunaddr = (struct sockaddr_un *)uaddr;struct sock *sk = sock->sk;
net/vmw_vsock/af_vsock.c +2 -2
@@ -987,7 +987,7 @@ static int vsock_release(struct socket *sock) }static int -vsock_bind (struct socket *sock,struct sockaddr *addr,int addr_len) +vsock_bind (struct socket *sock,struct sockaddr_unspec *addr,int addr_len) {int err;struct sock *sk;
@@ -995,7 +995,7 @@ vsock_bind(struct socket *sock, struct sockaddr *addr, int addr_len) sk = sock->sk; -if (vsock_addr_cast (addr, addr_len, &vm_addr) !=0 ) +if (vsock_addr_cast ((struct sockaddr *)addr, addr_len, &vm_addr) !=0 )return -EINVAL ;lock_sock (sk);
net/x25/af_x25.c +1 -1
@@ -670,7 +670,7 @@ static int x25_release(struct socket *sock)return 0 ; } -static int x25_bind (struct socket *sock,struct sockaddr *uaddr,int addr_len) +static int x25_bind (struct socket *sock,struct sockaddr_unspec *uaddr,int addr_len) {struct sock *sk = sock->sk;struct sockaddr_x25 *addr = (struct sockaddr_x25 *)uaddr;
net/xdp/xsk.c +1 -1
@@ -1241,7 +1241,7 @@ static bool xsk_validate_queues(struct xdp_sock *xs)return xs->fq_tmp && xs->cq_tmp; } -static int xsk_bind (struct socket *sock,struct sockaddr *addr,int addr_len) +static int xsk_bind (struct socket *sock,struct sockaddr_unspec *addr,int addr_len) {struct sockaddr_xdp *sxdp = (struct sockaddr_xdp *)addr;struct sock *sk = sock->sk;
tools/testing/selftests/bpf/test_kmods/bpf_testmod.c +1 -1
@@ -923,7 +923,7 @@ __bpf_kfunc int bpf_kfunc_call_kernel_bind(struct addr_args *args) goto out; } - err =kernel_bind (sock, (struct sockaddr *)&args->addr, args->addrlen); + err =kernel_bind (sock, (struct sockaddr_unspec *)&args->addr, args->addrlen); out:mutex_unlock (&sock_lock);
Signature · 1 line
2.34.1
PATCH v3 4/9 net: Convert proto_ops connect() callbacks to use sockaddr_unspec
In reply to Kees CookUpdate all struct proto_ops connect() callback function prototypes from "struct sockaddr *" to "struct sockaddr_unspec *" to avoid lying to the compiler about object sizes. Calls into struct proto handlers gain casts that will be removed in the struct proto conversion patch.
No binary changes expected.
--- include/linux/bpf-cgroup.h | 6 +++--- include/linux/net.h | 4 ++-- include/net/inet_common.h | 6 +++--- include/net/sctp/sctp.h | 2 +- include/net/sock.h | 2 +- include/net/vsock_addr.h | 2 +- net/smc/smc.h | 2 +- drivers/block/drbd/drbd_receiver.c | 2 +- drivers/infiniband/hw/erdma/erdma_cm.c | 2 +- drivers/infiniband/sw/siw/siw_cm.c | 2 +- drivers/net/ppp/pppoe.c | 4 ++-- drivers/net/ppp/pptp.c | 4 ++-- drivers/net/wireless/ath/ath10k/qmi.c | 2 +- drivers/net/wireless/ath/ath11k/qmi.c | 2 +- drivers/net/wireless/ath/ath12k/qmi.c | 2 +- drivers/nvme/host/tcp.c | 2 +- drivers/slimbus/qcom-ngd-ctrl.c | 2 +- drivers/xen/pvcalls-back.c | 2 +- fs/coredump.c | 2 +- fs/dlm/lowcomms.c | 2 +- fs/ocfs2/cluster/tcp.c | 2 +- fs/smb/client/connect.c | 2 +- net/9p/trans_fd.c | 6 +++--- net/appletalk/ddp.c | 2 +- net/atm/pvc.c | 4 ++-- net/atm/svc.c | 2 +- net/ax25/af_ax25.c | 2 +- net/bluetooth/iso.c | 2 +- net/bluetooth/l2cap_sock.c | 2 +- net/bluetooth/rfcomm/core.c | 2 +- net/bluetooth/rfcomm/sock.c | 3 ++- net/bluetooth/sco.c | 2 +- net/caif/caif_socket.c | 2 +- net/can/bcm.c | 2 +- net/can/j1939/socket.c | 2 +- net/ceph/messenger.c | 2 +- net/core/sock.c | 2 +- net/ieee802154/socket.c | 4 ++-- net/ipv4/af_inet.c | 14 +++++++------- net/ipv4/tcp.c | 2 +- net/ipv4/udp_tunnel_core.c | 2 +- net/ipv6/ip6_udp_tunnel.c | 2 +- net/iucv/af_iucv.c | 4 ++-- net/l2tp/l2tp_core.c | 4 ++-- net/l2tp/l2tp_ppp.c | 2 +- net/llc/af_llc.c | 2 +- net/mctp/af_mctp.c | 2 +- net/mctp/test/utils.c | 5 +++-- net/mptcp/subflow.c | 2 +- net/netfilter/ipvs/ip_vs_sync.c | 2 +- net/netlink/af_netlink.c | 2 +- net/netrom/af_netrom.c | 4 ++-- net/nfc/llcp_sock.c | 2 +- net/nfc/rawsock.c | 2 +- net/phonet/socket.c | 6 +++--- net/qrtr/af_qrtr.c | 2 +- net/rds/af_rds.c | 2 +- net/rds/tcp_connect.c | 2 +- net/rose/af_rose.c | 2 +- net/rxrpc/af_rxrpc.c | 2 +- net/sctp/socket.c | 4 ++-- net/smc/af_smc.c | 4 ++-- net/socket.c | 8 ++++---- net/sunrpc/clnt.c | 2 +- net/sunrpc/xprtsock.c | 5 +++-- net/tipc/socket.c | 2 +- net/unix/af_unix.c | 8 ++++---- net/vmw_vsock/af_vsock.c | 6 +++--- net/vmw_vsock/vsock_addr.c | 2 +- net/x25/af_x25.c | 2 +- samples/qmi/qmi_sample_client.c | 2 +- .../testing/selftests/bpf/test_kmods/bpf_testmod.c | 2 +- 72 files changed, 109 insertions(+), 106 deletions(-)
include/linux/bpf-cgroup.h +3 -3
@@ -238,7 +238,7 @@ static inline bool cgroup_bpf_sock_enabled(struct sock *sk, ({ \int __ret =0 ; \if (cgroup_bpf_enabled (atype)) \ - __ret =__cgroup_bpf_run_filter_sock_addr (sk, uaddr, uaddrlen, \ + __ret =__cgroup_bpf_run_filter_sock_addr (sk, (struct sockaddr *)uaddr, uaddrlen, \ atype,NULL ,NULL ); \ __ret; \ })
@@ -248,7 +248,7 @@ static inline bool cgroup_bpf_sock_enabled(struct sock *sk,int __ret =0 ; \if (cgroup_bpf_enabled (atype)) { \lock_sock (sk); \ - __ret =__cgroup_bpf_run_filter_sock_addr (sk, uaddr, uaddrlen, \ + __ret =__cgroup_bpf_run_filter_sock_addr (sk, (struct sockaddr *)uaddr, uaddrlen, \ atype, t_ctx,NULL ); \release_sock (sk); \ } \
@@ -266,7 +266,7 @@ static inline bool cgroup_bpf_sock_enabled(struct sock *sk,int __ret =0 ; \if (cgroup_bpf_enabled (atype)) { \lock_sock (sk); \ - __ret =__cgroup_bpf_run_filter_sock_addr (sk, uaddr, uaddrlen, \ + __ret =__cgroup_bpf_run_filter_sock_addr (sk, (struct sockaddr *)uaddr, uaddrlen, \ atype,NULL , &__flags); \release_sock (sk); \if (__flags &BPF_RET_BIND_NO_CAP_NET_BIND_SERVICE ) \
include/linux/net.h +2 -2
@@ -166,7 +166,7 @@ struct proto_ops {struct sockaddr_unspec *myaddr, int sockaddr_len);int (*connect) (struct socket *sock, -struct sockaddr *vaddr, +struct sockaddr_unspec *vaddr,int sockaddr_len,int flags);int (*socketpair)(struct socket *sock1,struct socket *sock2);
@@ -348,7 +348,7 @@ int kernel_recvmsg(struct socket *sock, struct msghdr *msg, struct kvec *vec,int kernel_bind (struct socket *sock,struct sockaddr_unspec *addr,int addrlen);int kernel_listen (struct socket *sock,int backlog);int kernel_accept (struct socket *sock,struct socket **newsock,int flags); -int kernel_connect (struct socket *sock,struct sockaddr *addr,int addrlen, +int kernel_connect (struct socket *sock,struct sockaddr_unspec *addr,int addrlen,int flags);int kernel_getsockname (struct socket *sock,struct sockaddr *addr);int kernel_getpeername (struct socket *sock,struct sockaddr *addr);
include/net/inet_common.h +3 -3
@@ -23,11 +23,11 @@ struct sockaddr;struct socket ;int inet_release (struct socket *sock); -int inet_stream_connect (struct socket *sock,struct sockaddr *uaddr, +int inet_stream_connect (struct socket *sock,struct sockaddr_unspec *uaddr,int addr_len,int flags); -int __inet_stream_connect (struct socket *sock,struct sockaddr *uaddr, +int __inet_stream_connect (struct socket *sock,struct sockaddr_unspec *uaddr,int addr_len,int flags,int is_sendmsg); -int inet_dgram_connect (struct socket *sock,struct sockaddr *uaddr, +int inet_dgram_connect (struct socket *sock,struct sockaddr_unspec *uaddr,int addr_len,int flags);int inet_accept (struct socket *sock,struct socket *newsock,struct proto_accept_arg *arg);
include/net/sctp/sctp.h +1 -1
@@ -85,7 +85,7 @@ void sctp_udp_sock_stop(struct net *net);/* * sctp/socket.c */ -int sctp_inet_connect (struct socket *sock,struct sockaddr *uaddr, +int sctp_inet_connect (struct socket *sock,struct sockaddr_unspec *uaddr,int addr_len,int flags);int sctp_backlog_rcv (struct sock *sk,struct sk_buff *skb);int sctp_inet_listen (struct socket *sock,int backlog);
include/net/sock.h +1 -1
@@ -1902,7 +1902,7 @@ int sock_cmsg_send(struct sock *sk, struct msghdr *msg,* does not implement a particular function. */ int sock_no_bind (struct socket *sock,struct sockaddr_unspec *saddr,int len); -int sock_no_connect (struct socket *,struct sockaddr *,int ,int ); +int sock_no_connect (struct socket *sock,struct sockaddr_unspec *saddr,int len,int flags);int sock_no_socketpair (struct socket *,struct socket *);int sock_no_accept (struct socket *,struct socket *,struct proto_accept_arg *);int sock_no_getname (struct socket *,struct sockaddr *,int );
include/net/vsock_addr.h +1 -1
@@ -16,7 +16,7 @@ bool vsock_addr_bound(const struct sockaddr_vm *addr);void vsock_addr_unbind (struct sockaddr_vm *addr);bool vsock_addr_equals_addr (const struct sockaddr_vm *addr,const struct sockaddr_vm *other); -int vsock_addr_cast (const struct sockaddr *addr,size_t len, +int vsock_addr_cast (const struct sockaddr_unspec *addr,size_t len,struct sockaddr_vm **out_addr);#endif
net/smc/smc.h +1 -1
@@ -44,7 +44,7 @@ void smc_release_cb(struct sock *sk);int smc_release (struct socket *sock);int smc_bind (struct socket *sock,struct sockaddr_unspec *uaddr,int addr_len); -int smc_connect (struct socket *sock,struct sockaddr *addr, +int smc_connect (struct socket *sock,struct sockaddr_unspec *addr,int alen,int flags);int smc_accept (struct socket *sock,struct socket *new_sock,struct proto_accept_arg *arg);
drivers/block/drbd/drbd_receiver.c +1 -1
@@ -458,7 +458,7 @@ static struct socket *drbd_try_connect(struct drbd_connection *connection)* stay C_WF_CONNECTION, don't go Disconnecting! */ disconnect_on_error =0 ; what ="connect" ; - err = sock->ops->connect (sock, (struct sockaddr *) &peer_in6, peer_addr_len,0 ); + err = sock->ops->connect (sock, (struct sockaddr_unspec *) &peer_in6, peer_addr_len,0 ); out:if (err <0 ) {
drivers/infiniband/hw/erdma/erdma_cm.c +1 -1
@@ -996,7 +996,7 @@ static int kernel_bindconnect(struct socket *s, struct sockaddr *laddr, ret = s->ops->bind (s, (struct sockaddr_unspec *)laddr, laddrlen);if (ret)return ret; - ret = s->ops->connect (s, raddr, raddrlen, flags); + ret = s->ops->connect (s, (struct sockaddr_unspec *)raddr, raddrlen, flags);return ret <0 ? ret :0 ; }
drivers/infiniband/sw/siw/siw_cm.c +1 -1
@@ -1344,7 +1344,7 @@ static int kernel_bindconnect(struct socket *s, struct sockaddr *laddr,if (rv <0 )return rv; - rv = s->ops->connect (s, raddr, size, flags); + rv = s->ops->connect (s, (struct sockaddr_unspec *)raddr, size, flags);return rv <0 ? rv :0 ; }
drivers/net/ppp/pppoe.c +2 -2
@@ -608,8 +608,8 @@ static int pppoe_release(struct socket *sock)return 0 ; } -static int pppoe_connect (struct socket *sock,struct sockaddr *uservaddr, -int sockaddr_len,int flags) +static int pppoe_connect (struct socket *sock,struct sockaddr_unspec *uservaddr, +int sockaddr_len,int flags) {struct sock *sk = sock->sk;struct sockaddr_pppox *sp = (struct sockaddr_pppox *)uservaddr;
drivers/net/ppp/pptp.c +2 -2
@@ -415,8 +415,8 @@ static int pptp_bind(struct socket *sock, struct sockaddr_unspec *uservaddr,return error; } -static int pptp_connect (struct socket *sock,struct sockaddr *uservaddr, -int sockaddr_len,int flags) +static int pptp_connect (struct socket *sock,struct sockaddr_unspec *uservaddr, +int sockaddr_len,int flags) {struct sock *sk = sock->sk;struct sockaddr_pppox *sp = (struct sockaddr_pppox *) uservaddr;
drivers/net/wireless/ath/ath10k/qmi.c +1 -1
@@ -986,7 +986,7 @@ static int ath10k_qmi_new_server(struct qmi_handle *qmi_hdl,ath10k_dbg (ar,ATH10K_DBG_QMI ,"wifi fw qmi service found\n" ); - ret =kernel_connect (qmi_hdl->sock, (struct sockaddr *)&qmi->sq, + ret =kernel_connect (qmi_hdl->sock, (struct sockaddr_unspec *)&qmi->sq,sizeof (qmi->sq),0 );if (ret) {ath10k_err (ar,"failed to connect to a remote QMI service port\n" );
drivers/net/wireless/ath/ath11k/qmi.c +1 -1
@@ -3177,7 +3177,7 @@ static int ath11k_qmi_ops_new_server(struct qmi_handle *qmi_hdl, sq->sq_node = service->node; sq->sq_port = service->port; - ret =kernel_connect (qmi_hdl->sock, (struct sockaddr *)sq, + ret =kernel_connect (qmi_hdl->sock, (struct sockaddr_unspec *)sq,sizeof (*sq),0 );if (ret) {ath11k_warn (ab,"failed to connect to qmi remote service: %d\n" , ret);
drivers/net/wireless/ath/ath12k/qmi.c +1 -1
@@ -3740,7 +3740,7 @@ static int ath12k_qmi_ops_new_server(struct qmi_handle *qmi_hdl, sq->sq_node = service->node; sq->sq_port = service->port; - ret =kernel_connect (qmi_hdl->sock, (struct sockaddr *)sq, + ret =kernel_connect (qmi_hdl->sock, (struct sockaddr_unspec *)sq,sizeof (*sq),0 );if (ret) {ath12k_warn (ab,"qmi failed to connect to remote service %d\n" , ret);
drivers/nvme/host/tcp.c +1 -1
@@ -1869,7 +1869,7 @@ static int nvme_tcp_alloc_queue(struct nvme_ctrl *nctrl, int qid,dev_dbg (nctrl->device,"connecting queue %d\n" ,nvme_tcp_queue_id (queue)); - ret =kernel_connect (queue->sock, (struct sockaddr *)&ctrl->addr, + ret =kernel_connect (queue->sock, (struct sockaddr_unspec *)&ctrl->addr,sizeof (ctrl->addr),0 );if (ret) { dev_err(nctrl->device,
drivers/slimbus/qcom-ngd-ctrl.c +1 -1
@@ -463,7 +463,7 @@ static int qcom_slim_qmi_init(struct qcom_slim_ngd_ctrl *ctrl, } rc =kernel_connect (handle->sock, - (struct sockaddr *)&ctrl->qmi.svc_info, + (struct sockaddr_unspec *)&ctrl->qmi.svc_info,sizeof (ctrl->qmi.svc_info),0 );if (rc <0 ) {dev_err (ctrl->dev,"Remote Service connect failed: %d\n" , rc);
drivers/xen/pvcalls-back.c +1 -1
@@ -409,7 +409,7 @@ static int pvcalls_back_connect(struct xenbus_device *dev, ret =sock_create (AF_INET ,SOCK_STREAM ,0 , &sock);if (ret <0 ) goto out; - ret =inet_stream_connect (sock, sa, req->u.connect.len,0 ); + ret =inet_stream_connect (sock, (struct sockaddr_unspec *)sa, req->u.connect.len,0 );if (ret <0 ) {sock_release (sock); goto out;
fs/coredump.c +1 -1
@@ -708,7 +708,7 @@ static bool coredump_sock_connect(struct core_name *cn, struct coredump_params **/ pidfs_coredump (cprm); - retval =kernel_connect (socket, (struct sockaddr *)(&addr), addr_len, + retval =kernel_connect (socket, (struct sockaddr_unspec *)(&addr), addr_len,O_NONBLOCK |SOCK_COREDUMP );if (retval) {
fs/dlm/lowcomms.c +1 -1
@@ -1599,7 +1599,7 @@ static int dlm_connect(struct connection *con)log_print_ratelimited ("connecting to %d" , con->nodeid);make_sockaddr (&addr, dlm_config.ci_tcp_port, &addr_len); - result =kernel_connect (sock, (struct sockaddr *)&addr, addr_len,0 ); + result =kernel_connect (sock, (struct sockaddr_unspec *)&addr, addr_len,0 );switch (result) {case -EINPROGRESS :/* not an error */
fs/ocfs2/cluster/tcp.c +1 -1
@@ -1638,7 +1638,7 @@ static void o2net_start_connect(struct work_struct *work) remoteaddr.sin_port = node->nd_ipv4_port; ret = sc->sc_sock->ops->connect (sc->sc_sock, - (struct sockaddr *)&remoteaddr, + (struct sockaddr_unspec *)&remoteaddr,sizeof (remoteaddr),O_NONBLOCK );if (ret == -EINPROGRESS )
fs/smb/client/connect.c +1 -1
@@ -3411,7 +3411,7 @@ generic_ip_connect(struct TCP_Server_Info *server) socket->sk->sk_sndbuf, socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo); - rc =kernel_connect (socket, saddr, slen, + rc =kernel_connect (socket, (struct sockaddr_unspec *)saddr, slen, server->noblockcnt ?O_NONBLOCK :0 );/* * When mounting SMB root file systems, we do not want to block in
net/9p/trans_fd.c +3 -3
@@ -1018,7 +1018,7 @@ p9_fd_create_tcp(struct p9_client *client, const char *addr, char *args) } err =READ_ONCE (csocket->ops)->connect (csocket, - (struct sockaddr *)&stor, + (struct sockaddr_unspec *)&stor,sizeof (stor),0 );if (err <0 ) { pr_err("%s (%d): problem connecting socket to %s\n",
@@ -1058,8 +1058,8 @@ p9_fd_create_unix(struct p9_client *client, const char *addr, char *args)return err; } - err =READ_ONCE (csocket->ops)->connect (csocket, (struct sockaddr *)&sun_server, -sizeof (struct sockaddr_un ) -1 ,0 ); + err =READ_ONCE (csocket->ops)->connect (csocket, (struct sockaddr_unspec *)&sun_server, +sizeof (struct sockaddr_un ) -1 ,0 );if (err <0 ) {pr_err ("%s (%d): problem connecting socket: %s: %d\n" , __func__,task_pid_nr (current), addr, err);
net/appletalk/ddp.c +1 -1
@@ -1204,7 +1204,7 @@ static int atalk_bind(struct socket *sock, struct sockaddr_unspec *uaddr, int ad }/* Set the address we talk to */ -static int atalk_connect (struct socket *sock,struct sockaddr *uaddr, +static int atalk_connect (struct socket *sock,struct sockaddr_unspec *uaddr,int addr_len,int flags) {struct sock *sk = sock->sk;
net/atm/pvc.c +2 -2
@@ -56,10 +56,10 @@ static int pvc_bind(struct socket *sock, struct sockaddr_unspec *sockaddr,return error; } -static int pvc_connect (struct socket *sock,struct sockaddr *sockaddr, +static int pvc_connect (struct socket *sock,struct sockaddr_unspec *sockaddr,int sockaddr_len,int flags) { -return pvc_bind (sock, (struct sockaddr_unspec *)sockaddr, sockaddr_len); +return pvc_bind (sock, sockaddr, sockaddr_len); } static int pvc_setsockopt(struct socket *sock, int level, int optname,
net/atm/svc.c +1 -1
@@ -153,7 +153,7 @@ static int svc_bind(struct socket *sock, struct sockaddr_unspec *sockaddr,return error; } -static int svc_connect (struct socket *sock,struct sockaddr *sockaddr, +static int svc_connect (struct socket *sock,struct sockaddr_unspec *sockaddr,int sockaddr_len,int flags) {DEFINE_WAIT (wait);
net/ax25/af_ax25.c +1 -1
@@ -1175,7 +1175,7 @@ static int ax25_bind(struct socket *sock, struct sockaddr_unspec *uaddr, int add* FIXME: nonblock behaviour looks like it may have a bug. */ static int __must_check ax25_connect (struct socket *sock, -struct sockaddr *uaddr,int addr_len,int flags) +struct sockaddr_unspec *uaddr,int addr_len,int flags) {struct sock *sk = sock->sk;ax25_cb *ax25 =sk_to_ax25 (sk), *ax25t;
net/bluetooth/iso.c +1 -1
@@ -1080,7 +1080,7 @@ static int iso_sock_bind(struct socket *sock, struct sockaddr_unspec *addr,return err; } -static int iso_sock_connect (struct socket *sock,struct sockaddr *addr, +static int iso_sock_connect (struct socket *sock,struct sockaddr_unspec *addr,int alen,int flags) {struct sockaddr_iso *sa = (struct sockaddr_iso *)addr;
net/bluetooth/l2cap_sock.c +1 -1
@@ -178,7 +178,7 @@ static int l2cap_sock_bind(struct socket *sock, struct sockaddr_unspec *addr, inreturn err; } -static int l2cap_sock_connect (struct socket *sock,struct sockaddr *addr, +static int l2cap_sock_connect (struct socket *sock,struct sockaddr_unspec *addr,int alen,int flags) {struct sock *sk = sock->sk;
net/bluetooth/rfcomm/core.c +1 -1
@@ -808,7 +808,7 @@ static struct rfcomm_session *rfcomm_session_create(bdaddr_t *src, addr.l2_psm =cpu_to_le16 (L2CAP_PSM_RFCOMM ); addr.l2_cid =0 ; addr.l2_bdaddr_type =BDADDR_BREDR ; - *err =kernel_connect (sock, (struct sockaddr *) &addr,sizeof (addr),O_NONBLOCK ); + *err =kernel_connect (sock, (struct sockaddr_unspec *)&addr,sizeof (addr),O_NONBLOCK );if (*err ==0 || *err == -EINPROGRESS )return s;
net/bluetooth/rfcomm/sock.c +2 -1
@@ -371,7 +371,8 @@ static int rfcomm_sock_bind(struct socket *sock, struct sockaddr_unspec *addr, ireturn err; } -static int rfcomm_sock_connect (struct socket *sock,struct sockaddr *addr,int alen,int flags) +static int rfcomm_sock_connect (struct socket *sock,struct sockaddr_unspec *addr, +int alen,int flags) {struct sockaddr_rc *sa = (struct sockaddr_rc *) addr;struct sock *sk = sock->sk;
net/bluetooth/sco.c +1 -1
@@ -639,7 +639,7 @@ static int sco_sock_bind(struct socket *sock, struct sockaddr_unspec *addr,return err; } -static int sco_sock_connect (struct socket *sock,struct sockaddr *addr,int alen,int flags) +static int sco_sock_connect (struct socket *sock,struct sockaddr_unspec *addr,int alen,int flags) {struct sockaddr_sco *sa = (struct sockaddr_sco *) addr;struct sock *sk = sock->sk;
net/caif/caif_socket.c +1 -1
@@ -734,7 +734,7 @@ static int setsockopt(struct socket *sock, int lvl, int opt, sockptr_t ov,* o sock->state: holds the SS_* socket state and is updated by connect and * disconnect. */ -static int caif_connect (struct socket *sock,struct sockaddr *uaddr, +static int caif_connect (struct socket *sock,struct sockaddr_unspec *uaddr,int addr_len,int flags) {struct sock *sk = sock->sk;
net/can/bcm.c +1 -1
@@ -1657,7 +1657,7 @@ static int bcm_release(struct socket *sock)return 0 ; } -static int bcm_connect (struct socket *sock,struct sockaddr *uaddr,int len, +static int bcm_connect (struct socket *sock,struct sockaddr_unspec *uaddr,int len,int flags) {struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
net/can/j1939/socket.c +1 -1
@@ -535,7 +535,7 @@ static int j1939_sk_bind(struct socket *sock, struct sockaddr_unspec *uaddr, intreturn ret; } -static int j1939_sk_connect (struct socket *sock,struct sockaddr *uaddr, +static int j1939_sk_connect (struct socket *sock,struct sockaddr_unspec *uaddr,int len,int flags) {struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
net/ceph/messenger.c +1 -1
@@ -460,7 +460,7 @@ int ceph_tcp_connect(struct ceph_connection *con)set_sock_callbacks (sock, con);con_sock_state_connecting (con); - ret =kernel_connect (sock, (struct sockaddr *)&ss,sizeof (ss), + ret =kernel_connect (sock, (struct sockaddr_unspec *)&ss,sizeof (ss),O_NONBLOCK );if (ret == -EINPROGRESS ) { dout("connect %s EINPROGRESS sk_state = %u\n",
net/core/sock.c +1 -1
@@ -3426,7 +3426,7 @@ int sock_no_bind(struct socket *sock, struct sockaddr_unspec *saddr, int len) }EXPORT_SYMBOL (sock_no_bind); -int sock_no_connect (struct socket *sock,struct sockaddr *saddr, +int sock_no_connect (struct socket *sock,struct sockaddr_unspec *saddr,int len,int flags) {return -EOPNOTSUPP ;
net/ieee802154/socket.c +2 -2
@@ -107,7 +107,7 @@ static int ieee802154_sock_bind(struct socket *sock, struct sockaddr_unspec *uadreturn sock_no_bind (sock, uaddr, addr_len); } -static int ieee802154_sock_connect (struct socket *sock,struct sockaddr *uaddr, +static int ieee802154_sock_connect (struct socket *sock,struct sockaddr_unspec *uaddr,int addr_len,int flags) {struct sock *sk = sock->sk;
@@ -118,7 +118,7 @@ static int ieee802154_sock_connect(struct socket *sock, struct sockaddr *uaddr,if (uaddr->sa_family ==AF_UNSPEC )return sk->sk_prot->disconnect (sk, flags); -return sk->sk_prot->connect (sk, uaddr, addr_len); +return sk->sk_prot->connect (sk, (struct sockaddr *)uaddr, addr_len); } static int ieee802154_dev_ioctl(struct sock *sk, struct ifreq __user *arg,
net/ipv4/af_inet.c +7 -7
@@ -567,7 +567,7 @@ int __inet_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len,return err; } -int inet_dgram_connect (struct socket *sock,struct sockaddr *uaddr, +int inet_dgram_connect (struct socket *sock,struct sockaddr_unspec *uaddr,int addr_len,int flags) {struct sock *sk = sock->sk;
@@ -584,14 +584,14 @@ int inet_dgram_connect(struct socket *sock, struct sockaddr *uaddr,return prot->disconnect (sk, flags);if (BPF_CGROUP_PRE_CONNECT_ENABLED (sk)) { - err = prot->pre_connect (sk, uaddr, addr_len); + err = prot->pre_connect (sk, (struct sockaddr *)uaddr, addr_len);if (err)return err; }if (data_race (!inet_sk (sk)->inet_num) &&inet_autobind (sk))return -EAGAIN ; -return prot->connect (sk, uaddr, addr_len); +return prot->connect (sk, (struct sockaddr *)uaddr, addr_len); }EXPORT_SYMBOL (inet_dgram_connect);
@@ -623,7 +623,7 @@ static long inet_wait_for_connect(struct sock *sk, long timeo, int writebias)* Connect to a remote host. There is regrettably still a little * TCP 'magic' in here. */ -int __inet_stream_connect (struct socket *sock,struct sockaddr *uaddr, +int __inet_stream_connect (struct socket *sock,struct sockaddr_unspec *uaddr,int addr_len,int flags,int is_sendmsg) {struct sock *sk = sock->sk;
@@ -671,12 +671,12 @@ int __inet_stream_connect(struct socket *sock, struct sockaddr *uaddr, goto out;if (BPF_CGROUP_PRE_CONNECT_ENABLED (sk)) { - err = sk->sk_prot->pre_connect (sk, uaddr, addr_len); + err = sk->sk_prot->pre_connect (sk, (struct sockaddr *)uaddr, addr_len);if (err) goto out; } - err = sk->sk_prot->connect (sk, uaddr, addr_len); + err = sk->sk_prot->connect (sk, (struct sockaddr *)uaddr, addr_len);if (err <0 ) goto out;
@@ -741,7 +741,7 @@ int __inet_stream_connect(struct socket *sock, struct sockaddr *uaddr, }EXPORT_SYMBOL (__inet_stream_connect); -int inet_stream_connect (struct socket *sock,struct sockaddr *uaddr, +int inet_stream_connect (struct socket *sock,struct sockaddr_unspec *uaddr,int addr_len,int flags) {int err;
net/ipv4/tcp.c +1 -1
@@ -1062,7 +1062,7 @@ int tcp_sendmsg_fastopen(struct sock *sk, struct msghdr *msg, int *copied, } } flags = (msg->msg_flags &MSG_DONTWAIT ) ?O_NONBLOCK :0 ; - err =__inet_stream_connect (sk->sk_socket, uaddr, + err =__inet_stream_connect (sk->sk_socket, (struct sockaddr_unspec *)uaddr, msg->msg_namelen, flags,1 );/* fastopen_req could already be freed in __inet_stream_connect * if the connection times out or gets rst
net/ipv4/udp_tunnel_core.c +1 -1
@@ -38,7 +38,7 @@ int udp_sock_create4(struct net *net, struct udp_port_cfg *cfg, udp_addr.sin_family =AF_INET ; udp_addr.sin_addr = cfg->peer_ip; udp_addr.sin_port = cfg->peer_udp_port; - err =kernel_connect (sock, (struct sockaddr *)&udp_addr, + err =kernel_connect (sock, (struct sockaddr_unspec *)&udp_addr,sizeof (udp_addr),0 );if (err <0 ) goto error;
net/ipv6/ip6_udp_tunnel.c +1 -1
@@ -52,7 +52,7 @@ int udp_sock_create6(struct net *net, struct udp_port_cfg *cfg, sizeof(udp6_addr.sin6_addr)); udp6_addr.sin6_port = cfg->peer_udp_port; err =kernel_connect (sock, - (struct sockaddr *)&udp6_addr, + (struct sockaddr_unspec *)&udp6_addr,sizeof (udp6_addr),0 ); }if (err <0 )
net/iucv/af_iucv.c +2 -2
@@ -667,7 +667,7 @@ static int iucv_sock_autobind(struct sock *sk)return err; } -static int afiucv_path_connect (struct socket *sock,struct sockaddr *addr) +static int afiucv_path_connect (struct socket *sock,struct sockaddr_unspec *addr) { DECLARE_SOCKADDR(struct sockaddr_iucv *, sa, addr);struct sock *sk = sock->sk;
@@ -713,7 +713,7 @@ static int afiucv_path_connect(struct socket *sock, struct sockaddr *addr) }/* Connect an unconnected socket */ -static int iucv_sock_connect (struct socket *sock,struct sockaddr *addr, +static int iucv_sock_connect (struct socket *sock,struct sockaddr_unspec *addr,int alen,int flags) { DECLARE_SOCKADDR(struct sockaddr_iucv *, sa, addr);
net/l2tp/l2tp_core.c +2 -2
@@ -1513,7 +1513,7 @@ static int l2tp_tunnel_sock_create(struct net *net, sizeof(ip6_addr.l2tp_addr)); ip6_addr.l2tp_conn_id = peer_tunnel_id; err =kernel_connect (sock, - (struct sockaddr *)&ip6_addr, + (struct sockaddr_unspec *)&ip6_addr,sizeof (ip6_addr),0 );if (err <0 ) goto out;
@@ -1538,7 +1538,7 @@ static int l2tp_tunnel_sock_create(struct net *net, ip_addr.l2tp_family =AF_INET ; ip_addr.l2tp_addr = cfg->peer_ip; ip_addr.l2tp_conn_id = peer_tunnel_id; - err =kernel_connect (sock, (struct sockaddr *)&ip_addr, + err =kernel_connect (sock, (struct sockaddr_unspec *)&ip_addr,sizeof (ip_addr),0 );if (err <0 ) goto out;
net/l2tp/l2tp_ppp.c +1 -1
@@ -691,7 +691,7 @@ static struct l2tp_tunnel *pppol2tp_tunnel_get(struct net *net,/* connect() handler. Attach a PPPoX socket to a tunnel UDP socket */ -static int pppol2tp_connect (struct socket *sock,struct sockaddr *uservaddr, +static int pppol2tp_connect (struct socket *sock,struct sockaddr_unspec *uservaddr,int sockaddr_len,int flags) {struct sock *sk = sock->sk;
net/llc/af_llc.c +1 -1
@@ -477,7 +477,7 @@ static int llc_ui_shutdown(struct socket *sock, int how)* This function will autobind if user did not previously call bind. * Returns: 0 upon success, negative otherwise. */ -static int llc_ui_connect (struct socket *sock,struct sockaddr *uaddr, +static int llc_ui_connect (struct socket *sock,struct sockaddr_unspec *uaddr,int addrlen,int flags) {struct sock *sk = sock->sk;
net/mctp/af_mctp.c +1 -1
@@ -128,7 +128,7 @@ static int mctp_bind(struct socket *sock, struct sockaddr_unspec *addr, int addr/* Used to set a specific peer prior to bind. Not used for outbound * connections (Tag Owner set) since MCTP is a datagram protocol. */ -static int mctp_connect (struct socket *sock,struct sockaddr *addr, +static int mctp_connect (struct socket *sock,struct sockaddr_unspec *addr,int addrlen,int flags) {struct sock *sk = sock->sk;
net/mctp/test/utils.c +3 -2
@@ -279,7 +279,7 @@ void mctp_test_bind_run(struct kunit *test, addr.smctp_addr.s_addr = setup->peer_addr;/* connect() type must match bind() type */ addr.smctp_type = setup->bind_type; - rc =kernel_connect (*sock, (struct sockaddr *)&addr, + rc =kernel_connect (*sock, (struct sockaddr_unspec *)&addr,sizeof (addr),0 );KUNIT_EXPECT_EQ (test, rc,0 ); }
@@ -292,5 +292,6 @@ void mctp_test_bind_run(struct kunit *test, addr.smctp_type = setup->bind_type; *ret_bind_errno = -kernel_bind (*sock, (struct sockaddr *)&addr,sizeof (addr)); +kernel_bind (*sock, (struct sockaddr_unspec *)&addr, +sizeof (addr)); }
net/mptcp/subflow.c +1 -1
@@ -1680,7 +1680,7 @@ int __mptcp_subflow_connect(struct sock *sk, const struct mptcp_pm_local *local,sock_hold (ssk);list_add_tail (&subflow->node, &msk->conn_list); - err =kernel_connect (sf, (struct sockaddr *)&addr, addrlen,O_NONBLOCK ); + err =kernel_connect (sf, (struct sockaddr_unspec *)&addr, addrlen,O_NONBLOCK );if (err && err != -EINPROGRESS ) {MPTCP_INC_STATS (sock_net (sk),MPTCP_MIB_JOINSYNTXCONNECTERR ); pr_debug("msk=%p local=%d remote=%d connect error: %d\n",
net/netfilter/ipvs/ip_vs_sync.c +1 -1
@@ -1501,7 +1501,7 @@ static int make_send_sock(struct netns_ipvs *ipvs, int id, }get_mcast_sockaddr (&mcast_addr, &salen, &ipvs->mcfg, id); - result =kernel_connect (sock, (struct sockaddr *)&mcast_addr, + result =kernel_connect (sock, (struct sockaddr_unspec *)&mcast_addr, salen,0 );if (result <0 ) {pr_err ("Error connecting to the multicast addr\n" );
net/netlink/af_netlink.c +1 -1
@@ -1056,7 +1056,7 @@ static int netlink_bind(struct socket *sock, struct sockaddr_unspec *addr,return err; } -static int netlink_connect (struct socket *sock,struct sockaddr *addr, +static int netlink_connect (struct socket *sock,struct sockaddr_unspec *addr,int alen,int flags) {int err =0 ;
net/netrom/af_netrom.c +2 -2
@@ -632,8 +632,8 @@ static int nr_bind(struct socket *sock, struct sockaddr_unspec *uaddr, int addr_return 0 ; } -static int nr_connect (struct socket *sock,struct sockaddr *uaddr, -int addr_len,int flags) +static int nr_connect (struct socket *sock,struct sockaddr_unspec *uaddr, +int addr_len,int flags) {struct sock *sk = sock->sk;struct nr_sock *nr =nr_sk (sk);
net/nfc/llcp_sock.c +1 -1
@@ -648,7 +648,7 @@ static int llcp_sock_release(struct socket *sock)return err; } -static int llcp_sock_connect (struct socket *sock,struct sockaddr *_addr, +static int llcp_sock_connect (struct socket *sock,struct sockaddr_unspec *_addr,int len,int flags) {struct sock *sk = sock->sk;
net/nfc/rawsock.c +1 -1
@@ -73,7 +73,7 @@ static int rawsock_release(struct socket *sock)return 0 ; } -static int rawsock_connect (struct socket *sock,struct sockaddr *_addr, +static int rawsock_connect (struct socket *sock,struct sockaddr_unspec *_addr,int len,int flags) {struct sock *sk = sock->sk;
net/phonet/socket.c +3 -3
@@ -214,8 +214,8 @@ static int pn_socket_autobind(struct socket *sock)return 0 ;/* socket was already bound */ } -static int pn_socket_connect (struct socket *sock,struct sockaddr *addr, -int len,int flags) +static int pn_socket_connect (struct socket *sock,struct sockaddr_unspec *addr, +int len,int flags) {struct sock *sk = sock->sk;struct pn_sock *pn =pn_sk (sk);
@@ -252,7 +252,7 @@ static int pn_socket_connect(struct socket *sock, struct sockaddr *addr, pn->resource =pn_sockaddr_get_resource (spn); sock->state =SS_CONNECTING ; - err = sk->sk_prot->connect (sk, addr, len); + err = sk->sk_prot->connect (sk, (struct sockaddr *)addr, len);if (err) { sock->state =SS_UNCONNECTED ; pn->dobject =0 ;
net/qrtr/af_qrtr.c +1 -1
@@ -1084,7 +1084,7 @@ static int qrtr_recvmsg(struct socket *sock, struct msghdr *msg,return rc; } -static int qrtr_connect (struct socket *sock,struct sockaddr *saddr, +static int qrtr_connect (struct socket *sock,struct sockaddr_unspec *saddr,int len,int flags) { DECLARE_SOCKADDR(struct sockaddr_qrtr *, addr, saddr);
net/rds/af_rds.c +1 -1
@@ -533,7 +533,7 @@ static int rds_getsockopt(struct socket *sock, int level, int optname, } -static int rds_connect (struct socket *sock,struct sockaddr *uaddr, +static int rds_connect (struct socket *sock,struct sockaddr_unspec *uaddr,int addr_len,int flags) {struct sock *sk = sock->sk;
net/rds/tcp_connect.c +1 -1
@@ -173,7 +173,7 @@ int rds_tcp_conn_path_connect(struct rds_conn_path *cp)* own the socket */ rds_tcp_set_callbacks (sock, cp); - ret =kernel_connect (sock, addr, addrlen,O_NONBLOCK ); + ret =kernel_connect (sock, (struct sockaddr_unspec *)addr, addrlen,O_NONBLOCK );rdsdebug ("connect to address %pI6c returned %d\n" , &conn->c_faddr, ret);if (ret == -EINPROGRESS )
net/rose/af_rose.c +1 -1
@@ -765,7 +765,7 @@ static int rose_bind(struct socket *sock, struct sockaddr_unspec *uaddr, int addreturn err; } -static int rose_connect (struct socket *sock,struct sockaddr *uaddr,int addr_len,int flags) +static int rose_connect (struct socket *sock,struct sockaddr_unspec *uaddr,int addr_len,int flags) {struct sock *sk = sock->sk;struct rose_sock *rose =rose_sk (sk);
net/rxrpc/af_rxrpc.c +1 -1
@@ -481,7 +481,7 @@ EXPORT_SYMBOL(rxrpc_kernel_set_notifications);* - this just targets it at a specific destination; no actual connection * negotiation takes place */ -static int rxrpc_connect (struct socket *sock,struct sockaddr *addr, +static int rxrpc_connect (struct socket *sock,struct sockaddr_unspec *addr,int addr_len,int flags) {struct sockaddr_rxrpc *srx = (struct sockaddr_rxrpc *)addr;
net/sctp/socket.c +2 -2
@@ -4822,7 +4822,7 @@ static int sctp_connect(struct sock *sk, struct sockaddr *addr,return err; } -int sctp_inet_connect (struct socket *sock,struct sockaddr *uaddr, +int sctp_inet_connect (struct socket *sock,struct sockaddr_unspec *uaddr,int addr_len,int flags) {if (addr_len <sizeof (uaddr->sa_family))
@@ -4831,7 +4831,7 @@ int sctp_inet_connect(struct socket *sock, struct sockaddr *uaddr,if (uaddr->sa_family ==AF_UNSPEC )return -EOPNOTSUPP ; -return sctp_connect (sock->sk, uaddr, addr_len, flags); +return sctp_connect (sock->sk, (struct sockaddr *)uaddr, addr_len, flags); }/* Only called when shutdown a listening SCTP socket. */
net/smc/af_smc.c +2 -2
@@ -1642,7 +1642,7 @@ static void smc_connect_work(struct work_struct *work)release_sock (&smc->sk); } -int smc_connect (struct socket *sock,struct sockaddr *addr, +int smc_connect (struct socket *sock,struct sockaddr_unspec *addr,int alen,int flags) {struct sock *sk = sock->sk;
@@ -1694,7 +1694,7 @@ int smc_connect(struct socket *sock, struct sockaddr *addr, rc = -EALREADY ; goto out; } - rc =kernel_connect (smc->clcsock, addr, alen, flags); + rc =kernel_connect (smc->clcsock, (struct sockaddr_unspec *)addr, alen, flags);if (rc && rc != -EINPROGRESS ) goto out;
net/socket.c +4 -4
@@ -2099,8 +2099,8 @@ int __sys_connect_file(struct file *file, struct sockaddr_storage *address,if (err) goto out; - err =READ_ONCE (sock->ops)->connect (sock, (struct sockaddr *)address, - addrlen, sock->file->f_flags | file_flags); + err =READ_ONCE (sock->ops)->connect (sock, (struct sockaddr_unspec *)address, + addrlen, sock->file->f_flags | file_flags); out:return err; }
@@ -3662,14 +3662,14 @@ EXPORT_SYMBOL(kernel_accept);* Returns 0 or an error code. */ -int kernel_connect (struct socket *sock,struct sockaddr *addr,int addrlen, +int kernel_connect (struct socket *sock,struct sockaddr_unspec *addr,int addrlen,int flags) {struct sockaddr_storage address;memcpy (&address, addr, addrlen); -return READ_ONCE (sock->ops)->connect (sock, (struct sockaddr *)&address, +return READ_ONCE (sock->ops)->connect (sock, (struct sockaddr_unspec *)&address, addrlen, flags); }EXPORT_SYMBOL (kernel_connect);
net/sunrpc/clnt.c +1 -1
@@ -1474,7 +1474,7 @@ static int rpc_sockname(struct net *net, struct sockaddr *sap, size_t salen, goto out_release; } - err =kernel_connect (sock, sap, salen,0 ); + err =kernel_connect (sock, (struct sockaddr_unspec *)sap, salen,0 );if (err <0 ) {dprintk ("RPC: can't connect UDP socket (%d)\n" , err); goto out_release;
net/sunrpc/xprtsock.c +3 -2
@@ -2005,7 +2005,7 @@ static int xs_local_finish_connecting(struct rpc_xprt *xprt,xs_stream_start_connect (transport); -return kernel_connect (sock,xs_addr (xprt), xprt->addrlen,0 ); +return kernel_connect (sock, (struct sockaddr_unspec *)xs_addr (xprt), xprt->addrlen,0 ); }/**
@@ -2405,7 +2405,8 @@ static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)/* Tell the socket layer to start connecting... */ set_bit (XPRT_SOCK_CONNECTING , &transport->sock_state); -return kernel_connect (sock,xs_addr (xprt), xprt->addrlen,O_NONBLOCK ); +return kernel_connect (sock, (struct sockaddr_unspec *)xs_addr (xprt), + xprt->addrlen,O_NONBLOCK ); }/**
net/tipc/socket.c +1 -1
@@ -2565,7 +2565,7 @@ static bool tipc_sockaddr_is_sane(struct sockaddr_tipc *addr)* * Return: 0 on success, errno otherwise */ -static int tipc_connect (struct socket *sock,struct sockaddr *dest, +static int tipc_connect (struct socket *sock,struct sockaddr_unspec *dest,int destlen,int flags) {struct sock *sk = sock->sk;
net/unix/af_unix.c +4 -4
@@ -855,7 +855,7 @@ static int unix_listen(struct socket *sock, int backlog)static int unix_release (struct socket *);static int unix_bind (struct socket *,struct sockaddr_unspec *,int ); -static int unix_stream_connect (struct socket *,struct sockaddr *, +static int unix_stream_connect (struct socket *,struct sockaddr_unspec *,int addr_len,int flags);static int unix_socketpair (struct socket *,struct socket *);static int unix_accept (struct socket *,struct socket *,struct proto_accept_arg *arg);
@@ -877,7 +877,7 @@ static int unix_dgram_sendmsg(struct socket *, struct msghdr *, size_t);static int unix_dgram_recvmsg (struct socket *,struct msghdr *,size_t ,int );static int unix_read_skb (struct sock *sk,skb_read_actor_t recv_actor);static int unix_stream_read_skb (struct sock *sk,skb_read_actor_t recv_actor); -static int unix_dgram_connect (struct socket *,struct sockaddr *, +static int unix_dgram_connect (struct socket *,struct sockaddr_unspec *,int ,int );static int unix_seqpacket_sendmsg (struct socket *,struct msghdr *,size_t ); static int unix_seqpacket_recvmsg(struct socket *, struct msghdr *, size_t,
@@ -1523,7 +1523,7 @@ static void unix_state_double_unlock(struct sock *sk1, struct sock *sk2)unix_state_unlock (sk2); } -static int unix_dgram_connect (struct socket *sock,struct sockaddr *addr, +static int unix_dgram_connect (struct socket *sock,struct sockaddr_unspec *addr,int alen,int flags) {struct sockaddr_un *sunaddr = (struct sockaddr_un *)addr;
@@ -1642,7 +1642,7 @@ static long unix_wait_for_peer(struct sock *other, long timeo)return timeo; } -static int unix_stream_connect (struct socket *sock,struct sockaddr *uaddr, +static int unix_stream_connect (struct socket *sock,struct sockaddr_unspec *uaddr,int addr_len,int flags) {struct sockaddr_un *sunaddr = (struct sockaddr_un *)uaddr;
net/vmw_vsock/af_vsock.c +3 -3
@@ -995,7 +995,7 @@ vsock_bind(struct socket *sock, struct sockaddr_unspec *addr, int addr_len) sk = sock->sk; -if (vsock_addr_cast ((struct sockaddr *)addr, addr_len, &vm_addr) !=0 ) +if (vsock_addr_cast (addr, addr_len, &vm_addr) !=0 )return -EINVAL ;lock_sock (sk);
@@ -1328,7 +1328,7 @@ static int vsock_dgram_sendmsg(struct socket *sock, struct msghdr *msg, }static int vsock_dgram_connect (struct socket *sock, -struct sockaddr *addr,int addr_len,int flags) +struct sockaddr_unspec *addr,int addr_len,int flags) {int err;struct sock *sk;
@@ -1528,7 +1528,7 @@ static void vsock_connect_timeout(struct work_struct *work)sock_put (sk); } -static int vsock_connect (struct socket *sock,struct sockaddr *addr, +static int vsock_connect (struct socket *sock,struct sockaddr_unspec *addr,int addr_len,int flags) {int err;
net/vmw_vsock/vsock_addr.c +1 -1
@@ -57,7 +57,7 @@ bool vsock_addr_equals_addr(const struct sockaddr_vm *addr, }EXPORT_SYMBOL_GPL (vsock_addr_equals_addr); -int vsock_addr_cast (const struct sockaddr *addr, +int vsock_addr_cast (const struct sockaddr_unspec *addr,size_t len,struct sockaddr_vm **out_addr) {if (len <sizeof (**out_addr))
net/x25/af_x25.c +1 -1
@@ -743,7 +743,7 @@ static int x25_wait_for_connection_establishment(struct sock *sk)return rc; } -static int x25_connect (struct socket *sock,struct sockaddr *uaddr, +static int x25_connect (struct socket *sock,struct sockaddr_unspec *uaddr,int addr_len,int flags) {struct sock *sk = sock->sk;
samples/qmi/qmi_sample_client.c +1 -1
@@ -468,7 +468,7 @@ static int qmi_sample_probe(struct platform_device *pdev)return ret; sq =dev_get_platdata (&pdev->dev); - ret =kernel_connect (sample->qmi.sock, (struct sockaddr *)sq, + ret =kernel_connect (sample->qmi.sock, (struct sockaddr_unspec *)sq,sizeof (*sq),0 );if (ret <0 ) {pr_err ("failed to connect to remote service port\n" );
tools/testing/selftests/bpf/test_kmods/bpf_testmod.c +1 -1
@@ -900,7 +900,7 @@ __bpf_kfunc int bpf_kfunc_call_kernel_connect(struct addr_args *args) goto out; } - err =kernel_connect (sock, (struct sockaddr *)&args->addr, + err =kernel_connect (sock, (struct sockaddr_unspec *)&args->addr, args->addrlen,0 ); out:mutex_unlock (&sock_lock);
Signature · 1 line
2.34.1
PATCH v3 5/9 net: Remove struct sockaddr from net.h
In reply to Kees CookNow that struct sockaddr is no longer used by net.h, remove it.
--- include/linux/net.h | 1 - 1 file changed, 1 deletion(-)
include/linux/net.h +0 -1
@@ -148,7 +148,6 @@ typedef struct {struct vm_area_struct ;struct page ; -struct sockaddr ;struct msghdr ;struct module ;struct sk_buff ;
Signature · 1 line
2.34.1
PATCH v3 6/9 net: Convert proto callbacks from sockaddr to sockaddr_unspec
In reply to Kees CookConvert 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.
--- include/net/inet_common.h | 5 ++--- include/net/ip.h | 4 ++-- include/net/ipv6.h | 8 ++++---- include/net/ipv6_stubs.h | 2 +- include/net/ping.h | 2 +- include/net/sock.h | 10 +++++----- include/net/tcp.h | 2 +- include/net/udp.h | 2 +- fs/dlm/lowcomms.c | 4 ++-- net/core/filter.c | 5 +++-- net/core/sock.c | 2 +- net/ieee802154/socket.c | 12 ++++++------ net/ipv4/af_inet.c | 14 +++++++------- net/ipv4/datagram.c | 4 ++-- net/ipv4/ping.c | 8 ++++---- net/ipv4/raw.c | 3 ++- net/ipv4/tcp_ipv4.c | 4 ++-- net/ipv4/udp.c | 6 ++++-- net/ipv6/af_inet6.c | 6 +++--- net/ipv6/datagram.c | 8 ++++---- net/ipv6/ping.c | 2 +- net/ipv6/raw.c | 3 ++- net/ipv6/tcp_ipv6.c | 6 +++--- net/ipv6/udp.c | 5 +++-- net/l2tp/l2tp_ip.c | 6 ++++-- net/l2tp/l2tp_ip6.c | 5 +++-- net/mptcp/pm_kernel.c | 4 ++-- net/mptcp/protocol.c | 7 ++++--- net/phonet/pep.c | 3 ++- net/phonet/socket.c | 4 ++-- net/sctp/socket.c | 9 +++++---- 31 files changed, 88 insertions(+), 77 deletions(-)
include/net/inet_common.h +2 -3
@@ -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_unspec *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_unspec *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_unspec *uaddr,int addr_len,u32 flags);int inet_getname (struct socket *sock,struct sockaddr *uaddr,int peer);
include/net/ip.h +2 -2
@@ -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_unspec *uaddr,int addr_len); +int ip4_datagram_connect (struct sock *sk,struct sockaddr_unspec *uaddr,int addr_len);void ip4_datagram_release_cb (struct sock *sk);
include/net/ipv6.h +4 -4
@@ -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_unspec *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_unspec *addr,int addr_len); +int ip6_datagram_connect_v6_only (struct sock *sk,struct sockaddr_unspec *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_unspec *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_unspec *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);
include/net/ipv6_stubs.h +1 -1
@@ -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_unspec *uaddr,int addr_len,u32 flags); struct sock *(*udp6_lib_lookup)(const struct net *net, const struct in6_addr *saddr, __be16 sport,
include/net/ping.h +1 -1
@@ -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_unspec *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 *);
include/net/sock.h +5 -5
@@ -1260,10 +1260,10 @@ struct proto {void (*close)(struct sock *sk,long timeout);int (*pre_connect)(struct sock *sk, -struct sockaddr *uaddr, +struct sockaddr_unspec *uaddr,int addr_len);int (*connect)(struct sock *sk, -struct sockaddr *uaddr, +struct sockaddr_unspec *uaddr,int addr_len);int (*disconnect)(struct sock *sk,int flags);
@@ -1292,9 +1292,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_unspec *addr,int addr_len);int (*bind_add)(struct sock *sk, -struct sockaddr *addr,int addr_len); +struct sockaddr_unspec *addr,int addr_len);int (*backlog_rcv) (struct sock *sk,struct sk_buff *skb);
@@ -3085,7 +3085,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_unspec *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,
include/net/tcp.h +1 -1
@@ -530,7 +530,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_unspec *uaddr,int addr_len);int tcp_connect (struct sock *sk);enum tcp_synack_type {TCP_SYNACK_NORMAL ,
include/net/udp.h +1 -1
@@ -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_unspec *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);
fs/dlm/lowcomms.c +2 -2
@@ -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_unspec *addr = (struct sockaddr_unspec *)&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_unspec *)addr, addr_len); + result =kernel_bind (sock, addr, addr_len);else result =sock_bind_add (sock->sk, addr, addr_len);
net/core/filter.c +3 -2
@@ -5907,7 +5907,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_unspec *)addr, addr_len, flags);#if IS_ENABLED (CONFIG_IPV6 ) } else if (addr->sa_family == AF_INET6) {if (addr_len <SIN6_LEN_RFC2133 )
@@ -5917,7 +5917,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_unspec *)addr, + addr_len, flags); #endif /* CONFIG_IPV6 */ }#endif /* CONFIG_INET */
net/core/sock.c +1 -1
@@ -4353,7 +4353,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_unspec *addr,int addr_len) {if (!sk->sk_prot->bind_add)return -EOPNOTSUPP ;
net/ieee802154/socket.c +6 -6
@@ -102,7 +102,7 @@ static int ieee802154_sock_bind(struct socket *sock, struct sockaddr_unspec *uadstruct 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_unspec *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_unspec *_uaddr,int len) {struct ieee802154_addr addr;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; } -static int raw_connect (struct sock *sk,struct sockaddr *uaddr, +static int raw_connect (struct sock *sk,struct sockaddr_unspec *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_unspec *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_unspec *uaddr,int len) {struct sockaddr_ieee802154 *addr = (struct sockaddr_ieee802154 *)uaddr;
net/ipv4/af_inet.c +7 -7
@@ -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_unspec *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_unspec *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_unspec *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_unspec *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_unspec *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;
net/ipv4/datagram.c +2 -2
@@ -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_unspec *uaddr,int addr_len) {struct inet_sock *inet =inet_sk (sk);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); -int ip4_datagram_connect (struct sock *sk,struct sockaddr *uaddr,int addr_len) +int ip4_datagram_connect (struct sock *sk,struct sockaddr_unspec *uaddr,int addr_len) {int res;
net/ipv4/ping.c +4 -4
@@ -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_unspec *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_unspec *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_unspec *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_unspec *uaddr,int addr_len) {struct inet_sock *isk =inet_sk (sk);unsigned short snum;
net/ipv4/raw.c +2 -1
@@ -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_unspec *uaddr, +int addr_len) {struct inet_sock *inet =inet_sk (sk);struct sockaddr_in *addr = (struct sockaddr_in *) uaddr;
net/ipv4/tcp_ipv4.c +2 -2
@@ -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_unspec *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_unspec *uaddr,int addr_len) {struct sockaddr_in *usin = (struct sockaddr_in *)uaddr;struct inet_timewait_death_row *tcp_death_row;
net/ipv4/udp.c +4 -2
@@ -2161,7 +2161,8 @@ int udp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int flags, 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_unspec *uaddr, +int addr_len) {/* This check is replicated from __ip4_datagram_connect() and * intended to prevent BPF program called below from accessing bytes
@@ -2174,7 +2175,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_unspec *uaddr, +int addr_len) {int res;
net/ipv6/af_inet6.c +3 -3
@@ -277,7 +277,7 @@ static int inet6_create(struct net *net, struct socket *sock, int protocol, goto out; } -static int __inet6_bind (struct sock *sk,struct sockaddr *uaddr,int addr_len, +static int __inet6_bind (struct sock *sk,struct sockaddr_unspec *uaddr,int addr_len,u32 flags) {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; } -int inet6_bind_sk (struct sock *sk,struct sockaddr *uaddr,int addr_len) +int inet6_bind_sk (struct sock *sk,struct sockaddr_unspec *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_unspec *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);
net/ipv6/datagram.c +4 -4
@@ -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_unspec *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_unspec *)&sin,sizeof (sin)); ipv4_connected:
@@ -271,7 +271,7 @@ int __ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, }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_unspec *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_unspec *uaddr,int addr_len) { DECLARE_SOCKADDR(struct sockaddr_in6 *, sin6, uaddr);
net/ipv6/ping.c +1 -1
@@ -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_unspec *uaddr,int addr_len) {/* This check is replicated from __ip6_datagram_connect() and
net/ipv6/raw.c +2 -1
@@ -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_unspec *uaddr, +int addr_len) {struct inet_sock *inet =inet_sk (sk);struct ipv6_pinfo *np =inet6_sk (sk);
net/ipv6/tcp_ipv6.c +3 -3
@@ -119,7 +119,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_unspec *uaddr,int addr_len) {/* This check is replicated from tcp_v6_connect() and intended to
@@ -134,7 +134,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_unspec *uaddr,int addr_len) {struct sockaddr_in6 *usin = (struct sockaddr_in6 *) uaddr;
@@ -239,7 +239,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_unspec *)&sin,sizeof (sin));if (err) { icsk->icsk_ext_hdr_len = exthdrlen;
net/ipv6/udp.c +3 -2
@@ -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_unspec *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_unspec *uaddr, +int addr_len) {int res;
net/l2tp/l2tp_ip.c +4 -2
@@ -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_unspec *uaddr, +int addr_len) {struct inet_sock *inet =inet_sk (sk);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; } -static int l2tp_ip_connect (struct sock *sk,struct sockaddr *uaddr,int addr_len) +static int l2tp_ip_connect (struct sock *sk,struct sockaddr_unspec *uaddr, +int addr_len) {struct sockaddr_l2tpip *lsa = (struct sockaddr_l2tpip *)uaddr;struct l2tp_ip_net *pn =l2tp_ip_pernet (sock_net (sk));
net/l2tp/l2tp_ip6.c +3 -2
@@ -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_unspec *uaddr, +int addr_len) {struct inet_sock *inet =inet_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; } -static int l2tp_ip6_connect (struct sock *sk,struct sockaddr *uaddr, +static int l2tp_ip6_connect (struct sock *sk,struct sockaddr_unspec *uaddr,int addr_len) {struct sockaddr_l2tpip6 *lsa = (struct sockaddr_l2tpip6 *)uaddr;
net/mptcp/pm_kernel.c +2 -2
@@ -849,10 +849,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_unspec *)&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_unspec *)&addr, addrlen);#endif if (err)return err;
net/mptcp/protocol.c +4 -3
@@ -3722,7 +3722,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_unspec *uaddr, +int addr_len) {struct mptcp_subflow_context *subflow;struct mptcp_sock *msk =mptcp_sk (sk);
@@ -3846,10 +3847,10 @@ static int mptcp_bind(struct socket *sock, struct sockaddr_unspec *uaddr, int ad }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);
net/phonet/pep.c +2 -1
@@ -882,7 +882,8 @@ static struct sock *pep_sock_accept(struct sock *sk,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_unspec *addr, +int len) {struct pep_sock *pn =pep_sk (sk);int err;
net/phonet/socket.c +2 -2
@@ -163,7 +163,7 @@ static int pn_socket_bind(struct socket *sock, struct sockaddr_unspec *addr, intu8 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_unspec *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 ;
net/sctp/socket.c +5 -4
@@ -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_unspec *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_unspec *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; }
Signature · 1 line
2.34.1
PATCH v3 7/9 bpf: Convert cgroup sockaddr filters to use sockaddr_unspec consistently
In reply to Kees CookUpdate BPF cgroup sockaddr filtering infrastructure to use sockaddr_unspec consistently throughout the call chain, removing redundant explicit casts from callers.
---
Cc: Alexei Starovoitov <[email protected]>
Cc: Daniel Borkmann <[email protected]>
Cc: John Fastabend <[email protected]>
Cc: Andrii Nakryiko <[email protected]>
Cc: Martin KaFai Lau <[email protected]>
Cc: Eduard Zingerman <[email protected]>
Cc: Song Liu <[email protected]>
Cc: Yonghong Song <[email protected]>
Cc: KP Singh <[email protected]>
Cc: Stanislav Fomichev <[email protected]>
Cc: Hao Luo <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: "David S. Miller" <[email protected]>
Cc: David Ahern <[email protected]>
Cc: Eric Dumazet <[email protected]>
Cc: Jakub Kicinski <[email protected]>
Cc: Paolo Abeni <[email protected]>
Cc: Simon Horman <[email protected]>
Cc: <[email protected]>
Cc: <[email protected]>
--- include/linux/bpf-cgroup.h | 17 ++++++++++------- kernel/bpf/cgroup.c | 4 ++-- net/ipv4/af_inet.c | 4 ++-- 3 files changed, 14 insertions(+), 11 deletions(-)
include/linux/bpf-cgroup.h +10 -7
@@ -120,7 +120,7 @@ int __cgroup_bpf_run_filter_sk(struct sock *sk, enum cgroup_bpf_attach_type atype); int __cgroup_bpf_run_filter_sock_addr(struct sock *sk, - struct sockaddr *uaddr, + struct sockaddr_unspec *uaddr, int *uaddrlen, enum cgroup_bpf_attach_type atype, void *t_ctx,
@@ -238,8 +238,9 @@ static inline bool cgroup_bpf_sock_enabled(struct sock *sk, ({ \int __ret =0 ; \if (cgroup_bpf_enabled (atype)) \ - __ret =__cgroup_bpf_run_filter_sock_addr (sk, (struct sockaddr *)uaddr, uaddrlen, \ - atype,NULL ,NULL ); \ + __ret =__cgroup_bpf_run_filter_sock_addr (sk, \ + (struct sockaddr_unspec *)uaddr, uaddrlen, \ + atype,NULL ,NULL ); \ __ret; \ })
@@ -248,8 +249,9 @@ static inline bool cgroup_bpf_sock_enabled(struct sock *sk,int __ret =0 ; \if (cgroup_bpf_enabled (atype)) { \lock_sock (sk); \ - __ret =__cgroup_bpf_run_filter_sock_addr (sk, (struct sockaddr *)uaddr, uaddrlen, \ - atype, t_ctx,NULL ); \ + __ret =__cgroup_bpf_run_filter_sock_addr (sk, \ + (struct sockaddr_unspec *)uaddr, uaddrlen, \ + atype, t_ctx,NULL ); \release_sock (sk); \ } \ __ret; \
@@ -266,8 +268,9 @@ static inline bool cgroup_bpf_sock_enabled(struct sock *sk,int __ret =0 ; \if (cgroup_bpf_enabled (atype)) { \lock_sock (sk); \ - __ret =__cgroup_bpf_run_filter_sock_addr (sk, (struct sockaddr *)uaddr, uaddrlen, \ - atype,NULL , &__flags); \ + __ret =__cgroup_bpf_run_filter_sock_addr (sk, \ + (struct sockaddr_unspec *)uaddr, uaddrlen, \ + atype,NULL , &__flags); \release_sock (sk); \if (__flags &BPF_RET_BIND_NO_CAP_NET_BIND_SERVICE ) \ *bind_flags |=BIND_NO_CAP_NET_BIND_SERVICE ; \
kernel/bpf/cgroup.c +2 -2
@@ -1665,7 +1665,7 @@ EXPORT_SYMBOL(__cgroup_bpf_run_filter_sk);* returned value != 1 during execution. In all other cases, 0 is returned. */ int __cgroup_bpf_run_filter_sock_addr(struct sock *sk, - struct sockaddr *uaddr, + struct sockaddr_unspec *uaddr, int *uaddrlen, enum cgroup_bpf_attach_type atype, void *t_ctx,
@@ -1673,7 +1673,7 @@ int __cgroup_bpf_run_filter_sock_addr(struct sock *sk, {struct bpf_sock_addr_kern ctx = { .sk = sk, - .uaddr = uaddr, + .uaddr = (struct sockaddr *)uaddr, .t_ctx = t_ctx, };struct sockaddr_storage unspec;
net/ipv4/af_inet.c +2 -2
@@ -813,7 +813,7 @@ int inet_getname(struct socket *sock, struct sockaddr *uaddr, } sin->sin_port = inet->inet_dport; sin->sin_addr.s_addr = inet->inet_daddr; -BPF_CGROUP_RUN_SA_PROG (sk, (struct sockaddr *)sin, &sin_addr_len, +BPF_CGROUP_RUN_SA_PROG (sk, sin, &sin_addr_len,CGROUP_INET4_GETPEERNAME ); }else {__be32 addr = inet->inet_rcv_saddr;
@@ -821,7 +821,7 @@ int inet_getname(struct socket *sock, struct sockaddr *uaddr, addr = inet->inet_saddr; sin->sin_port = inet->inet_sport; sin->sin_addr.s_addr = addr; -BPF_CGROUP_RUN_SA_PROG (sk, (struct sockaddr *)sin, &sin_addr_len, +BPF_CGROUP_RUN_SA_PROG (sk, sin, &sin_addr_len,CGROUP_INET4_GETSOCKNAME ); }release_sock (sk);
Signature · 1 line
2.34.1
PATCH v3 8/9 bpf: Convert bpf_sock_addr_kern "uaddr" to sockaddr_unspec
In reply to Kees CookChange struct bpf_sock_addr_kern to use sockaddr_unspec for the "uaddr" field instead of sockaddr. This improves type safety in the BPF cgroup socket address filtering code.
The casting in __cgroup_bpf_run_filter_sock_addr() is updated to match the new type, removing an unnecessary cast in the initialization and updating the conditional assignment to use the appropriate sockaddr_unspec cast.
--- include/linux/filter.h | 2 +- kernel/bpf/cgroup.c | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-)
include/linux/filter.h +1 -1
@@ -1515,7 +1515,7 @@ static inline int bpf_tell_extensions(void)struct bpf_sock_addr_kern {struct sock *sk; -struct sockaddr *uaddr; +struct sockaddr_unspec *uaddr;/* Temporary "register" to make indirect stores to nested structures * defined above. We need three registers to make such a store, but * only two (src and dst) are available at convert_ctx_access time
kernel/bpf/cgroup.c +4 -4
@@ -1673,10 +1673,10 @@ int __cgroup_bpf_run_filter_sock_addr(struct sock *sk, {struct bpf_sock_addr_kern ctx = { .sk = sk, - .uaddr = (struct sockaddr *)uaddr, + .uaddr = uaddr, .t_ctx = t_ctx, }; -struct sockaddr_storage unspec; +struct sockaddr_storage storage;struct cgroup *cgrp;int ret;
@@ -1688,8 +1688,8 @@ int __cgroup_bpf_run_filter_sock_addr(struct sock *sk,return 0 ;if (!ctx.uaddr) { -memset (&unspec,0 ,sizeof (unspec)); - ctx.uaddr = (struct sockaddr *)&unspec; +memset (&storage,0 ,sizeof (storage)); + ctx.uaddr = (struct sockaddr_unspec *)&storage; ctx.uaddrlen =0 ; }else { ctx.uaddrlen = *uaddrlen;
Signature · 1 line
2.34.1
PATCH v3 9/9 net: Convert struct sockaddr to fixed-size "sa_data[14]"
In reply to Kees CookRevert struct sockaddr from flexible array to fixed 14-byte "sa_data", solves over 36,000 -Wflex-array-member-not-at-end warnings, since struct sockaddr is embedded within many network structs.
With socket/proto sockaddr-based internal APIs switched to use struct sockaddr_unspec, there should be no more uses of struct sockaddr that depend on reading beyond the end of struct sockaddr::sa_data that might trigger bounds checking.
Comparing an x86_64 "allyesconfig" vmlinux build before and after this patch showed no new "ud1" instructions from CONFIG_UBSAN_BOUNDS nor any explicit "field-spanning" memcpy CONFIG_FORTIFY_SOURCE instrumentations.
--- include/linux/socket.h | 6 ++---- tools/perf/trace/beauty/include/linux/socket.h | 5 +---- net/core/dev.c | 2 +- net/core/dev_ioctl.c | 2 +- net/ipv4/arp.c | 2 +- net/packet/af_packet.c | 10 +++++----- 6 files changed, 11 insertions(+), 16 deletions(-)
include/linux/socket.h +2 -4
@@ -32,12 +32,10 @@ typedef __kernel_sa_family_t sa_family_t;* 1003.1g requires sa_family_t and that sa_data is char. */ +/* Deprecated for in-kernel use. Use struct sockaddr_unspec instead. */ struct sockaddr {sa_family_t sa_family;/* address family, AF_xxx */ -union { -char sa_data_min[14 ];/* Minimum 14 bytes of protocol address */ - DECLARE_FLEX_ARRAY(char, sa_data); - }; +char sa_data[14 ];/* 14 bytes of protocol address */ };/**
tools/perf/trace/beauty/include/linux/socket.h +1 -4
@@ -34,10 +34,7 @@ typedef __kernel_sa_family_t sa_family_t;struct sockaddr {sa_family_t sa_family;/* address family, AF_xxx */ -union { -char sa_data_min[14 ];/* Minimum 14 bytes of protocol address */ - DECLARE_FLEX_ARRAY(char, sa_data); - }; +char sa_data[14 ];/* 14 bytes of protocol address */ };struct linger {
net/core/dev.c +1 -1
@@ -9885,7 +9885,7 @@ DECLARE_RWSEM(dev_addr_sem);/* "sa" is a true struct sockaddr with limited "sa_data" member. */ int netif_get_mac_address (struct sockaddr *sa,struct net *net,char *dev_name) { -size_t size =sizeof (sa->sa_data_min); +size_t size =sizeof (sa->sa_data);struct net_device *dev;int ret =0 ;
net/core/dev_ioctl.c +1 -1
@@ -596,7 +596,7 @@ static int dev_ifsioc(struct net *net, struct ifreq *ifr, void __user *data,if (ifr->ifr_hwaddr.sa_family != dev->type)return -EINVAL ;memcpy (dev->broadcast, ifr->ifr_hwaddr.sa_data, -min (sizeof (ifr->ifr_hwaddr.sa_data_min), +min (sizeof (ifr->ifr_hwaddr.sa_data), (size_t )dev->addr_len));netdev_lock_ops (dev);call_netdevice_notifiers (NETDEV_CHANGEADDR , dev);
net/ipv4/arp.c +1 -1
@@ -1189,7 +1189,7 @@ static int arp_req_get(struct net *net, struct arpreq *r)read_lock_bh (&neigh->lock);memcpy (r->arp_ha.sa_data, neigh->ha, -min (dev->addr_len,sizeof (r->arp_ha.sa_data_min))); +min (dev->addr_len,sizeof (r->arp_ha.sa_data))); r->arp_flags =arp_state_to_flags (neigh);read_unlock_bh (&neigh->lock);
net/packet/af_packet.c +5 -5
@@ -3284,7 +3284,7 @@ static int packet_bind_spkt(struct socket *sock, struct sockaddr_unspec *uaddr, {struct sock *sk = sock->sk;struct sockaddr *sa = (struct sockaddr *)uaddr; -char name[sizeof (sa->sa_data_min) +1 ]; +char name[sizeof (sa->sa_data) +1 ];/* * Check legality
@@ -3295,8 +3295,8 @@ static int packet_bind_spkt(struct socket *sock, struct sockaddr_unspec *uaddr,/* uaddr->sa_data comes from the userspace, it's not guaranteed to be * zero-terminated. */ -memcpy (name, sa->sa_data,sizeof (sa->sa_data_min)); - name[sizeof (sa->sa_data_min)] =0 ; +memcpy (name, sa->sa_data,sizeof (sa->sa_data)); + name[sizeof (sa->sa_data)] =0 ;return packet_do_bind (sk, name,0 ,0 ); }
@@ -3581,11 +3581,11 @@ static int packet_getname_spkt(struct socket *sock, struct sockaddr *uaddr,return -EOPNOTSUPP ; uaddr->sa_family =AF_PACKET ; -memset (uaddr->sa_data,0 ,sizeof (uaddr->sa_data_min)); +memset (uaddr->sa_data,0 ,sizeof (uaddr->sa_data));rcu_read_lock (); dev =dev_get_by_index_rcu (sock_net (sk),READ_ONCE (pkt_sk (sk)->ifindex));if (dev) -strscpy (uaddr->sa_data, dev->name,sizeof (uaddr->sa_data_min)); +strscpy (uaddr->sa_data, dev->name,sizeof (uaddr->sa_data));rcu_read_unlock ();return sizeof (*uaddr);
Signature · 1 line
2.34.1