From patchwork Mon Nov 4 22:25:03 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kees Cook X-Patchwork-Id: 13862170 X-Patchwork-Delegate: kuba@kernel.org Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C481D1FCF47; Mon, 4 Nov 2024 22:25:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1730759116; cv=none; b=lchwhcrmrgBdCOgqUaXtXE+l+of5IOYsZ2eVQqmC0R5Agrtg+6OPUmDTVJzUjDJ06kEylGjqXFe02aNf+2wBwoUDwozeKIEoVVzHQFmr+5uMhrBVNuIPxak47mQn28CAWS3cz0qsCF9NxjkXOkTWQuvMihwf0uBFmi3/QaAQjgY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1730759116; c=relaxed/simple; bh=t8LdalTXMa1hMyG/HEIou8Mbhh3UNooPWYNcodwJrLQ=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=bpchemshszR2Ci4r8WEVvM9f7arpCUGNoq4yRVku27nlWBBkW2FPbvQT4iLGU1wseVKV767h7byH0htDeMGq+o4IRZ/2He1U0xehUlTTpSYRLEq1U5KmF8NWMbczfbwkmHgNsLkqZr8a9ouz2SnXS3dTlJiaFF99deDiE0JzcAg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=fE6VkgpO; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="fE6VkgpO" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7DD2BC4CED4; Mon, 4 Nov 2024 22:25:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1730759116; bh=t8LdalTXMa1hMyG/HEIou8Mbhh3UNooPWYNcodwJrLQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=fE6VkgpO0EJ5UVsluOpCaxrp4Iccd4DcWVFZ8tAgY6N8eaic8cF3keLhmZfcQqXbk k36a727ttGeiv1hAyUU6BFsDkHZU2oZsyzondJkEdhR89vjMphrH+oQgAtR8GUznYO QCteJgNg2km0gBOkVYAbG9DhJtvREC8nGIBas3EXJaMiPIsmN6Z9KgFoHFmhwFrNU4 tYbbu198aOrK5qt1imC46Lo9YVW0dX5Cflvor66mnGXS/lqd4o35Op76/Iz4emJQwA fwriPA6fRW6SzRUN4cpS55itJpbqCDTtMBtAq82RGs9UJZK57H9g6Qw1g6dvH3Qxl7 wd2/Q/Rh7ie3Q== From: Kees Cook To: Jakub Kicinski Cc: Kees Cook , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-hardening@vger.kernel.org Subject: [PATCH RFC 1/5] Revert "net: dev: Convert sa_data to flexible array in struct sockaddr" Date: Mon, 4 Nov 2024 14:25:03 -0800 Message-Id: <20241104222513.3469025-1-kees@kernel.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20241104221450.work.053-kees@kernel.org> References: <20241104221450.work.053-kees@kernel.org> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=3783; i=kees@kernel.org; h=from:subject; bh=t8LdalTXMa1hMyG/HEIou8Mbhh3UNooPWYNcodwJrLQ=; b=owGbwMvMwCVmps19z/KJym7G02pJDOmangd3Oq4K12PYOsMyKNBCieXFlA8vXn/bX1OSyLQ0+ +XmDfbsHaUsDGJcDLJiiixBdu5xLh5v28Pd5yrCzGFlAhnCwMUpABOJLWZkeC0j9rX+0O/NG/2m 1wSaLjrVs96Ue+HN3/FzH026vYCB5SgjwwTthb1TTfMEfqzeapSw3k6a+VW5lfLp/xExh57lnP0 0nQcA X-Developer-Key: i=kees@kernel.org; a=openpgp; fpr=A5C3F68F229DD60F723E6E138972F4DFDC6DC026 X-Patchwork-Delegate: kuba@kernel.org X-Patchwork-State: RFC This reverts commit b5f0de6df6dce8d641ef58ef7012f3304dffb9a1. Signed-off-by: Kees Cook --- 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 +++++----- 5 files changed, 9 insertions(+), 12 deletions(-) diff --git a/include/linux/socket.h b/include/linux/socket.h index d18cc47e89bd..7f597e5b2dc8 100644 --- a/include/linux/socket.h +++ b/include/linux/socket.h @@ -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 { diff --git a/net/core/dev.c b/net/core/dev.c index ea5fbcd133ae..582466a0176a 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -9123,7 +9123,7 @@ EXPORT_SYMBOL(dev_set_mac_address_user); int dev_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; diff --git a/net/core/dev_ioctl.c b/net/core/dev_ioctl.c index 473c437b6b53..462c0ab81bd8 100644 --- a/net/core/dev_ioctl.c +++ b/net/core/dev_ioctl.c @@ -541,7 +541,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)); call_netdevice_notifiers(NETDEV_CHANGEADDR, dev); return 0; diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c index 11c1519b3699..3a97efe1587b 100644 --- a/net/ipv4/arp.c +++ b/net/ipv4/arp.c @@ -1185,7 +1185,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); diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index a705ec214254..aa5e368a744a 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c @@ -3352,7 +3352,7 @@ static int packet_bind_spkt(struct socket *sock, struct sockaddr *uaddr, int addr_len) { struct sock *sk = sock->sk; - char name[sizeof(uaddr->sa_data_min) + 1]; + char name[sizeof(uaddr->sa_data) + 1]; /* * Check legality @@ -3363,8 +3363,8 @@ 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, uaddr->sa_data, sizeof(uaddr->sa_data)); + name[sizeof(uaddr->sa_data)] = 0; return packet_do_bind(sk, name, 0, 0); } @@ -3649,11 +3649,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); From patchwork Mon Nov 4 22:25:04 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kees Cook X-Patchwork-Id: 13862167 X-Patchwork-Delegate: kuba@kernel.org Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B0F021C32E2; Mon, 4 Nov 2024 22:25:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1730759116; cv=none; b=fB0G+B/UHcuozlA0VdBmVk8uYjjOw9itQyU8SfPSZuNaX4+UiVC1cdEjrfZmQTEwxh7OJ2N0PWKF+P89Qsx82ozmH9MOij51lFG3gfzXaGf5SW007J0H1UJSxsfXkCny0dV9F6k4HzAEvfdYjCFEPiV4Hh85D8zVcE7diJznQwc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1730759116; c=relaxed/simple; bh=nnathdskUxGu/VhOcY1X1w1dugmZGedEo3+8ThGIWak=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=FVm+XKmadRQe8L9YVo9nUdNVH7RhzZ9FsgWt1URPgRgxKHjXXir8vAOB31Bvi2sPff+utQXUxDmOKaPLNoLKw5gc2JAaYcX5CtX+XCHsRFbqmf7RoYYXjbJCSXdog8S/O0gEQzoVeyFQPM9hQQkwMW5/NXbkawsllQ8DibEoQZ8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=F6iEvdNX; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="F6iEvdNX" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8160EC4CED0; Mon, 4 Nov 2024 22:25:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1730759116; bh=nnathdskUxGu/VhOcY1X1w1dugmZGedEo3+8ThGIWak=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=F6iEvdNXK1P9b+EeoDpbBDRPc5nyEPF25BUX2NtZe+r1mN4d1dKP997O5Wu39g2nW SJVR8Hbc3B40s9MzXVCDy0NlbgaLBFE5fIboQOsATCBlRzRkB0sa3sqNt2eINQlqSZ iO6e5f4PsGSNUgMpS53nrsiZZKkgvvJbcHfBfgxI2x65pL8rchlm0SYBDYvZqQnNd4 TJbT9/7+4dhk8KOSa1xO1FrnQZLEU433bwhPwwwqKj7Z1F+iI2HcAsv2B0i0Ix1/3M j4domQUn4WsCn8rNXdP87d/JM9oMq2d7AMztS+NriQ5F2Hf7rLvtyeDfz6nR5RLWw1 xirX9VQ5tdQ1A== From: Kees Cook To: Jakub Kicinski Cc: Kees Cook , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-hardening@vger.kernel.org Subject: [PATCH RFC 2/5] net: core: dev.c confirmed to use classic sockaddr Date: Mon, 4 Nov 2024 14:25:04 -0800 Message-Id: <20241104222513.3469025-2-kees@kernel.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20241104221450.work.053-kees@kernel.org> References: <20241104221450.work.053-kees@kernel.org> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=1411; i=kees@kernel.org; h=from:subject; bh=nnathdskUxGu/VhOcY1X1w1dugmZGedEo3+8ThGIWak=; b=owGbwMvMwCVmps19z/KJym7G02pJDOmangcXe0/zuTZ9zjqzEOlFk17VPHGVKPP7/FnKSNH9n Nd0jr2NHaUsDGJcDLJiiixBdu5xLh5v28Pd5yrCzGFlAhnCwMUpABPJf8bIsFto5mf+rK9ehbds Dn/0cdfbtURj05z80LDIKaYfCyou5jAy3Jq4QGP9t/1MRtNsNzncdflxWXFazmadFsaeB5f/Gqh 1MgIA X-Developer-Key: i=kees@kernel.org; a=openpgp; fpr=A5C3F68F229DD60F723E6E138972F4DFDC6DC026 X-Patchwork-Delegate: kuba@kernel.org X-Patchwork-State: RFC Add comments about the sockaddr arguments being actual classic "max 14 bytes in sa_data" sockaddr. Signed-off-by: Kees Cook --- net/core/dev.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/net/core/dev.c b/net/core/dev.c index 582466a0176a..c95779cb42a6 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -9075,7 +9075,8 @@ EXPORT_SYMBOL(dev_pre_changeaddr_notify); /** * dev_set_mac_address - Change Media Access Control Address * @dev: device - * @sa: new address + * @sa: new address in a classic "struct sockaddr", which will never + * have more than 14 bytes in @sa::sa_data * @extack: netlink extended ack * * Change the hardware (MAC) address of the device @@ -9109,6 +9110,7 @@ EXPORT_SYMBOL(dev_set_mac_address); DECLARE_RWSEM(dev_addr_sem); +/* "sa" is a classic sockaddr: it will only ever use 14 bytes from sa_data. */ int dev_set_mac_address_user(struct net_device *dev, struct sockaddr *sa, struct netlink_ext_ack *extack) { @@ -9121,6 +9123,7 @@ int dev_set_mac_address_user(struct net_device *dev, struct sockaddr *sa, } EXPORT_SYMBOL(dev_set_mac_address_user); +/* "sa" is a classic sockaddr: it will only ever use 14 bytes from sa_data. */ int dev_get_mac_address(struct sockaddr *sa, struct net *net, char *dev_name) { size_t size = sizeof(sa->sa_data); From patchwork Mon Nov 4 22:25:05 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kees Cook X-Patchwork-Id: 13862171 X-Patchwork-Delegate: kuba@kernel.org Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D4A8E1FCF4D; Mon, 4 Nov 2024 22:25:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1730759116; cv=none; b=Oa2XA7XKTzBUJbpWnyT9kySYH+7OY/ZndbwdzJ7e5nV41zjJSKGUO4WNaJXtWICVhkedYEnOUwD55/W1QAj6OHK+YH2IepNVhJR5JSRyOsW/SNou/lybF9HUDZkYI+4nBPKSGWpBK8nzYF6JJ7zKnnA0lKlMXUQyBWV9joFDPBI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1730759116; c=relaxed/simple; bh=SYkQAm7kUlBnBqUrrg5KuYlujl0t24HE3q4rjHVtoXk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=OyBbj1/LieNQzMCparAPoiGpv4H6Ev5iu1Endu5877soR7Nsy/jhaSnkZTMaDIyp6T+CSAQbeYAWJEHxpaiJ9YKKEz6ilVRoQ32OgFcHF4Q2tS3uYJB3zMLK8EWdElSYtdNOXowrjcBB0rXifh8hH2daybOeb+PvWkQWxfoUq3U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=pOoG7ES0; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="pOoG7ES0" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8444BC4CED5; Mon, 4 Nov 2024 22:25:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1730759116; bh=SYkQAm7kUlBnBqUrrg5KuYlujl0t24HE3q4rjHVtoXk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=pOoG7ES09cAlznEN+5Ej1UobVzhHeFLAnWwbnTdRfQ0hK0DWsCjyetIuhsxo9w9NY lXTUxNXdl8MCbDj0cfrdBhKTJLfJswtgvn3X+Uq/sK0h20A1N4unoV1WAU25iFS5MP A1Su7CxrTWpfqfqyDQefew4C13t56Kx/oMRQNcIQh2A6UtvLbv6Kg2Nsy2vqMi5pcM hFuQ6V4HqOzB49VF6XfiE7KpOQdjoued9JL2Rhr3SZxmlqlxmtqYLJygEwe5i4p54e ckVD/KZ1HgMiAN7XhgzWax17cBGrMxdA7m0Ia4SJOrf7KbO5WYxvk/8gBd36QgspkA 6x3QjIgfqmQnA== From: Kees Cook To: Jakub Kicinski Cc: Kees Cook , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-hardening@vger.kernel.org Subject: [PATCH RFC 3/5] rtnetlink: do_setlink: Use sockaddr_storage Date: Mon, 4 Nov 2024 14:25:05 -0800 Message-Id: <20241104222513.3469025-3-kees@kernel.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20241104221450.work.053-kees@kernel.org> References: <20241104221450.work.053-kees@kernel.org> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=1242; i=kees@kernel.org; h=from:subject; bh=SYkQAm7kUlBnBqUrrg5KuYlujl0t24HE3q4rjHVtoXk=; b=owGbwMvMwCVmps19z/KJym7G02pJDOmanocePQqraHY/v1Chh9Na63DdwhLJm2ePzTrRJ/DA8 d3Of6ZLO0pZGMS4GGTFFFmC7NzjXDzetoe7z1WEmcPKBDKEgYtTACaifYLhf9Esz0zhv0deBjNc 2xuyPpgz/HjZumO9KxrzHyzRVol1Oc7I8Puuxt3CnVst78atqOKvC3xmcFRTtVdi9TeNRu75Vq8 P8gIA X-Developer-Key: i=kees@kernel.org; a=openpgp; fpr=A5C3F68F229DD60F723E6E138972F4DFDC6DC026 X-Patchwork-Delegate: kuba@kernel.org X-Patchwork-State: RFC Instead of a heap allocation use a stack allocated sockaddr_storage to support arbitrary length addr_len value (but bounds check it against the maximum address length). Signed-off-by: Kees Cook --- net/core/rtnetlink.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index f0a520987085..eddd10b74f06 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -2839,21 +2839,17 @@ static int do_setlink(const struct sk_buff *skb, } if (tb[IFLA_ADDRESS]) { - struct sockaddr *sa; - int len; + struct sockaddr_storage addr; + struct sockaddr *sa = (struct sockaddr *)&addr; - len = sizeof(sa_family_t) + max_t(size_t, dev->addr_len, - sizeof(*sa)); - sa = kmalloc(len, GFP_KERNEL); - if (!sa) { + if (dev->addr_len > sizeof(addr.__data)) { err = -ENOMEM; goto errout; } sa->sa_family = dev->type; - memcpy(sa->sa_data, nla_data(tb[IFLA_ADDRESS]), + memcpy(addr.__data, nla_data(tb[IFLA_ADDRESS]), dev->addr_len); err = dev_set_mac_address_user(dev, sa, extack); - kfree(sa); if (err) goto errout; status |= DO_SETLINK_MODIFIED; From patchwork Mon Nov 4 22:25:06 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kees Cook X-Patchwork-Id: 13862169 X-Patchwork-Delegate: kuba@kernel.org Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C47691F584E; Mon, 4 Nov 2024 22:25:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1730759116; cv=none; b=I0ak4Sh+d8AsjdriVHFKE3l6sS2bTngeZOsc4+QCs8TT9Q0RSd96Gp5JAyVlPBo3Qtx07Ry+axUMe9rAAmU7r3rcukl81aT6IYRUrMRpI7fHYuWsmAvF95dbS+C0CgDJ9kQyBj+Ma9Je1zlL3yQDLQHsgNzavfa4CiTohNpKFiw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1730759116; c=relaxed/simple; bh=EMMCpsdODJVzRgCRGNjxUyPSk2UohbpGVbsSjg+is+c=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=HP9zJe8yhU/wVdqSk0bex95LLGPruzUjV41IH9TkdZqToTiKcteSB2XdXMlOuDi5hayPpyMf0IHUNjvdi1YGdap5JfihEZCMkDYaZ6f7ED+ROpSINt7TV9frsCzG6nkJvesK2kuFZCNprRUCDrfpHgApALtleaP4Ffnq8LZWY3w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=p1dwDCRd; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="p1dwDCRd" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7770FC4CECE; Mon, 4 Nov 2024 22:25:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1730759116; bh=EMMCpsdODJVzRgCRGNjxUyPSk2UohbpGVbsSjg+is+c=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=p1dwDCRdo1YDA3tV8OP+eYNHOnBsfSWG9AKWcWpOZw762dgquzTpseCWiiR+XUGPM XNSU2ro1fLMIcbzOqU0o8Ca5MUaq9bOwIM7PRBcbU+um4zp2i0J54R3amvd8QLpsmY YhU7JMeAAAmdZoMGKfYpMjSOl0o1WZO77itIY1PSb4gQdNHgjmfBON13l7kpz7o5Vc y27mNiGvZRpAEmIhiqIWQ2AClRipbxJcHRgf4YNSOSqt8wtvvCp/dtLfWLgZ/ojQhD YTRkGHoKQiZq+Tn0dT9SdMpMTADzgrO8SNWnYI3md/iJOH+rGflS1zWkV9TVto2j6m 8AlJkjXVxt/VQ== From: Kees Cook To: Jakub Kicinski Cc: Kees Cook , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-hardening@vger.kernel.org Subject: [PATCH RFC 4/5] net: core: Convert inet_addr_is_any() to sockaddr_storage Date: Mon, 4 Nov 2024 14:25:06 -0800 Message-Id: <20241104222513.3469025-4-kees@kernel.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20241104221450.work.053-kees@kernel.org> References: <20241104221450.work.053-kees@kernel.org> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=3869; i=kees@kernel.org; h=from:subject; bh=EMMCpsdODJVzRgCRGNjxUyPSk2UohbpGVbsSjg+is+c=; b=owGbwMvMwCVmps19z/KJym7G02pJDOmanofKHSb3yEnXLfHgmHdLM/yfcSTvnP/Gn2fohWixf 12rqzKto5SFQYyLQVZMkSXIzj3OxeNte7j7XEWYOaxMIEMYuDgFYCLaiYwMp1X4rorbOaxubj+7 6LB23upUS/GQpaf85HWZHlzdzdB+n5FhS2fRTIbrBbH18101q6LKLbx75cR0Zp7dYvvky9xVc1K YAA== X-Developer-Key: i=kees@kernel.org; a=openpgp; fpr=A5C3F68F229DD60F723E6E138972F4DFDC6DC026 X-Patchwork-Delegate: kuba@kernel.org X-Patchwork-State: RFC All the callers of inet_addr_is_any() have a sockaddr_storage-backed sockaddr. Avoid casts and switch prototype to the actual object being used. Signed-off-by: Kees Cook --- drivers/nvme/target/rdma.c | 2 +- drivers/nvme/target/tcp.c | 2 +- drivers/target/iscsi/iscsi_target.c | 2 +- include/linux/inet.h | 2 +- net/core/utils.c | 8 ++++---- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/drivers/nvme/target/rdma.c b/drivers/nvme/target/rdma.c index ade285308450..6e4f76711142 100644 --- a/drivers/nvme/target/rdma.c +++ b/drivers/nvme/target/rdma.c @@ -1988,7 +1988,7 @@ static void nvmet_rdma_disc_port_addr(struct nvmet_req *req, struct nvmet_rdma_port *port = nport->priv; struct rdma_cm_id *cm_id = port->cm_id; - if (inet_addr_is_any((struct sockaddr *)&cm_id->route.addr.src_addr)) { + if (inet_addr_is_any(&cm_id->route.addr.src_addr)) { struct nvmet_rdma_rsp *rsp = container_of(req, struct nvmet_rdma_rsp, req); struct rdma_cm_id *req_cm_id = rsp->queue->cm_id; diff --git a/drivers/nvme/target/tcp.c b/drivers/nvme/target/tcp.c index 7c51c2a8c109..df24244fb820 100644 --- a/drivers/nvme/target/tcp.c +++ b/drivers/nvme/target/tcp.c @@ -2158,7 +2158,7 @@ static void nvmet_tcp_disc_port_addr(struct nvmet_req *req, { struct nvmet_tcp_port *port = nport->priv; - if (inet_addr_is_any((struct sockaddr *)&port->addr)) { + if (inet_addr_is_any(&port->addr)) { struct nvmet_tcp_cmd *cmd = container_of(req, struct nvmet_tcp_cmd, req); struct nvmet_tcp_queue *queue = cmd->queue; diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c index 6002283cbeba..1ce68eda0090 100644 --- a/drivers/target/iscsi/iscsi_target.c +++ b/drivers/target/iscsi/iscsi_target.c @@ -3471,7 +3471,7 @@ iscsit_build_sendtargets_response(struct iscsit_cmd *cmd, } } - if (inet_addr_is_any((struct sockaddr *)&np->np_sockaddr)) + if (inet_addr_is_any(&np->np_sockaddr)) sockaddr = &conn->local_sockaddr; else sockaddr = &np->np_sockaddr; diff --git a/include/linux/inet.h b/include/linux/inet.h index bd8276e96e60..d59e3013b0e2 100644 --- a/include/linux/inet.h +++ b/include/linux/inet.h @@ -55,6 +55,6 @@ extern int in6_pton(const char *src, int srclen, u8 *dst, int delim, const char extern int inet_pton_with_scope(struct net *net, unsigned short af, const char *src, const char *port, struct sockaddr_storage *addr); -extern bool inet_addr_is_any(struct sockaddr *addr); +extern bool inet_addr_is_any(struct sockaddr_storage *addr); #endif /* _LINUX_INET_H */ diff --git a/net/core/utils.c b/net/core/utils.c index 27f4cffaae05..e47feeaa5a49 100644 --- a/net/core/utils.c +++ b/net/core/utils.c @@ -399,9 +399,9 @@ int inet_pton_with_scope(struct net *net, __kernel_sa_family_t af, } EXPORT_SYMBOL(inet_pton_with_scope); -bool inet_addr_is_any(struct sockaddr *addr) +bool inet_addr_is_any(struct sockaddr_storage *addr) { - if (addr->sa_family == AF_INET6) { + if (addr->ss_family == AF_INET6) { struct sockaddr_in6 *in6 = (struct sockaddr_in6 *)addr; const struct sockaddr_in6 in6_any = { .sin6_addr = IN6ADDR_ANY_INIT }; @@ -409,13 +409,13 @@ bool inet_addr_is_any(struct sockaddr *addr) if (!memcmp(in6->sin6_addr.s6_addr, in6_any.sin6_addr.s6_addr, 16)) return true; - } else if (addr->sa_family == AF_INET) { + } else if (addr->ss_family == AF_INET) { struct sockaddr_in *in = (struct sockaddr_in *)addr; if (in->sin_addr.s_addr == htonl(INADDR_ANY)) return true; } else { - pr_warn("unexpected address family %u\n", addr->sa_family); + pr_warn("unexpected address family %u\n", addr->ss_family); } return false; From patchwork Mon Nov 4 22:25:07 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kees Cook X-Patchwork-Id: 13862172 X-Patchwork-Delegate: kuba@kernel.org Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B37481FF037; Mon, 4 Nov 2024 22:25:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1730759119; cv=none; b=DbMdEnsQ/LKApTwdRBbxq7SKAa2+V0ZTmxojd1Iv9DFY/UdI33MWR1HrvWqV7VIpSWFRdIDBAn5XPQIMIeM98pkFb9iXN/LBIqP9t9CwSm2CKvhpnKISjxb6EQH580lSEc2YdwDYp873M17xWo/alwClM1luVL6tEikxZZsMRsQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1730759119; c=relaxed/simple; bh=eOql+4yuzIxnKVe9PYLRve1kg+P1CWOfUj2yARTYk9s=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Yjm34hUh9qaHf83Lj/AjYqQV/FMjPh3xIA2bg+48R7JwX0nE5oRJOGuYALZFLmn+ke18/tJ0TnG6Gzo4ZvJgwoWOMnTjSocg8DWCPiUkycSd0RFljQCyDCv02WKZis/HqRb1R1kvbzyWOADECBHtr7EJIjIMkHZqTPE8RJ5pGuk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=f831bjnE; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="f831bjnE" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5F815C4CED0; Mon, 4 Nov 2024 22:25:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1730759119; bh=eOql+4yuzIxnKVe9PYLRve1kg+P1CWOfUj2yARTYk9s=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=f831bjnEcE71QXyCNEyNmqCcI1kK/qcncC/DtV1JZjNRgpagPHAxGNRPj9iE7wyjC UYPw0YFxyxm4A8Uv3LV6XbqVFOKVNA1nBQVq6vO4jqgtcIp1jvWRSQgkLNd5vNxNut NfUoYWm7bZ3KZ3UTc/DxU8ek1lDbcgRCK5CYmXZsmi8Jf70soPMRBsM1vedlhq4XZr 23HH1ILjZphXpaPTkbReraPbHL8yIMXZLsRYnlS8TU06wKMB+kWNYTBnDZ9TPoiVpg 0vTxfa5PvQgic+3d8sl/e3gRtD9SL3yAhLrvsXzrZ0yldXbYpdhuhEPKmxfeiYCgTK Kr7EcgIW4q0Ww== From: Kees Cook To: Jakub Kicinski Cc: Kees Cook , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-hardening@vger.kernel.org Subject: [PATCH RFC 5/5] net: Convert proto_ops::getname to sockaddr_storage Date: Mon, 4 Nov 2024 14:25:07 -0800 Message-Id: <20241104222513.3469025-5-kees@kernel.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20241104221450.work.053-kees@kernel.org> References: <20241104221450.work.053-kees@kernel.org> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=56057; i=kees@kernel.org; h=from:subject; bh=eOql+4yuzIxnKVe9PYLRve1kg+P1CWOfUj2yARTYk9s=; b=owGbwMvMwCVmps19z/KJym7G02pJDOmanodCuAzSL7i9vaCie/0Xu+3PCyeFiqcwfhf3Xewj9 2/yjF+vO0pZGMS4GGTFFFmC7NzjXDzetoe7z1WEmcPKBDKEgYtTACayaB7Df/cDqyets2EoNNy4 nF9f6MHkfOWvnXxMN5S1ts6NOGvu5srI8FM30ih81b3PIomzNsxmYrqe3VV/PrPuJX9SlKSitNw EZgA= X-Developer-Key: i=kees@kernel.org; a=openpgp; fpr=A5C3F68F229DD60F723E6E138972F4DFDC6DC026 X-Patchwork-Delegate: kuba@kernel.org X-Patchwork-State: RFC The proto_ops::getname callback was long ago backed by sockaddr_storage, but the replacement of it for sockaddr was never done. Plumb sockaddr_storage through all the getname callbacks and adjust prototypes and needed casts. Mostly casts to sockaddr are removed, though to avoid spilling this change into BPF, cast the sockaddr_storage instances to sockaddr for the time being. Signed-off-by: Kees Cook --- drivers/infiniband/hw/erdma/erdma_cm.h | 4 +- drivers/infiniband/hw/usnic/usnic_transport.c | 16 +++--- drivers/infiniband/sw/siw/siw_cm.h | 4 +- drivers/isdn/mISDN/socket.c | 2 +- drivers/net/ppp/pppoe.c | 2 +- drivers/net/ppp/pptp.c | 2 +- drivers/nvme/host/tcp.c | 2 +- drivers/nvme/target/tcp.c | 6 +-- drivers/scsi/iscsi_tcp.c | 18 +++---- drivers/soc/qcom/qmi_interface.c | 2 +- drivers/target/iscsi/iscsi_target_login.c | 51 +++++++++---------- fs/dlm/lowcomms.c | 2 +- fs/nfs/nfs4client.c | 4 +- fs/ocfs2/cluster/tcp.c | 25 +++++---- fs/smb/server/connection.h | 2 +- fs/smb/server/mgmt/tree_connect.c | 2 +- fs/smb/server/transport_ipc.c | 4 +- fs/smb/server/transport_ipc.h | 4 +- fs/smb/server/transport_tcp.c | 6 +-- include/linux/net.h | 6 +-- include/linux/sunrpc/clnt.h | 2 +- include/net/inet_common.h | 2 +- include/net/ipv6.h | 2 +- include/net/sock.h | 2 +- net/appletalk/ddp.c | 2 +- net/atm/pvc.c | 2 +- net/atm/svc.c | 2 +- net/ax25/af_ax25.c | 2 +- net/bluetooth/hci_sock.c | 2 +- net/bluetooth/iso.c | 6 +-- net/bluetooth/l2cap_sock.c | 6 +-- net/bluetooth/rfcomm/sock.c | 3 +- net/bluetooth/sco.c | 6 +-- net/can/isotp.c | 3 +- net/can/j1939/socket.c | 2 +- net/can/raw.c | 2 +- net/core/sock.c | 4 +- net/ipv4/af_inet.c | 2 +- net/ipv6/af_inet6.c | 2 +- net/iucv/af_iucv.c | 6 +-- net/l2tp/l2tp_ip.c | 2 +- net/l2tp/l2tp_ip6.c | 2 +- net/l2tp/l2tp_ppp.c | 2 +- net/llc/af_llc.c | 2 +- net/netlink/af_netlink.c | 4 +- net/netrom/af_netrom.c | 2 +- net/nfc/llcp_sock.c | 4 +- net/packet/af_packet.c | 15 +++--- net/phonet/socket.c | 10 ++-- net/qrtr/af_qrtr.c | 2 +- net/qrtr/ns.c | 2 +- net/rds/af_rds.c | 2 +- net/rose/af_rose.c | 2 +- net/sctp/ipv6.c | 2 +- net/smc/af_smc.c | 2 +- net/smc/smc.h | 2 +- net/smc/smc_clc.c | 2 +- net/socket.c | 10 ++-- net/sunrpc/clnt.c | 9 ++-- net/sunrpc/svcsock.c | 8 +-- net/sunrpc/xprtsock.c | 4 +- net/tipc/socket.c | 2 +- net/unix/af_unix.c | 9 ++-- net/vmw_vsock/af_vsock.c | 2 +- net/x25/af_x25.c | 2 +- security/tomoyo/network.c | 3 +- 66 files changed, 166 insertions(+), 166 deletions(-) diff --git a/drivers/infiniband/hw/erdma/erdma_cm.h b/drivers/infiniband/hw/erdma/erdma_cm.h index a26d80770188..4e46ba491d5c 100644 --- a/drivers/infiniband/hw/erdma/erdma_cm.h +++ b/drivers/infiniband/hw/erdma/erdma_cm.h @@ -141,12 +141,12 @@ struct erdma_cm_work { static inline int getname_peer(struct socket *s, struct sockaddr_storage *a) { - return s->ops->getname(s, (struct sockaddr *)a, 1); + return s->ops->getname(s, a, 1); } static inline int getname_local(struct socket *s, struct sockaddr_storage *a) { - return s->ops->getname(s, (struct sockaddr *)a, 0); + return s->ops->getname(s, a, 0); } int erdma_connect(struct iw_cm_id *id, struct iw_cm_conn_param *param); diff --git a/drivers/infiniband/hw/usnic/usnic_transport.c b/drivers/infiniband/hw/usnic/usnic_transport.c index dc37066900a5..7c38abc25671 100644 --- a/drivers/infiniband/hw/usnic/usnic_transport.c +++ b/drivers/infiniband/hw/usnic/usnic_transport.c @@ -174,24 +174,24 @@ int usnic_transport_sock_get_addr(struct socket *sock, int *proto, uint32_t *addr, uint16_t *port) { int err; - struct sockaddr_in sock_addr; + union { + struct sockaddr_storage storage; + struct sockaddr_in sock_addr; + } u; - err = sock->ops->getname(sock, - (struct sockaddr *)&sock_addr, - 0); + err = sock->ops->getname(sock, &u.storage, 0); if (err < 0) return err; - if (sock_addr.sin_family != AF_INET) + if (u.sock_addr.sin_family != AF_INET) return -EINVAL; if (proto) *proto = sock->sk->sk_protocol; if (port) - *port = ntohs(((struct sockaddr_in *)&sock_addr)->sin_port); + *port = ntohs(u.sock_addr.sin_port); if (addr) - *addr = ntohl(((struct sockaddr_in *) - &sock_addr)->sin_addr.s_addr); + *addr = ntohl(u.sock_addr.sin_addr.s_addr); return 0; } diff --git a/drivers/infiniband/sw/siw/siw_cm.h b/drivers/infiniband/sw/siw/siw_cm.h index 7011c8a8ee7b..804559be83d4 100644 --- a/drivers/infiniband/sw/siw/siw_cm.h +++ b/drivers/infiniband/sw/siw/siw_cm.h @@ -94,12 +94,12 @@ struct siw_cm_work { static inline int getname_peer(struct socket *s, struct sockaddr_storage *a) { - return s->ops->getname(s, (struct sockaddr *)a, 1); + return s->ops->getname(s, a, 1); } static inline int getname_local(struct socket *s, struct sockaddr_storage *a) { - return s->ops->getname(s, (struct sockaddr *)a, 0); + return s->ops->getname(s, a, 0); } static inline int ksock_recv(struct socket *sock, char *buf, size_t size, diff --git a/drivers/isdn/mISDN/socket.c b/drivers/isdn/mISDN/socket.c index b215b28cad7b..2a3bcbf6d15b 100644 --- a/drivers/isdn/mISDN/socket.c +++ b/drivers/isdn/mISDN/socket.c @@ -549,7 +549,7 @@ data_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_len) } static int -data_sock_getname(struct socket *sock, struct sockaddr *addr, +data_sock_getname(struct socket *sock, struct sockaddr_storage *addr, int peer) { struct sockaddr_mISDN *maddr = (struct sockaddr_mISDN *) addr; diff --git a/drivers/net/ppp/pppoe.c b/drivers/net/ppp/pppoe.c index 2ea4f4890d23..518b3f0e2701 100644 --- a/drivers/net/ppp/pppoe.c +++ b/drivers/net/ppp/pppoe.c @@ -717,7 +717,7 @@ static int pppoe_connect(struct socket *sock, struct sockaddr *uservaddr, goto end; } -static int pppoe_getname(struct socket *sock, struct sockaddr *uaddr, +static int pppoe_getname(struct socket *sock, struct sockaddr_storage *uaddr, int peer) { int len = sizeof(struct sockaddr_pppox); diff --git a/drivers/net/ppp/pptp.c b/drivers/net/ppp/pptp.c index 689687bd2574..9f3b38e311f4 100644 --- a/drivers/net/ppp/pptp.c +++ b/drivers/net/ppp/pptp.c @@ -479,7 +479,7 @@ static int pptp_connect(struct socket *sock, struct sockaddr *uservaddr, return error; } -static int pptp_getname(struct socket *sock, struct sockaddr *uaddr, +static int pptp_getname(struct socket *sock, struct sockaddr_storage *uaddr, int peer) { int len = sizeof(struct sockaddr_pppox); diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c index 89c44413c593..6647d0e754ad 100644 --- a/drivers/nvme/host/tcp.c +++ b/drivers/nvme/host/tcp.c @@ -2648,7 +2648,7 @@ static int nvme_tcp_get_address(struct nvme_ctrl *ctrl, char *buf, int size) if (!test_bit(NVME_TCP_Q_LIVE, &queue->flags)) goto done; - ret = kernel_getsockname(queue->sock, (struct sockaddr *)&src_addr); + ret = kernel_getsockname(queue->sock, &src_addr); if (ret > 0) { if (len > 0) len--; /* strip trailing newline */ diff --git a/drivers/nvme/target/tcp.c b/drivers/nvme/target/tcp.c index df24244fb820..87324c723ed4 100644 --- a/drivers/nvme/target/tcp.c +++ b/drivers/nvme/target/tcp.c @@ -1689,13 +1689,11 @@ static int nvmet_tcp_set_queue_sock(struct nvmet_tcp_queue *queue) struct inet_sock *inet = inet_sk(sock->sk); int ret; - ret = kernel_getsockname(sock, - (struct sockaddr *)&queue->sockaddr); + ret = kernel_getsockname(sock, &queue->sockaddr); if (ret < 0) return ret; - ret = kernel_getpeername(sock, - (struct sockaddr *)&queue->sockaddr_peer); + ret = kernel_getpeername(sock, &queue->sockaddr_peer); if (ret < 0) return ret; diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c index c708e1059638..0a457f8a5062 100644 --- a/drivers/scsi/iscsi_tcp.c +++ b/drivers/scsi/iscsi_tcp.c @@ -794,7 +794,7 @@ static int iscsi_sw_tcp_conn_get_param(struct iscsi_cls_conn *cls_conn, struct iscsi_conn *conn = cls_conn->dd_data; struct iscsi_sw_tcp_conn *tcp_sw_conn; struct iscsi_tcp_conn *tcp_conn; - struct sockaddr_in6 addr; + struct sockaddr_storage addr; struct socket *sock; int rc; @@ -825,19 +825,16 @@ static int iscsi_sw_tcp_conn_get_param(struct iscsi_cls_conn *cls_conn, } if (param == ISCSI_PARAM_LOCAL_PORT) - rc = kernel_getsockname(sock, - (struct sockaddr *)&addr); + rc = kernel_getsockname(sock, &addr); else - rc = kernel_getpeername(sock, - (struct sockaddr *)&addr); + rc = kernel_getpeername(sock, &addr); sock_unlock: mutex_unlock(&tcp_sw_conn->sock_lock); iscsi_put_conn(conn->cls_conn); if (rc < 0) return rc; - return iscsi_conn_get_addr_param((struct sockaddr_storage *) - &addr, param, buf); + return iscsi_conn_get_addr_param(&addr, param, buf); default: return iscsi_conn_get_param(cls_conn, param, buf); } @@ -853,7 +850,7 @@ static int iscsi_sw_tcp_host_get_param(struct Scsi_Host *shost, struct iscsi_conn *conn; struct iscsi_tcp_conn *tcp_conn; struct iscsi_sw_tcp_conn *tcp_sw_conn; - struct sockaddr_in6 addr; + struct sockaddr_storage addr; struct socket *sock; int rc; @@ -883,14 +880,13 @@ static int iscsi_sw_tcp_host_get_param(struct Scsi_Host *shost, if (!sock) rc = -ENOTCONN; else - rc = kernel_getsockname(sock, (struct sockaddr *)&addr); + rc = kernel_getsockname(sock, &addr); mutex_unlock(&tcp_sw_conn->sock_lock); iscsi_put_conn(conn->cls_conn); if (rc < 0) return rc; - return iscsi_conn_get_addr_param((struct sockaddr_storage *) - &addr, + return iscsi_conn_get_addr_param(&addr, (enum iscsi_param)param, buf); default: return iscsi_host_get_param(shost, param, buf); diff --git a/drivers/soc/qcom/qmi_interface.c b/drivers/soc/qcom/qmi_interface.c index bb98b06e87f8..d495e63aa2ee 100644 --- a/drivers/soc/qcom/qmi_interface.c +++ b/drivers/soc/qcom/qmi_interface.c @@ -593,7 +593,7 @@ static struct socket *qmi_sock_create(struct qmi_handle *qmi, if (ret < 0) return ERR_PTR(ret); - ret = kernel_getsockname(sock, (struct sockaddr *)sq); + ret = kernel_getsockname(sock, (struct sockaddr_storage *)sq); if (ret < 0) { sock_release(sock); return ERR_PTR(ret); diff --git a/drivers/target/iscsi/iscsi_target_login.c b/drivers/target/iscsi/iscsi_target_login.c index 90b870f234f0..9fcbfba43035 100644 --- a/drivers/target/iscsi/iscsi_target_login.c +++ b/drivers/target/iscsi/iscsi_target_login.c @@ -907,8 +907,11 @@ int iscsi_target_setup_login_socket( int iscsit_accept_np(struct iscsi_np *np, struct iscsit_conn *conn) { struct socket *new_sock, *sock = np->np_socket; - struct sockaddr_in sock_in; - struct sockaddr_in6 sock_in6; + union { + struct sockaddr_storage storage; + struct sockaddr_in sock_in; + struct sockaddr_in6 sock_in6; + } u; int rc; rc = kernel_accept(sock, &new_sock, 0); @@ -919,47 +922,43 @@ int iscsit_accept_np(struct iscsi_np *np, struct iscsit_conn *conn) conn->login_family = np->np_sockaddr.ss_family; if (np->np_sockaddr.ss_family == AF_INET6) { - memset(&sock_in6, 0, sizeof(struct sockaddr_in6)); + memset(&u.sock_in6, 0, sizeof(struct sockaddr_in6)); - rc = conn->sock->ops->getname(conn->sock, - (struct sockaddr *)&sock_in6, 1); + rc = conn->sock->ops->getname(conn->sock, &u.storage, 1); if (rc >= 0) { - if (!ipv6_addr_v4mapped(&sock_in6.sin6_addr)) { - memcpy(&conn->login_sockaddr, &sock_in6, sizeof(sock_in6)); + if (!ipv6_addr_v4mapped(&u.sock_in6.sin6_addr)) { + memcpy(&conn->login_sockaddr, &u.sock_in6, sizeof(u.sock_in6)); } else { /* Pretend to be an ipv4 socket */ - sock_in.sin_family = AF_INET; - sock_in.sin_port = sock_in6.sin6_port; - memcpy(&sock_in.sin_addr, &sock_in6.sin6_addr.s6_addr32[3], 4); - memcpy(&conn->login_sockaddr, &sock_in, sizeof(sock_in)); + u.sock_in.sin_family = AF_INET; + u.sock_in.sin_port = u.sock_in6.sin6_port; + memcpy(&u.sock_in.sin_addr, &u.sock_in6.sin6_addr.s6_addr32[3], 4); + memcpy(&conn->login_sockaddr, &u.sock_in, sizeof(u.sock_in)); } } - rc = conn->sock->ops->getname(conn->sock, - (struct sockaddr *)&sock_in6, 0); + rc = conn->sock->ops->getname(conn->sock, &u.storage, 0); if (rc >= 0) { - if (!ipv6_addr_v4mapped(&sock_in6.sin6_addr)) { - memcpy(&conn->local_sockaddr, &sock_in6, sizeof(sock_in6)); + if (!ipv6_addr_v4mapped(&u.sock_in6.sin6_addr)) { + memcpy(&conn->local_sockaddr, &u.sock_in6, sizeof(u.sock_in6)); } else { /* Pretend to be an ipv4 socket */ - sock_in.sin_family = AF_INET; - sock_in.sin_port = sock_in6.sin6_port; - memcpy(&sock_in.sin_addr, &sock_in6.sin6_addr.s6_addr32[3], 4); - memcpy(&conn->local_sockaddr, &sock_in, sizeof(sock_in)); + u.sock_in.sin_family = AF_INET; + u.sock_in.sin_port = u.sock_in6.sin6_port; + memcpy(&u.sock_in.sin_addr, &u.sock_in6.sin6_addr.s6_addr32[3], 4); + memcpy(&conn->local_sockaddr, &u.sock_in, sizeof(u.sock_in)); } } } else { - memset(&sock_in, 0, sizeof(struct sockaddr_in)); + memset(&u.sock_in, 0, sizeof(struct sockaddr_in)); - rc = conn->sock->ops->getname(conn->sock, - (struct sockaddr *)&sock_in, 1); + rc = conn->sock->ops->getname(conn->sock, &u.storage, 1); if (rc >= 0) - memcpy(&conn->login_sockaddr, &sock_in, sizeof(sock_in)); + memcpy(&conn->login_sockaddr, &u.sock_in, sizeof(u.sock_in)); - rc = conn->sock->ops->getname(conn->sock, - (struct sockaddr *)&sock_in, 0); + rc = conn->sock->ops->getname(conn->sock, &u.storage, 0); if (rc >= 0) - memcpy(&conn->local_sockaddr, &sock_in, sizeof(sock_in)); + memcpy(&conn->local_sockaddr, &u.sock_in, sizeof(u.sock_in)); } return 0; diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c index cb3a10b041c2..c5467753c72d 100644 --- a/fs/dlm/lowcomms.c +++ b/fs/dlm/lowcomms.c @@ -993,7 +993,7 @@ static int accept_from_sock(void) /* Get the connected socket's peer */ memset(&peeraddr, 0, sizeof(peeraddr)); - len = newsock->ops->getname(newsock, (struct sockaddr *)&peeraddr, 2); + len = newsock->ops->getname(newsock, &peeraddr, 2); if (len < 0) { result = -ECONNABORTED; goto accept_err; diff --git a/fs/nfs/nfs4client.c b/fs/nfs/nfs4client.c index 83378f69b35e..a7428367a526 100644 --- a/fs/nfs/nfs4client.c +++ b/fs/nfs/nfs4client.c @@ -248,7 +248,7 @@ struct nfs_client *nfs4_alloc_client(const struct nfs_client_initdata *cl_init) struct sockaddr_storage cb_addr; struct sockaddr *sap = (struct sockaddr *)&cb_addr; - err = rpc_localaddr(clp->cl_rpcclient, sap, sizeof(cb_addr)); + err = rpc_localaddr(clp->cl_rpcclient, &cb_addr, sizeof(cb_addr)); if (err < 0) goto error; err = rpc_ntop(sap, buf, sizeof(buf)); @@ -1352,7 +1352,7 @@ int nfs4_update_server(struct nfs_server *server, const char *hostname, if (error != 0) return error; - error = rpc_localaddr(clnt, localaddr, sizeof(address)); + error = rpc_localaddr(clnt, &address, sizeof(address)); if (error != 0) return error; diff --git a/fs/ocfs2/cluster/tcp.c b/fs/ocfs2/cluster/tcp.c index 2b8fa3e782fb..28996cd2300d 100644 --- a/fs/ocfs2/cluster/tcp.c +++ b/fs/ocfs2/cluster/tcp.c @@ -1779,7 +1779,10 @@ int o2net_register_hb_callbacks(void) static int o2net_accept_one(struct socket *sock, int *more) { int ret; - struct sockaddr_in sin; + union { + struct sockaddr_storage storage; + struct sockaddr_in sin; + } u; struct socket *new_sock = NULL; struct o2nm_node *node = NULL; struct o2nm_node *local_node = NULL; @@ -1815,15 +1818,15 @@ static int o2net_accept_one(struct socket *sock, int *more) tcp_sock_set_nodelay(new_sock->sk); tcp_sock_set_user_timeout(new_sock->sk, O2NET_TCP_USER_TIMEOUT); - ret = new_sock->ops->getname(new_sock, (struct sockaddr *) &sin, 1); + ret = new_sock->ops->getname(new_sock, &u.storage, 1); if (ret < 0) goto out; - node = o2nm_get_node_by_ip(sin.sin_addr.s_addr); + node = o2nm_get_node_by_ip(u.sin.sin_addr.s_addr); if (node == NULL) { printk(KERN_NOTICE "o2net: Attempt to connect from unknown " - "node at %pI4:%d\n", &sin.sin_addr.s_addr, - ntohs(sin.sin_port)); + "node at %pI4:%d\n", &u.sin.sin_addr.s_addr, + ntohs(u.sin.sin_port)); ret = -EINVAL; goto out; } @@ -1838,8 +1841,8 @@ static int o2net_accept_one(struct socket *sock, int *more) &(local_node->nd_ipv4_address), ntohs(local_node->nd_ipv4_port), node->nd_name, - node->nd_num, &sin.sin_addr.s_addr, - ntohs(sin.sin_port)); + node->nd_num, &u.sin.sin_addr.s_addr, + ntohs(u.sin.sin_port)); ret = -EINVAL; goto out; } @@ -1849,8 +1852,8 @@ static int o2net_accept_one(struct socket *sock, int *more) if (!o2hb_check_node_heartbeating_from_callback(node->nd_num)) { mlog(ML_CONN, "attempt to connect from node '%s' at " "%pI4:%d but it isn't heartbeating\n", - node->nd_name, &sin.sin_addr.s_addr, - ntohs(sin.sin_port)); + node->nd_name, &u.sin.sin_addr.s_addr, + ntohs(u.sin.sin_port)); ret = -EINVAL; goto out; } @@ -1866,8 +1869,8 @@ static int o2net_accept_one(struct socket *sock, int *more) if (ret) { printk(KERN_NOTICE "o2net: Attempt to connect from node '%s' " "at %pI4:%d but it already has an open connection\n", - node->nd_name, &sin.sin_addr.s_addr, - ntohs(sin.sin_port)); + node->nd_name, &u.sin.sin_addr.s_addr, + ntohs(u.sin.sin_port)); goto out; } diff --git a/fs/smb/server/connection.h b/fs/smb/server/connection.h index b379ae4fdcdf..6839fbefdaf0 100644 --- a/fs/smb/server/connection.h +++ b/fs/smb/server/connection.h @@ -140,7 +140,7 @@ struct ksmbd_transport { #define KSMBD_TCP_RECV_TIMEOUT (7 * HZ) #define KSMBD_TCP_SEND_TIMEOUT (5 * HZ) -#define KSMBD_TCP_PEER_SOCKADDR(c) ((struct sockaddr *)&((c)->peer_addr)) +#define KSMBD_TCP_PEER_SOCKADDR(c) (&((c)->peer_addr)) extern struct list_head conn_list; extern struct rw_semaphore conn_list_lock; diff --git a/fs/smb/server/mgmt/tree_connect.c b/fs/smb/server/mgmt/tree_connect.c index 94a52a75014a..1f2b11df6229 100644 --- a/fs/smb/server/mgmt/tree_connect.c +++ b/fs/smb/server/mgmt/tree_connect.c @@ -22,7 +22,7 @@ ksmbd_tree_conn_connect(struct ksmbd_work *work, const char *share_name) struct ksmbd_tree_connect_response *resp = NULL; struct ksmbd_share_config *sc; struct ksmbd_tree_connect *tree_conn = NULL; - struct sockaddr *peer_addr; + struct sockaddr_storage *peer_addr; struct ksmbd_conn *conn = work->conn; struct ksmbd_session *sess = work->sess; int ret; diff --git a/fs/smb/server/transport_ipc.c b/fs/smb/server/transport_ipc.c index 8752ac82c557..05ea6426b341 100644 --- a/fs/smb/server/transport_ipc.c +++ b/fs/smb/server/transport_ipc.c @@ -588,7 +588,7 @@ struct ksmbd_tree_connect_response * ksmbd_ipc_tree_connect_request(struct ksmbd_session *sess, struct ksmbd_share_config *share, struct ksmbd_tree_connect *tree_conn, - struct sockaddr *peer_addr) + struct sockaddr_storage *peer_addr) { struct ksmbd_ipc_msg *msg; struct ksmbd_tree_connect_request *req; @@ -615,7 +615,7 @@ ksmbd_ipc_tree_connect_request(struct ksmbd_session *sess, strscpy(req->share, share->name, KSMBD_REQ_MAX_SHARE_NAME); snprintf(req->peer_addr, sizeof(req->peer_addr), "%pIS", peer_addr); - if (peer_addr->sa_family == AF_INET6) + if (peer_addr->ss_family == AF_INET6) req->flags |= KSMBD_TREE_CONN_FLAG_REQUEST_IPV6; if (test_session_flag(sess, CIFDS_SESSION_FLAG_SMB2)) req->flags |= KSMBD_TREE_CONN_FLAG_REQUEST_SMB2; diff --git a/fs/smb/server/transport_ipc.h b/fs/smb/server/transport_ipc.h index 5e5b90a0c187..0a69e758430e 100644 --- a/fs/smb/server/transport_ipc.h +++ b/fs/smb/server/transport_ipc.h @@ -16,13 +16,13 @@ ksmbd_ipc_login_request(const char *account); struct ksmbd_session; struct ksmbd_share_config; struct ksmbd_tree_connect; -struct sockaddr; +struct __kernel_sockaddr_storage; struct ksmbd_tree_connect_response * ksmbd_ipc_tree_connect_request(struct ksmbd_session *sess, struct ksmbd_share_config *share, struct ksmbd_tree_connect *tree_conn, - struct sockaddr *peer_addr); + struct __kernel_sockaddr_storage *peer_addr); int ksmbd_ipc_tree_disconnect_request(unsigned long long session_id, unsigned long long connect_id); int ksmbd_ipc_logout_request(const char *account, int flags); diff --git a/fs/smb/server/transport_tcp.c b/fs/smb/server/transport_tcp.c index aaed9e293b2e..71e0ed852006 100644 --- a/fs/smb/server/transport_tcp.c +++ b/fs/smb/server/transport_tcp.c @@ -160,9 +160,9 @@ static struct kvec *get_conn_iovec(struct tcp_transport *t, unsigned int nr_segs return new_iov; } -static unsigned short ksmbd_tcp_get_port(const struct sockaddr *sa) +static unsigned short ksmbd_tcp_get_port(const struct sockaddr_storage *sa) { - switch (sa->sa_family) { + switch (sa->ss_family) { case AF_INET: return ntohs(((struct sockaddr_in *)sa)->sin_port); case AF_INET6: @@ -182,7 +182,7 @@ static unsigned short ksmbd_tcp_get_port(const struct sockaddr *sa) */ static int ksmbd_tcp_new_connection(struct socket *client_sk) { - struct sockaddr *csin; + struct sockaddr_storage *csin; int rc = 0; struct tcp_transport *t; struct task_struct *handler; diff --git a/include/linux/net.h b/include/linux/net.h index b75bc534c1b3..e31baa3fb360 100644 --- a/include/linux/net.h +++ b/include/linux/net.h @@ -175,7 +175,7 @@ struct proto_ops { struct socket *newsock, struct proto_accept_arg *arg); int (*getname) (struct socket *sock, - struct sockaddr *addr, + struct sockaddr_storage *addr, int peer); __poll_t (*poll) (struct file *file, struct socket *sock, struct poll_table_struct *wait); @@ -353,8 +353,8 @@ 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 flags); -int kernel_getsockname(struct socket *sock, struct sockaddr *addr); -int kernel_getpeername(struct socket *sock, struct sockaddr *addr); +int kernel_getsockname(struct socket *sock, struct sockaddr_storage *addr); +int kernel_getpeername(struct socket *sock, struct sockaddr_storage *addr); int kernel_sock_shutdown(struct socket *sock, enum sock_shutdown_cmd how); /* Routine returns the IP overhead imposed by a (caller-protected) socket. */ diff --git a/include/linux/sunrpc/clnt.h b/include/linux/sunrpc/clnt.h index 5321585c778f..fde6791c1137 100644 --- a/include/linux/sunrpc/clnt.h +++ b/include/linux/sunrpc/clnt.h @@ -223,7 +223,7 @@ unsigned int rpc_num_bc_slots(struct rpc_clnt *); void rpc_force_rebind(struct rpc_clnt *); size_t rpc_peeraddr(struct rpc_clnt *, struct sockaddr *, size_t); const char *rpc_peeraddr2str(struct rpc_clnt *, enum rpc_display_format_t); -int rpc_localaddr(struct rpc_clnt *, struct sockaddr *, size_t); +int rpc_localaddr(struct rpc_clnt *, struct sockaddr_storage *, size_t); int rpc_clnt_iterate_for_each_xprt(struct rpc_clnt *clnt, int (*fn)(struct rpc_clnt *, struct rpc_xprt *, void *), diff --git a/include/net/inet_common.h b/include/net/inet_common.h index c17a6585d0b0..2bc95e0171e7 100644 --- a/include/net/inet_common.h +++ b/include/net/inet_common.h @@ -54,7 +54,7 @@ int inet_bind_sk(struct sock *sk, struct sockaddr *uaddr, int addr_len); #define BIND_NO_CAP_NET_BIND_SERVICE (1 << 3) int __inet_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len, u32 flags); -int inet_getname(struct socket *sock, struct sockaddr *uaddr, +int inet_getname(struct socket *sock, struct sockaddr_storage *uaddr, int peer); int inet_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); int inet_ctl_sock_create(struct sock **sk, unsigned short family, diff --git a/include/net/ipv6.h b/include/net/ipv6.h index 248bfb26e2af..e0ee07a8486e 100644 --- a/include/net/ipv6.h +++ b/include/net/ipv6.h @@ -1214,7 +1214,7 @@ 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_sk(struct sock *sk, struct sockaddr *uaddr, int addr_len); -int inet6_getname(struct socket *sock, struct sockaddr *uaddr, +int inet6_getname(struct socket *sock, struct sockaddr_storage *uaddr, int peer); int inet6_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); int inet6_compat_ioctl(struct socket *sock, unsigned int cmd, diff --git a/include/net/sock.h b/include/net/sock.h index c58ca8dd561b..6ec875591415 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -1819,7 +1819,7 @@ int sock_no_bind(struct socket *, struct sockaddr *, int); 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 *); -int sock_no_getname(struct socket *, struct sockaddr *, int); +int sock_no_getname(struct socket *, struct sockaddr_storage *, int); int sock_no_ioctl(struct socket *, unsigned int, unsigned long); int sock_no_listen(struct socket *, int); int sock_no_shutdown(struct socket *, int); diff --git a/net/appletalk/ddp.c b/net/appletalk/ddp.c index b068651984fe..b0a5137e9dce 100644 --- a/net/appletalk/ddp.c +++ b/net/appletalk/ddp.c @@ -1258,7 +1258,7 @@ static int atalk_connect(struct socket *sock, struct sockaddr *uaddr, * Find the name of an AppleTalk socket. Just copy the right * fields into the sockaddr. */ -static int atalk_getname(struct socket *sock, struct sockaddr *uaddr, +static int atalk_getname(struct socket *sock, struct sockaddr_storage *uaddr, int peer) { struct sockaddr_at sat; diff --git a/net/atm/pvc.c b/net/atm/pvc.c index 66d9a9bd5896..897b82de7a5b 100644 --- a/net/atm/pvc.c +++ b/net/atm/pvc.c @@ -86,7 +86,7 @@ static int pvc_getsockopt(struct socket *sock, int level, int optname, return error; } -static int pvc_getname(struct socket *sock, struct sockaddr *sockaddr, +static int pvc_getname(struct socket *sock, struct sockaddr_storage *sockaddr, int peer) { struct sockaddr_atmpvc *addr; diff --git a/net/atm/svc.c b/net/atm/svc.c index f8137ae693b0..b02f5833cc9a 100644 --- a/net/atm/svc.c +++ b/net/atm/svc.c @@ -423,7 +423,7 @@ static int svc_accept(struct socket *sock, struct socket *newsock, return error; } -static int svc_getname(struct socket *sock, struct sockaddr *sockaddr, +static int svc_getname(struct socket *sock, struct sockaddr_storage *sockaddr, int peer) { struct sockaddr_atmsvc *addr; diff --git a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c index d6f9fae06a9d..e203cd453592 100644 --- a/net/ax25/af_ax25.c +++ b/net/ax25/af_ax25.c @@ -1447,7 +1447,7 @@ static int ax25_accept(struct socket *sock, struct socket *newsock, return err; } -static int ax25_getname(struct socket *sock, struct sockaddr *uaddr, +static int ax25_getname(struct socket *sock, struct sockaddr_storage *uaddr, int peer) { struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)uaddr; diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c index 2272e1849ebd..3fe844460fc4 100644 --- a/net/bluetooth/hci_sock.c +++ b/net/bluetooth/hci_sock.c @@ -1478,7 +1478,7 @@ static int hci_sock_bind(struct socket *sock, struct sockaddr *addr, return err; } -static int hci_sock_getname(struct socket *sock, struct sockaddr *addr, +static int hci_sock_getname(struct socket *sock, struct sockaddr_storage *addr, int peer) { struct sockaddr_hci *haddr = (struct sockaddr_hci *)addr; diff --git a/net/bluetooth/iso.c b/net/bluetooth/iso.c index d5e00d0dd1a0..a1935026c931 100644 --- a/net/bluetooth/iso.c +++ b/net/bluetooth/iso.c @@ -1213,15 +1213,15 @@ static int iso_sock_accept(struct socket *sock, struct socket *newsock, return err; } -static int iso_sock_getname(struct socket *sock, struct sockaddr *addr, - int peer) +static int iso_sock_getname(struct socket *sock, + struct sockaddr_storage *addr, int peer) { struct sockaddr_iso *sa = (struct sockaddr_iso *)addr; struct sock *sk = sock->sk; BT_DBG("sock %p, sk %p", sock, sk); - addr->sa_family = AF_BLUETOOTH; + sa->iso_family = AF_BLUETOOTH; if (peer) { bacpy(&sa->iso_bdaddr, &iso_pi(sk)->dst); diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c index ba437c6f6ee5..6a6db32a0a27 100644 --- a/net/bluetooth/l2cap_sock.c +++ b/net/bluetooth/l2cap_sock.c @@ -382,8 +382,8 @@ static int l2cap_sock_accept(struct socket *sock, struct socket *newsock, return err; } -static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr, - int peer) +static int l2cap_sock_getname(struct socket *sock, + struct sockaddr_storage *addr, int peer) { struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr; struct sock *sk = sock->sk; @@ -397,7 +397,7 @@ static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr, return -ENOTCONN; memset(la, 0, sizeof(struct sockaddr_l2)); - addr->sa_family = AF_BLUETOOTH; + la->l2_family = AF_BLUETOOTH; la->l2_psm = chan->psm; diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c index 37d63d768afb..8253dd2094fc 100644 --- a/net/bluetooth/rfcomm/sock.c +++ b/net/bluetooth/rfcomm/sock.c @@ -529,7 +529,8 @@ static int rfcomm_sock_accept(struct socket *sock, struct socket *newsock, return err; } -static int rfcomm_sock_getname(struct socket *sock, struct sockaddr *addr, int peer) +static int rfcomm_sock_getname(struct socket *sock, struct sockaddr_storage *addr, + int peer) { struct sockaddr_rc *sa = (struct sockaddr_rc *) addr; struct sock *sk = sock->sk; diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c index a5ac160c592e..370394d1d7fb 100644 --- a/net/bluetooth/sco.c +++ b/net/bluetooth/sco.c @@ -701,15 +701,15 @@ static int sco_sock_accept(struct socket *sock, struct socket *newsock, return err; } -static int sco_sock_getname(struct socket *sock, struct sockaddr *addr, - int peer) +static int sco_sock_getname(struct socket *sock, + struct sockaddr_storage *addr, int peer) { struct sockaddr_sco *sa = (struct sockaddr_sco *) addr; struct sock *sk = sock->sk; BT_DBG("sock %p, sk %p", sock, sk); - addr->sa_family = AF_BLUETOOTH; + sa->sco_family = AF_BLUETOOTH; if (peer) bacpy(&sa->sco_bdaddr, &sco_pi(sk)->dst); diff --git a/net/can/isotp.c b/net/can/isotp.c index 16046931542a..5afb88885548 100644 --- a/net/can/isotp.c +++ b/net/can/isotp.c @@ -1352,7 +1352,8 @@ static int isotp_bind(struct socket *sock, struct sockaddr *uaddr, int len) return err; } -static int isotp_getname(struct socket *sock, struct sockaddr *uaddr, int peer) +static int isotp_getname(struct socket *sock, struct sockaddr_storage *uaddr, + int peer) { struct sockaddr_can *addr = (struct sockaddr_can *)uaddr; struct sock *sk = sock->sk; diff --git a/net/can/j1939/socket.c b/net/can/j1939/socket.c index 305dd72c844c..66ea829811ab 100644 --- a/net/can/j1939/socket.c +++ b/net/can/j1939/socket.c @@ -598,7 +598,7 @@ static void j1939_sk_sock2sockaddr_can(struct sockaddr_can *addr, } } -static int j1939_sk_getname(struct socket *sock, struct sockaddr *uaddr, +static int j1939_sk_getname(struct socket *sock, struct sockaddr_storage *uaddr, int peer) { struct sockaddr_can *addr = (struct sockaddr_can *)uaddr; diff --git a/net/can/raw.c b/net/can/raw.c index 00533f64d69d..8f76514dffe4 100644 --- a/net/can/raw.c +++ b/net/can/raw.c @@ -530,7 +530,7 @@ static int raw_bind(struct socket *sock, struct sockaddr *uaddr, int len) return err; } -static int raw_getname(struct socket *sock, struct sockaddr *uaddr, +static int raw_getname(struct socket *sock, struct sockaddr_storage *uaddr, int peer) { struct sockaddr_can *addr = (struct sockaddr_can *)uaddr; diff --git a/net/core/sock.c b/net/core/sock.c index 039be95c40cf..ac9de043bcbf 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -1908,7 +1908,7 @@ int sk_getsockopt(struct sock *sk, int level, int optname, { struct sockaddr_storage address; - lv = READ_ONCE(sock->ops)->getname(sock, (struct sockaddr *)&address, 2); + lv = READ_ONCE(sock->ops)->getname(sock, &address, 2); if (lv < 0) return -ENOTCONN; if (lv < len) @@ -3337,7 +3337,7 @@ int sock_no_accept(struct socket *sock, struct socket *newsock, } EXPORT_SYMBOL(sock_no_accept); -int sock_no_getname(struct socket *sock, struct sockaddr *saddr, +int sock_no_getname(struct socket *sock, struct sockaddr_storage *saddr, int peer) { return -EOPNOTSUPP; diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index b24d74616637..252e43d18ff7 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c @@ -794,7 +794,7 @@ EXPORT_SYMBOL(inet_accept); /* * This does both peername and sockname. */ -int inet_getname(struct socket *sock, struct sockaddr *uaddr, +int inet_getname(struct socket *sock, struct sockaddr_storage *uaddr, int peer) { struct sock *sk = sock->sk; diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c index ba69b86f1c7d..3a6ba7a2fdae 100644 --- a/net/ipv6/af_inet6.c +++ b/net/ipv6/af_inet6.c @@ -520,7 +520,7 @@ EXPORT_SYMBOL_GPL(inet6_cleanup_sock); /* * This does both peername and sockname. */ -int inet6_getname(struct socket *sock, struct sockaddr *uaddr, +int inet6_getname(struct socket *sock, struct sockaddr_storage *uaddr, int peer) { struct sockaddr_in6 *sin = (struct sockaddr_in6 *)uaddr; diff --git a/net/iucv/af_iucv.c b/net/iucv/af_iucv.c index c00323fa9eb6..d7ee6d7b9b1c 100644 --- a/net/iucv/af_iucv.c +++ b/net/iucv/af_iucv.c @@ -848,14 +848,14 @@ static int iucv_sock_accept(struct socket *sock, struct socket *newsock, return err; } -static int iucv_sock_getname(struct socket *sock, struct sockaddr *addr, - int peer) +static int iucv_sock_getname(struct socket *sock, + struct sockaddr_storage *addr, int peer) { DECLARE_SOCKADDR(struct sockaddr_iucv *, siucv, addr); struct sock *sk = sock->sk; struct iucv_sock *iucv = iucv_sk(sk); - addr->sa_family = AF_IUCV; + siucv->sa_family = AF_IUCV; if (peer) { memcpy(siucv->siucv_user_id, iucv->dst_user_id, 8); diff --git a/net/l2tp/l2tp_ip.c b/net/l2tp/l2tp_ip.c index 4bc24fddfd52..ed92eabb8552 100644 --- a/net/l2tp/l2tp_ip.c +++ b/net/l2tp/l2tp_ip.c @@ -373,7 +373,7 @@ static int l2tp_ip_disconnect(struct sock *sk, int flags) return __udp_disconnect(sk, flags); } -static int l2tp_ip_getname(struct socket *sock, struct sockaddr *uaddr, +static int l2tp_ip_getname(struct socket *sock, struct sockaddr_storage *uaddr, int peer) { struct sock *sk = sock->sk; diff --git a/net/l2tp/l2tp_ip6.c b/net/l2tp/l2tp_ip6.c index f4c1da070826..59a5e74b2561 100644 --- a/net/l2tp/l2tp_ip6.c +++ b/net/l2tp/l2tp_ip6.c @@ -443,7 +443,7 @@ static int l2tp_ip6_disconnect(struct sock *sk, int flags) return __udp_disconnect(sk, flags); } -static int l2tp_ip6_getname(struct socket *sock, struct sockaddr *uaddr, +static int l2tp_ip6_getname(struct socket *sock, struct sockaddr_storage *uaddr, int peer) { struct sockaddr_l2tpip6 *lsa = (struct sockaddr_l2tpip6 *)uaddr; diff --git a/net/l2tp/l2tp_ppp.c b/net/l2tp/l2tp_ppp.c index 53baf2dd5d5d..ae1536ed5a5b 100644 --- a/net/l2tp/l2tp_ppp.c +++ b/net/l2tp/l2tp_ppp.c @@ -886,7 +886,7 @@ static int pppol2tp_session_create(struct net *net, struct l2tp_tunnel *tunnel, /* getname() support. */ -static int pppol2tp_getname(struct socket *sock, struct sockaddr *uaddr, +static int pppol2tp_getname(struct socket *sock, struct sockaddr_storage *uaddr, int peer) { int len = 0; diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c index 4eb52add7103..9cc28550b25b 100644 --- a/net/llc/af_llc.c +++ b/net/llc/af_llc.c @@ -1023,7 +1023,7 @@ static int llc_ui_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) * * Return the address information of a socket. */ -static int llc_ui_getname(struct socket *sock, struct sockaddr *uaddr, +static int llc_ui_getname(struct socket *sock, struct sockaddr_storage *uaddr, int peer) { struct sockaddr_llc sllc; diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 0b7a89db3ab7..eda7f2203c6f 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c @@ -1128,8 +1128,8 @@ static int netlink_connect(struct socket *sock, struct sockaddr *addr, return err; } -static int netlink_getname(struct socket *sock, struct sockaddr *addr, - int peer) +static int netlink_getname(struct socket *sock, + struct sockaddr_storage *addr, int peer) { struct sock *sk = sock->sk; struct netlink_sock *nlk = nlk_sk(sk); diff --git a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c index 6ee148f0e6d0..637a88782292 100644 --- a/net/netrom/af_netrom.c +++ b/net/netrom/af_netrom.c @@ -835,7 +835,7 @@ static int nr_accept(struct socket *sock, struct socket *newsock, return err; } -static int nr_getname(struct socket *sock, struct sockaddr *uaddr, +static int nr_getname(struct socket *sock, struct sockaddr_storage *uaddr, int peer) { struct full_sockaddr_ax25 *sax = (struct full_sockaddr_ax25 *)uaddr; diff --git a/net/nfc/llcp_sock.c b/net/nfc/llcp_sock.c index 57a2f97004e1..1ba19e542320 100644 --- a/net/nfc/llcp_sock.c +++ b/net/nfc/llcp_sock.c @@ -500,8 +500,8 @@ static int llcp_sock_accept(struct socket *sock, struct socket *newsock, return ret; } -static int llcp_sock_getname(struct socket *sock, struct sockaddr *uaddr, - int peer) +static int llcp_sock_getname(struct socket *sock, + struct sockaddr_storage *uaddr, int peer) { struct sock *sk = sock->sk; struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk); diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index aa5e368a744a..31fdbde64998 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c @@ -3639,27 +3639,28 @@ static int packet_recvmsg(struct socket *sock, struct msghdr *msg, size_t len, return err; } -static int packet_getname_spkt(struct socket *sock, struct sockaddr *uaddr, - int peer) +static int packet_getname_spkt(struct socket *sock, + struct sockaddr_storage *uaddr, int peer) { + struct sockaddr *addr = (struct sockaddr *)uaddr; struct net_device *dev; struct sock *sk = sock->sk; if (peer) return -EOPNOTSUPP; - uaddr->sa_family = AF_PACKET; - memset(uaddr->sa_data, 0, sizeof(uaddr->sa_data)); + addr->sa_family = AF_PACKET; + memset(addr->sa_data, 0, sizeof(addr->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)); + strscpy(addr->sa_data, dev->name, sizeof(addr->sa_data)); rcu_read_unlock(); - return sizeof(*uaddr); + return sizeof(*addr); } -static int packet_getname(struct socket *sock, struct sockaddr *uaddr, +static int packet_getname(struct socket *sock, struct sockaddr_storage *uaddr, int peer) { struct net_device *dev; diff --git a/net/phonet/socket.c b/net/phonet/socket.c index 5ce0b3ee5def..711c70cc110a 100644 --- a/net/phonet/socket.c +++ b/net/phonet/socket.c @@ -311,17 +311,17 @@ static int pn_socket_accept(struct socket *sock, struct socket *newsock, return 0; } -static int pn_socket_getname(struct socket *sock, struct sockaddr *addr, - int peer) +static int pn_socket_getname(struct socket *sock, + struct sockaddr_storage *uaddr, int peer) { + struct sockaddr_pn *addr = (struct sockaddr_pn *)uaddr; struct sock *sk = sock->sk; struct pn_sock *pn = pn_sk(sk); memset(addr, 0, sizeof(struct sockaddr_pn)); - addr->sa_family = AF_PHONET; + addr->spn_family = AF_PHONET; if (!peer) /* Race with bind() here is userland's problem. */ - pn_sockaddr_set_object((struct sockaddr_pn *)addr, - pn->sobject); + pn_sockaddr_set_object(addr, pn->sobject); return sizeof(struct sockaddr_pn); } diff --git a/net/qrtr/af_qrtr.c b/net/qrtr/af_qrtr.c index 00c51cf693f3..836c9a4a2119 100644 --- a/net/qrtr/af_qrtr.c +++ b/net/qrtr/af_qrtr.c @@ -1115,7 +1115,7 @@ static int qrtr_connect(struct socket *sock, struct sockaddr *saddr, return 0; } -static int qrtr_getname(struct socket *sock, struct sockaddr *saddr, +static int qrtr_getname(struct socket *sock, struct sockaddr_storage *saddr, int peer) { struct qrtr_sock *ipc = qrtr_sk(sock->sk); diff --git a/net/qrtr/ns.c b/net/qrtr/ns.c index 3de9350cbf30..0409983eb9fb 100644 --- a/net/qrtr/ns.c +++ b/net/qrtr/ns.c @@ -697,7 +697,7 @@ int qrtr_ns_init(void) if (ret < 0) return ret; - ret = kernel_getsockname(qrtr_ns.sock, (struct sockaddr *)&sq); + ret = kernel_getsockname(qrtr_ns.sock, (struct sockaddr_storage *)&sq); if (ret < 0) { pr_err("failed to get socket name\n"); goto err_sock; diff --git a/net/rds/af_rds.c b/net/rds/af_rds.c index 8435a20968ef..6d0cef028454 100644 --- a/net/rds/af_rds.c +++ b/net/rds/af_rds.c @@ -111,7 +111,7 @@ void rds_wake_sk_sleep(struct rds_sock *rs) read_unlock_irqrestore(&rs->rs_recv_lock, flags); } -static int rds_getname(struct socket *sock, struct sockaddr *uaddr, +static int rds_getname(struct socket *sock, struct sockaddr_storage *uaddr, int peer) { struct rds_sock *rs = rds_sk_to_rs(sock->sk); diff --git a/net/rose/af_rose.c b/net/rose/af_rose.c index 59050caab65c..406c12bf35eb 100644 --- a/net/rose/af_rose.c +++ b/net/rose/af_rose.c @@ -984,7 +984,7 @@ static int rose_accept(struct socket *sock, struct socket *newsock, return err; } -static int rose_getname(struct socket *sock, struct sockaddr *uaddr, +static int rose_getname(struct socket *sock, struct sockaddr_storage *uaddr, int peer) { struct full_sockaddr_rose *srose = (struct full_sockaddr_rose *)uaddr; diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c index f7b809c0d142..b078100d5f25 100644 --- a/net/sctp/ipv6.c +++ b/net/sctp/ipv6.c @@ -1058,7 +1058,7 @@ static int sctp_inet6_supported_addrs(const struct sctp_sock *opt, } /* Handle SCTP_I_WANT_MAPPED_V4_ADDR for getpeername() and getsockname() */ -static int sctp_getname(struct socket *sock, struct sockaddr *uaddr, +static int sctp_getname(struct socket *sock, struct sockaddr_storage *uaddr, int peer) { int rc; diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c index 0316217b7687..c3471e18a1ee 100644 --- a/net/smc/af_smc.c +++ b/net/smc/af_smc.c @@ -2741,7 +2741,7 @@ int smc_accept(struct socket *sock, struct socket *new_sock, return rc; } -int smc_getname(struct socket *sock, struct sockaddr *addr, +int smc_getname(struct socket *sock, struct sockaddr_storage *addr, int peer) { struct smc_sock *smc; diff --git a/net/smc/smc.h b/net/smc/smc.h index ad77d6b6b8d3..43ad7598ac19 100644 --- a/net/smc/smc.h +++ b/net/smc/smc.h @@ -48,7 +48,7 @@ int smc_connect(struct socket *sock, struct sockaddr *addr, int alen, int flags); int smc_accept(struct socket *sock, struct socket *new_sock, struct proto_accept_arg *arg); -int smc_getname(struct socket *sock, struct sockaddr *addr, +int smc_getname(struct socket *sock, struct sockaddr_storage *addr, int peer); __poll_t smc_poll(struct file *file, struct socket *sock, poll_table *wait); diff --git a/net/smc/smc_clc.c b/net/smc/smc_clc.c index 33fa787c28eb..6eeb5decc51e 100644 --- a/net/smc/smc_clc.c +++ b/net/smc/smc_clc.c @@ -571,7 +571,7 @@ static int smc_clc_prfx_set(struct socket *clcsock, goto out_rel; } /* get address to which the internal TCP socket is bound */ - if (kernel_getsockname(clcsock, (struct sockaddr *)&addrs) < 0) + if (kernel_getsockname(clcsock, &addrs) < 0) goto out_rel; /* analyze IP specific data of net_device belonging to TCP socket */ addr6 = (struct sockaddr_in6 *)&addrs; diff --git a/net/socket.c b/net/socket.c index 601ad74930ef..fada898c3dfc 100644 --- a/net/socket.c +++ b/net/socket.c @@ -1949,7 +1949,7 @@ struct file *do_accept(struct file *file, struct proto_accept_arg *arg, goto out_fd; if (upeer_sockaddr) { - len = ops->getname(newsock, (struct sockaddr *)&address, 2); + len = ops->getname(newsock, &address, 2); if (len < 0) { err = -ECONNABORTED; goto out_fd; @@ -2113,7 +2113,7 @@ int __sys_getsockname(int fd, struct sockaddr __user *usockaddr, if (err) goto out_put; - err = READ_ONCE(sock->ops)->getname(sock, (struct sockaddr *)&address, 0); + err = READ_ONCE(sock->ops)->getname(sock, &address, 0); if (err < 0) goto out_put; /* "err" is actually length in this case */ @@ -2153,7 +2153,7 @@ int __sys_getpeername(int fd, struct sockaddr __user *usockaddr, return err; } - err = ops->getname(sock, (struct sockaddr *)&address, 1); + err = ops->getname(sock, &address, 1); if (err >= 0) /* "err" is actually length in this case */ err = move_addr_to_user(&address, err, usockaddr, @@ -3658,7 +3658,7 @@ EXPORT_SYMBOL(kernel_connect); * Returns the length of the address in bytes or an error code. */ -int kernel_getsockname(struct socket *sock, struct sockaddr *addr) +int kernel_getsockname(struct socket *sock, struct sockaddr_storage *addr) { return READ_ONCE(sock->ops)->getname(sock, addr, 0); } @@ -3673,7 +3673,7 @@ EXPORT_SYMBOL(kernel_getsockname); * Returns the length of the address in bytes or an error code. */ -int kernel_getpeername(struct socket *sock, struct sockaddr *addr) +int kernel_getpeername(struct socket *sock, struct sockaddr_storage *addr) { return READ_ONCE(sock->ops)->getname(sock, addr, 1); } diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index 0090162ee8c3..8af253f5ad08 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c @@ -1445,7 +1445,7 @@ static const struct sockaddr_in6 rpc_in6addr_loopback = { * negative errno is returned. */ static int rpc_sockname(struct net *net, struct sockaddr *sap, size_t salen, - struct sockaddr *buf) + struct sockaddr_storage *buf) { struct socket *sock; int err; @@ -1490,7 +1490,7 @@ static int rpc_sockname(struct net *net, struct sockaddr *sap, size_t salen, } err = 0; - if (buf->sa_family == AF_INET6) { + if (buf->ss_family == AF_INET6) { struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)buf; sin6->sin6_scope_id = 0; } @@ -1510,7 +1510,7 @@ static int rpc_sockname(struct net *net, struct sockaddr *sap, size_t salen, * Returns zero and fills in "buf" if successful; otherwise, a * negative errno is returned. */ -static int rpc_anyaddr(int family, struct sockaddr *buf, size_t buflen) +static int rpc_anyaddr(int family, struct sockaddr_storage *buf, size_t buflen) { switch (family) { case AF_INET: @@ -1550,7 +1550,8 @@ static int rpc_anyaddr(int family, struct sockaddr *buf, size_t buflen) * succession may give different results, depending on how local * networking configuration changes over time. */ -int rpc_localaddr(struct rpc_clnt *clnt, struct sockaddr *buf, size_t buflen) +int rpc_localaddr(struct rpc_clnt *clnt, struct sockaddr_storage *buf, + size_t buflen) { struct sockaddr_storage address; struct sockaddr *sap = (struct sockaddr *)&address; diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c index 825ec5357691..dcd4a32b4250 100644 --- a/net/sunrpc/svcsock.c +++ b/net/sunrpc/svcsock.c @@ -903,7 +903,7 @@ static struct svc_xprt *svc_tcp_accept(struct svc_xprt *xprt) set_bit(XPT_CONN, &svsk->sk_xprt.xpt_flags); - err = kernel_getpeername(newsock, sin); + err = kernel_getpeername(newsock, &addr); if (err < 0) { trace_svcsock_getpeername_err(xprt, serv->sv_name, err); goto failed; /* aborted connection or whatever */ @@ -925,7 +925,7 @@ static struct svc_xprt *svc_tcp_accept(struct svc_xprt *xprt) if (IS_ERR(newsvsk)) goto failed; svc_xprt_set_remote(&newsvsk->sk_xprt, sin, slen); - err = kernel_getsockname(newsock, sin); + err = kernel_getsockname(newsock, &addr); slen = err; if (unlikely(err < 0)) slen = offsetof(struct sockaddr, sa_data); @@ -1478,7 +1478,7 @@ int svc_addsock(struct svc_serv *serv, struct net *net, const int fd, err = PTR_ERR(svsk); goto out; } - salen = kernel_getsockname(svsk->sk_sock, sin); + salen = kernel_getsockname(svsk->sk_sock, &addr); if (salen >= 0) svc_xprt_set_local(&svsk->sk_xprt, sin, salen); svsk->sk_xprt.xpt_cred = get_cred(cred); @@ -1545,7 +1545,7 @@ static struct svc_xprt *svc_create_socket(struct svc_serv *serv, if (error < 0) goto bummer; - error = kernel_getsockname(sock, newsin); + error = kernel_getsockname(sock, &addr); if (error < 0) goto bummer; newlen = error; diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index 0e1691316f42..1b071359defb 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c @@ -1708,7 +1708,7 @@ static unsigned short xs_sock_getport(struct socket *sock) struct sockaddr_storage buf; unsigned short port = 0; - if (kernel_getsockname(sock, (struct sockaddr *)&buf) < 0) + if (kernel_getsockname(sock, &buf) < 0) goto out; switch (buf.ss_family) { case AF_INET6: @@ -1777,7 +1777,7 @@ static int xs_sock_srcaddr(struct rpc_xprt *xprt, char *buf, size_t buflen) mutex_lock(&sock->recv_mutex); if (sock->sock) { - ret = kernel_getsockname(sock->sock, &saddr.sa); + ret = kernel_getsockname(sock->sock, &saddr.st); if (ret >= 0) ret = snprintf(buf, buflen, "%pISc", &saddr.sa); } diff --git a/net/tipc/socket.c b/net/tipc/socket.c index 65dcbb54f55d..56f609c7f2a6 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c @@ -741,7 +741,7 @@ static int tipc_bind(struct socket *sock, struct sockaddr *skaddr, int alen) * accesses socket information that is unchanging (or which changes in * a completely predictable manner). */ -static int tipc_getname(struct socket *sock, struct sockaddr *uaddr, +static int tipc_getname(struct socket *sock, struct sockaddr_storage *uaddr, int peer) { struct sockaddr_tipc *addr = (struct sockaddr_tipc *)uaddr; diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 001ccc55ef0f..0f71ed2f35e7 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c @@ -813,7 +813,7 @@ static int unix_stream_connect(struct socket *, struct sockaddr *, 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); -static int unix_getname(struct socket *, struct sockaddr *, int); +static int unix_getname(struct socket *, struct sockaddr_storage *, int); static __poll_t unix_poll(struct file *, struct socket *, poll_table *); static __poll_t unix_dgram_poll(struct file *, struct socket *, poll_table *); @@ -1789,7 +1789,8 @@ static int unix_accept(struct socket *sock, struct socket *newsock, } -static int unix_getname(struct socket *sock, struct sockaddr *uaddr, int peer) +static int unix_getname(struct socket *sock, struct sockaddr_storage *uaddr, + int peer) { struct sock *sk = sock->sk; struct unix_address *addr; @@ -1817,10 +1818,10 @@ static int unix_getname(struct socket *sock, struct sockaddr *uaddr, int peer) memcpy(sunaddr, addr->name, addr->len); if (peer) - BPF_CGROUP_RUN_SA_PROG(sk, uaddr, &err, + BPF_CGROUP_RUN_SA_PROG(sk, (struct sockaddr *)uaddr, &err, CGROUP_UNIX_GETPEERNAME); else - BPF_CGROUP_RUN_SA_PROG(sk, uaddr, &err, + BPF_CGROUP_RUN_SA_PROG(sk, (struct sockaddr *)uaddr, &err, CGROUP_UNIX_GETSOCKNAME); } sock_put(sk); diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c index 35681adedd9a..ee8542bb274e 100644 --- a/net/vmw_vsock/af_vsock.c +++ b/net/vmw_vsock/af_vsock.c @@ -927,7 +927,7 @@ vsock_bind(struct socket *sock, struct sockaddr *addr, int addr_len) } static int vsock_getname(struct socket *sock, - struct sockaddr *addr, int peer) + struct sockaddr_storage *addr, int peer) { int err; struct sock *sk; diff --git a/net/x25/af_x25.c b/net/x25/af_x25.c index 8dda4178497c..f97876d30935 100644 --- a/net/x25/af_x25.c +++ b/net/x25/af_x25.c @@ -913,7 +913,7 @@ static int x25_accept(struct socket *sock, struct socket *newsock, return rc; } -static int x25_getname(struct socket *sock, struct sockaddr *uaddr, +static int x25_getname(struct socket *sock, struct sockaddr_storage *uaddr, int peer) { struct sockaddr_x25 *sx25 = (struct sockaddr_x25 *)uaddr; diff --git a/security/tomoyo/network.c b/security/tomoyo/network.c index 8dc61335f65e..450fd7a37ca4 100644 --- a/security/tomoyo/network.c +++ b/security/tomoyo/network.c @@ -658,8 +658,7 @@ int tomoyo_socket_listen_permission(struct socket *sock) if (!family || (type != SOCK_STREAM && type != SOCK_SEQPACKET)) return 0; { - const int error = sock->ops->getname(sock, (struct sockaddr *) - &addr, 0); + const int error = sock->ops->getname(sock, &addr, 0); if (error < 0) return error;