aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenys Vlasenko <dvlasenk@redhat.com>2018-02-12 14:00:20 -0500
committerDavid S. Miller <davem@davemloft.net>2018-02-12 14:15:04 -0500
commit9b2c45d479d0fb8647c9e83359df69162b5fbe5f (patch)
tree1004b2ce427a21084ff723b29026da6f263fc96b
parent7928b2cbe55b2a410a0f5c1f154610059c57b1b2 (diff)
net: make getname() functions return length rather than use int* parameter
Changes since v1: Added changes in these files: drivers/infiniband/hw/usnic/usnic_transport.c drivers/staging/lustre/lnet/lnet/lib-socket.c drivers/target/iscsi/iscsi_target_login.c drivers/vhost/net.c fs/dlm/lowcomms.c fs/ocfs2/cluster/tcp.c security/tomoyo/network.c Before: All these functions either return a negative error indicator, or store length of sockaddr into "int *socklen" parameter and return zero on success. "int *socklen" parameter is awkward. For example, if caller does not care, it still needs to provide on-stack storage for the value it does not need. None of the many FOO_getname() functions of various protocols ever used old value of *socklen. They always just overwrite it. This change drops this parameter, and makes all these functions, on success, return length of sockaddr. It's always >= 0 and can be differentiated from an error. Tests in callers are changed from "if (err)" to "if (err < 0)", where needed. rpc_sockname() lost "int buflen" parameter, since its only use was to be passed to kernel_getsockname() as &buflen and subsequently not used in any way. Userspace API is not changed. text data bss dec hex filename 30108430 2633624 873672 33615726 200ef6e vmlinux.before.o 30108109 2633612 873672 33615393 200ee21 vmlinux.o Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com> CC: David S. Miller <davem@davemloft.net> CC: linux-kernel@vger.kernel.org CC: netdev@vger.kernel.org CC: linux-bluetooth@vger.kernel.org CC: linux-decnet-user@lists.sourceforge.net CC: linux-wireless@vger.kernel.org CC: linux-rdma@vger.kernel.org CC: linux-sctp@vger.kernel.org CC: linux-nfs@vger.kernel.org CC: linux-x25@vger.kernel.org Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/infiniband/hw/usnic/usnic_transport.c5
-rw-r--r--drivers/isdn/mISDN/socket.c5
-rw-r--r--drivers/net/ppp/pppoe.c6
-rw-r--r--drivers/net/ppp/pptp.c6
-rw-r--r--drivers/scsi/iscsi_tcp.c14
-rw-r--r--drivers/soc/qcom/qmi_interface.c3
-rw-r--r--drivers/staging/ipx/af_ipx.c6
-rw-r--r--drivers/staging/irda/net/af_irda.c8
-rw-r--r--drivers/staging/lustre/lnet/lnet/lib-socket.c7
-rw-r--r--drivers/target/iscsi/iscsi_target_login.c18
-rw-r--r--drivers/vhost/net.c7
-rw-r--r--fs/dlm/lowcomms.c7
-rw-r--r--fs/ocfs2/cluster/tcp.c6
-rw-r--r--include/linux/net.h8
-rw-r--r--include/net/inet_common.h2
-rw-r--r--include/net/ipv6.h2
-rw-r--r--include/net/sock.h2
-rw-r--r--net/appletalk/ddp.c5
-rw-r--r--net/atm/pvc.c5
-rw-r--r--net/atm/svc.c5
-rw-r--r--net/ax25/af_ax25.c4
-rw-r--r--net/bluetooth/hci_sock.c4
-rw-r--r--net/bluetooth/l2cap_sock.c5
-rw-r--r--net/bluetooth/rfcomm/sock.c5
-rw-r--r--net/bluetooth/sco.c5
-rw-r--r--net/can/raw.c6
-rw-r--r--net/core/sock.c5
-rw-r--r--net/decnet/af_decnet.c6
-rw-r--r--net/ipv4/af_inet.c5
-rw-r--r--net/ipv6/af_inet6.c5
-rw-r--r--net/iucv/af_iucv.c5
-rw-r--r--net/l2tp/l2tp_ip.c5
-rw-r--r--net/l2tp/l2tp_ip6.c5
-rw-r--r--net/l2tp/l2tp_ppp.c5
-rw-r--r--net/llc/af_llc.c5
-rw-r--r--net/netlink/af_netlink.c5
-rw-r--r--net/netrom/af_netrom.c9
-rw-r--r--net/nfc/llcp_sock.c5
-rw-r--r--net/packet/af_packet.c10
-rw-r--r--net/phonet/socket.c5
-rw-r--r--net/qrtr/qrtr.c5
-rw-r--r--net/rds/af_rds.c5
-rw-r--r--net/rds/tcp.c7
-rw-r--r--net/rose/af_rose.c5
-rw-r--r--net/sctp/ipv6.c8
-rw-r--r--net/smc/af_smc.c11
-rw-r--r--net/socket.c35
-rw-r--r--net/sunrpc/clnt.c6
-rw-r--r--net/sunrpc/svcsock.c13
-rw-r--r--net/sunrpc/xprtsock.c3
-rw-r--r--net/tipc/socket.c5
-rw-r--r--net/unix/af_unix.c10
-rw-r--r--net/vmw_vsock/af_vsock.c4
-rw-r--r--net/x25/af_x25.c4
-rw-r--r--security/tomoyo/network.c5
55 files changed, 159 insertions, 203 deletions
diff --git a/drivers/infiniband/hw/usnic/usnic_transport.c b/drivers/infiniband/hw/usnic/usnic_transport.c
index de318389a301..67de94343cb4 100644
--- a/drivers/infiniband/hw/usnic/usnic_transport.c
+++ b/drivers/infiniband/hw/usnic/usnic_transport.c
@@ -174,14 +174,13 @@ void usnic_transport_put_socket(struct socket *sock)
174int usnic_transport_sock_get_addr(struct socket *sock, int *proto, 174int usnic_transport_sock_get_addr(struct socket *sock, int *proto,
175 uint32_t *addr, uint16_t *port) 175 uint32_t *addr, uint16_t *port)
176{ 176{
177 int len;
178 int err; 177 int err;
179 struct sockaddr_in sock_addr; 178 struct sockaddr_in sock_addr;
180 179
181 err = sock->ops->getname(sock, 180 err = sock->ops->getname(sock,
182 (struct sockaddr *)&sock_addr, 181 (struct sockaddr *)&sock_addr,
183 &len, 0); 182 0);
184 if (err) 183 if (err < 0)
185 return err; 184 return err;
186 185
187 if (sock_addr.sin_family != AF_INET) 186 if (sock_addr.sin_family != AF_INET)
diff --git a/drivers/isdn/mISDN/socket.c b/drivers/isdn/mISDN/socket.c
index c5603d1a07d6..1f8f489b4167 100644
--- a/drivers/isdn/mISDN/socket.c
+++ b/drivers/isdn/mISDN/socket.c
@@ -560,7 +560,7 @@ done:
560 560
561static int 561static int
562data_sock_getname(struct socket *sock, struct sockaddr *addr, 562data_sock_getname(struct socket *sock, struct sockaddr *addr,
563 int *addr_len, int peer) 563 int peer)
564{ 564{
565 struct sockaddr_mISDN *maddr = (struct sockaddr_mISDN *) addr; 565 struct sockaddr_mISDN *maddr = (struct sockaddr_mISDN *) addr;
566 struct sock *sk = sock->sk; 566 struct sock *sk = sock->sk;
@@ -570,14 +570,13 @@ data_sock_getname(struct socket *sock, struct sockaddr *addr,
570 570
571 lock_sock(sk); 571 lock_sock(sk);
572 572
573 *addr_len = sizeof(*maddr);
574 maddr->family = AF_ISDN; 573 maddr->family = AF_ISDN;
575 maddr->dev = _pms(sk)->dev->id; 574 maddr->dev = _pms(sk)->dev->id;
576 maddr->channel = _pms(sk)->ch.nr; 575 maddr->channel = _pms(sk)->ch.nr;
577 maddr->sapi = _pms(sk)->ch.addr & 0xff; 576 maddr->sapi = _pms(sk)->ch.addr & 0xff;
578 maddr->tei = (_pms(sk)->ch.addr >> 8) & 0xff; 577 maddr->tei = (_pms(sk)->ch.addr >> 8) & 0xff;
579 release_sock(sk); 578 release_sock(sk);
580 return 0; 579 return sizeof(*maddr);
581} 580}
582 581
583static const struct proto_ops data_sock_ops = { 582static const struct proto_ops data_sock_ops = {
diff --git a/drivers/net/ppp/pppoe.c b/drivers/net/ppp/pppoe.c
index 5aa59f41bf8c..bd89d1c559ce 100644
--- a/drivers/net/ppp/pppoe.c
+++ b/drivers/net/ppp/pppoe.c
@@ -714,7 +714,7 @@ err_put:
714} 714}
715 715
716static int pppoe_getname(struct socket *sock, struct sockaddr *uaddr, 716static int pppoe_getname(struct socket *sock, struct sockaddr *uaddr,
717 int *usockaddr_len, int peer) 717 int peer)
718{ 718{
719 int len = sizeof(struct sockaddr_pppox); 719 int len = sizeof(struct sockaddr_pppox);
720 struct sockaddr_pppox sp; 720 struct sockaddr_pppox sp;
@@ -726,9 +726,7 @@ static int pppoe_getname(struct socket *sock, struct sockaddr *uaddr,
726 726
727 memcpy(uaddr, &sp, len); 727 memcpy(uaddr, &sp, len);
728 728
729 *usockaddr_len = len; 729 return len;
730
731 return 0;
732} 730}
733 731
734static int pppoe_ioctl(struct socket *sock, unsigned int cmd, 732static int pppoe_ioctl(struct socket *sock, unsigned int cmd,
diff --git a/drivers/net/ppp/pptp.c b/drivers/net/ppp/pptp.c
index 6dde9a0cfe76..8249d46a7844 100644
--- a/drivers/net/ppp/pptp.c
+++ b/drivers/net/ppp/pptp.c
@@ -483,7 +483,7 @@ static int pptp_connect(struct socket *sock, struct sockaddr *uservaddr,
483} 483}
484 484
485static int pptp_getname(struct socket *sock, struct sockaddr *uaddr, 485static int pptp_getname(struct socket *sock, struct sockaddr *uaddr,
486 int *usockaddr_len, int peer) 486 int peer)
487{ 487{
488 int len = sizeof(struct sockaddr_pppox); 488 int len = sizeof(struct sockaddr_pppox);
489 struct sockaddr_pppox sp; 489 struct sockaddr_pppox sp;
@@ -496,9 +496,7 @@ static int pptp_getname(struct socket *sock, struct sockaddr *uaddr,
496 496
497 memcpy(uaddr, &sp, len); 497 memcpy(uaddr, &sp, len);
498 498
499 *usockaddr_len = len; 499 return len;
500
501 return 0;
502} 500}
503 501
504static int pptp_release(struct socket *sock) 502static int pptp_release(struct socket *sock)
diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c
index 6198559abbd8..0ad00dbf912d 100644
--- a/drivers/scsi/iscsi_tcp.c
+++ b/drivers/scsi/iscsi_tcp.c
@@ -732,7 +732,7 @@ static int iscsi_sw_tcp_conn_get_param(struct iscsi_cls_conn *cls_conn,
732 struct iscsi_tcp_conn *tcp_conn = conn->dd_data; 732 struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
733 struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data; 733 struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
734 struct sockaddr_in6 addr; 734 struct sockaddr_in6 addr;
735 int rc, len; 735 int rc;
736 736
737 switch(param) { 737 switch(param) {
738 case ISCSI_PARAM_CONN_PORT: 738 case ISCSI_PARAM_CONN_PORT:
@@ -745,12 +745,12 @@ static int iscsi_sw_tcp_conn_get_param(struct iscsi_cls_conn *cls_conn,
745 } 745 }
746 if (param == ISCSI_PARAM_LOCAL_PORT) 746 if (param == ISCSI_PARAM_LOCAL_PORT)
747 rc = kernel_getsockname(tcp_sw_conn->sock, 747 rc = kernel_getsockname(tcp_sw_conn->sock,
748 (struct sockaddr *)&addr, &len); 748 (struct sockaddr *)&addr);
749 else 749 else
750 rc = kernel_getpeername(tcp_sw_conn->sock, 750 rc = kernel_getpeername(tcp_sw_conn->sock,
751 (struct sockaddr *)&addr, &len); 751 (struct sockaddr *)&addr);
752 spin_unlock_bh(&conn->session->frwd_lock); 752 spin_unlock_bh(&conn->session->frwd_lock);
753 if (rc) 753 if (rc < 0)
754 return rc; 754 return rc;
755 755
756 return iscsi_conn_get_addr_param((struct sockaddr_storage *) 756 return iscsi_conn_get_addr_param((struct sockaddr_storage *)
@@ -771,7 +771,7 @@ static int iscsi_sw_tcp_host_get_param(struct Scsi_Host *shost,
771 struct iscsi_tcp_conn *tcp_conn; 771 struct iscsi_tcp_conn *tcp_conn;
772 struct iscsi_sw_tcp_conn *tcp_sw_conn; 772 struct iscsi_sw_tcp_conn *tcp_sw_conn;
773 struct sockaddr_in6 addr; 773 struct sockaddr_in6 addr;
774 int rc, len; 774 int rc;
775 775
776 switch (param) { 776 switch (param) {
777 case ISCSI_HOST_PARAM_IPADDRESS: 777 case ISCSI_HOST_PARAM_IPADDRESS:
@@ -793,9 +793,9 @@ static int iscsi_sw_tcp_host_get_param(struct Scsi_Host *shost,
793 } 793 }
794 794
795 rc = kernel_getsockname(tcp_sw_conn->sock, 795 rc = kernel_getsockname(tcp_sw_conn->sock,
796 (struct sockaddr *)&addr, &len); 796 (struct sockaddr *)&addr);
797 spin_unlock_bh(&session->frwd_lock); 797 spin_unlock_bh(&session->frwd_lock);
798 if (rc) 798 if (rc < 0)
799 return rc; 799 return rc;
800 800
801 return iscsi_conn_get_addr_param((struct sockaddr_storage *) 801 return iscsi_conn_get_addr_param((struct sockaddr_storage *)
diff --git a/drivers/soc/qcom/qmi_interface.c b/drivers/soc/qcom/qmi_interface.c
index 877611d5c42b..321982277697 100644
--- a/drivers/soc/qcom/qmi_interface.c
+++ b/drivers/soc/qcom/qmi_interface.c
@@ -586,7 +586,6 @@ static struct socket *qmi_sock_create(struct qmi_handle *qmi,
586 struct sockaddr_qrtr *sq) 586 struct sockaddr_qrtr *sq)
587{ 587{
588 struct socket *sock; 588 struct socket *sock;
589 int sl = sizeof(*sq);
590 int ret; 589 int ret;
591 590
592 ret = sock_create_kern(&init_net, AF_QIPCRTR, SOCK_DGRAM, 591 ret = sock_create_kern(&init_net, AF_QIPCRTR, SOCK_DGRAM,
@@ -594,7 +593,7 @@ static struct socket *qmi_sock_create(struct qmi_handle *qmi,
594 if (ret < 0) 593 if (ret < 0)
595 return ERR_PTR(ret); 594 return ERR_PTR(ret);
596 595
597 ret = kernel_getsockname(sock, (struct sockaddr *)sq, &sl); 596 ret = kernel_getsockname(sock, (struct sockaddr *)sq);
598 if (ret < 0) { 597 if (ret < 0) {
599 sock_release(sock); 598 sock_release(sock);
600 return ERR_PTR(ret); 599 return ERR_PTR(ret);
diff --git a/drivers/staging/ipx/af_ipx.c b/drivers/staging/ipx/af_ipx.c
index d21a9d128d3e..5703dd176787 100644
--- a/drivers/staging/ipx/af_ipx.c
+++ b/drivers/staging/ipx/af_ipx.c
@@ -1577,7 +1577,7 @@ out:
1577 1577
1578 1578
1579static int ipx_getname(struct socket *sock, struct sockaddr *uaddr, 1579static int ipx_getname(struct socket *sock, struct sockaddr *uaddr,
1580 int *uaddr_len, int peer) 1580 int peer)
1581{ 1581{
1582 struct ipx_address *addr; 1582 struct ipx_address *addr;
1583 struct sockaddr_ipx sipx; 1583 struct sockaddr_ipx sipx;
@@ -1585,8 +1585,6 @@ static int ipx_getname(struct socket *sock, struct sockaddr *uaddr,
1585 struct ipx_sock *ipxs = ipx_sk(sk); 1585 struct ipx_sock *ipxs = ipx_sk(sk);
1586 int rc; 1586 int rc;
1587 1587
1588 *uaddr_len = sizeof(struct sockaddr_ipx);
1589
1590 lock_sock(sk); 1588 lock_sock(sk);
1591 if (peer) { 1589 if (peer) {
1592 rc = -ENOTCONN; 1590 rc = -ENOTCONN;
@@ -1620,7 +1618,7 @@ static int ipx_getname(struct socket *sock, struct sockaddr *uaddr,
1620 sipx.sipx_zero = 0; 1618 sipx.sipx_zero = 0;
1621 memcpy(uaddr, &sipx, sizeof(sipx)); 1619 memcpy(uaddr, &sipx, sizeof(sipx));
1622 1620
1623 rc = 0; 1621 rc = sizeof(struct sockaddr_ipx);
1624out: 1622out:
1625 release_sock(sk); 1623 release_sock(sk);
1626 return rc; 1624 return rc;
diff --git a/drivers/staging/irda/net/af_irda.c b/drivers/staging/irda/net/af_irda.c
index 2f1e9ab3d6d0..c13553a9ee11 100644
--- a/drivers/staging/irda/net/af_irda.c
+++ b/drivers/staging/irda/net/af_irda.c
@@ -697,7 +697,7 @@ static int irda_discover_daddr_and_lsap_sel(struct irda_sock *self, char *name)
697 * 697 *
698 */ 698 */
699static int irda_getname(struct socket *sock, struct sockaddr *uaddr, 699static int irda_getname(struct socket *sock, struct sockaddr *uaddr,
700 int *uaddr_len, int peer) 700 int peer)
701{ 701{
702 struct sockaddr_irda saddr; 702 struct sockaddr_irda saddr;
703 struct sock *sk = sock->sk; 703 struct sock *sk = sock->sk;
@@ -720,11 +720,9 @@ static int irda_getname(struct socket *sock, struct sockaddr *uaddr,
720 pr_debug("%s(), tsap_sel = %#x\n", __func__, saddr.sir_lsap_sel); 720 pr_debug("%s(), tsap_sel = %#x\n", __func__, saddr.sir_lsap_sel);
721 pr_debug("%s(), addr = %08x\n", __func__, saddr.sir_addr); 721 pr_debug("%s(), addr = %08x\n", __func__, saddr.sir_addr);
722 722
723 /* uaddr_len come to us uninitialised */ 723 memcpy(uaddr, &saddr, sizeof (struct sockaddr_irda));
724 *uaddr_len = sizeof (struct sockaddr_irda);
725 memcpy(uaddr, &saddr, *uaddr_len);
726 724
727 return 0; 725 return sizeof (struct sockaddr_irda);
728} 726}
729 727
730/* 728/*
diff --git a/drivers/staging/lustre/lnet/lnet/lib-socket.c b/drivers/staging/lustre/lnet/lnet/lib-socket.c
index ce93806eefca..1bee667802b0 100644
--- a/drivers/staging/lustre/lnet/lnet/lib-socket.c
+++ b/drivers/staging/lustre/lnet/lnet/lib-socket.c
@@ -448,14 +448,13 @@ int
448lnet_sock_getaddr(struct socket *sock, bool remote, __u32 *ip, int *port) 448lnet_sock_getaddr(struct socket *sock, bool remote, __u32 *ip, int *port)
449{ 449{
450 struct sockaddr_in sin; 450 struct sockaddr_in sin;
451 int len = sizeof(sin);
452 int rc; 451 int rc;
453 452
454 if (remote) 453 if (remote)
455 rc = kernel_getpeername(sock, (struct sockaddr *)&sin, &len); 454 rc = kernel_getpeername(sock, (struct sockaddr *)&sin);
456 else 455 else
457 rc = kernel_getsockname(sock, (struct sockaddr *)&sin, &len); 456 rc = kernel_getsockname(sock, (struct sockaddr *)&sin);
458 if (rc) { 457 if (rc < 0) {
459 CERROR("Error %d getting sock %s IP/port\n", 458 CERROR("Error %d getting sock %s IP/port\n",
460 rc, remote ? "peer" : "local"); 459 rc, remote ? "peer" : "local");
461 return rc; 460 return rc;
diff --git a/drivers/target/iscsi/iscsi_target_login.c b/drivers/target/iscsi/iscsi_target_login.c
index 64c5a57b92e4..99501785cdc1 100644
--- a/drivers/target/iscsi/iscsi_target_login.c
+++ b/drivers/target/iscsi/iscsi_target_login.c
@@ -1020,7 +1020,7 @@ int iscsit_accept_np(struct iscsi_np *np, struct iscsi_conn *conn)
1020 struct socket *new_sock, *sock = np->np_socket; 1020 struct socket *new_sock, *sock = np->np_socket;
1021 struct sockaddr_in sock_in; 1021 struct sockaddr_in sock_in;
1022 struct sockaddr_in6 sock_in6; 1022 struct sockaddr_in6 sock_in6;
1023 int rc, err; 1023 int rc;
1024 1024
1025 rc = kernel_accept(sock, &new_sock, 0); 1025 rc = kernel_accept(sock, &new_sock, 0);
1026 if (rc < 0) 1026 if (rc < 0)
@@ -1033,8 +1033,8 @@ int iscsit_accept_np(struct iscsi_np *np, struct iscsi_conn *conn)
1033 memset(&sock_in6, 0, sizeof(struct sockaddr_in6)); 1033 memset(&sock_in6, 0, sizeof(struct sockaddr_in6));
1034 1034
1035 rc = conn->sock->ops->getname(conn->sock, 1035 rc = conn->sock->ops->getname(conn->sock,
1036 (struct sockaddr *)&sock_in6, &err, 1); 1036 (struct sockaddr *)&sock_in6, 1);
1037 if (!rc) { 1037 if (rc >= 0) {
1038 if (!ipv6_addr_v4mapped(&sock_in6.sin6_addr)) { 1038 if (!ipv6_addr_v4mapped(&sock_in6.sin6_addr)) {
1039 memcpy(&conn->login_sockaddr, &sock_in6, sizeof(sock_in6)); 1039 memcpy(&conn->login_sockaddr, &sock_in6, sizeof(sock_in6));
1040 } else { 1040 } else {
@@ -1047,8 +1047,8 @@ int iscsit_accept_np(struct iscsi_np *np, struct iscsi_conn *conn)
1047 } 1047 }
1048 1048
1049 rc = conn->sock->ops->getname(conn->sock, 1049 rc = conn->sock->ops->getname(conn->sock,
1050 (struct sockaddr *)&sock_in6, &err, 0); 1050 (struct sockaddr *)&sock_in6, 0);
1051 if (!rc) { 1051 if (rc >= 0) {
1052 if (!ipv6_addr_v4mapped(&sock_in6.sin6_addr)) { 1052 if (!ipv6_addr_v4mapped(&sock_in6.sin6_addr)) {
1053 memcpy(&conn->local_sockaddr, &sock_in6, sizeof(sock_in6)); 1053 memcpy(&conn->local_sockaddr, &sock_in6, sizeof(sock_in6));
1054 } else { 1054 } else {
@@ -1063,13 +1063,13 @@ int iscsit_accept_np(struct iscsi_np *np, struct iscsi_conn *conn)
1063 memset(&sock_in, 0, sizeof(struct sockaddr_in)); 1063 memset(&sock_in, 0, sizeof(struct sockaddr_in));
1064 1064
1065 rc = conn->sock->ops->getname(conn->sock, 1065 rc = conn->sock->ops->getname(conn->sock,
1066 (struct sockaddr *)&sock_in, &err, 1); 1066 (struct sockaddr *)&sock_in, 1);
1067 if (!rc) 1067 if (rc >= 0)
1068 memcpy(&conn->login_sockaddr, &sock_in, sizeof(sock_in)); 1068 memcpy(&conn->login_sockaddr, &sock_in, sizeof(sock_in));
1069 1069
1070 rc = conn->sock->ops->getname(conn->sock, 1070 rc = conn->sock->ops->getname(conn->sock,
1071 (struct sockaddr *)&sock_in, &err, 0); 1071 (struct sockaddr *)&sock_in, 0);
1072 if (!rc) 1072 if (rc >= 0)
1073 memcpy(&conn->local_sockaddr, &sock_in, sizeof(sock_in)); 1073 memcpy(&conn->local_sockaddr, &sock_in, sizeof(sock_in));
1074 } 1074 }
1075 1075
diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c
index 610cba276d47..b5fb56b822fd 100644
--- a/drivers/vhost/net.c
+++ b/drivers/vhost/net.c
@@ -1038,7 +1038,7 @@ static struct socket *get_raw_socket(int fd)
1038 struct sockaddr_ll sa; 1038 struct sockaddr_ll sa;
1039 char buf[MAX_ADDR_LEN]; 1039 char buf[MAX_ADDR_LEN];
1040 } uaddr; 1040 } uaddr;
1041 int uaddr_len = sizeof uaddr, r; 1041 int r;
1042 struct socket *sock = sockfd_lookup(fd, &r); 1042 struct socket *sock = sockfd_lookup(fd, &r);
1043 1043
1044 if (!sock) 1044 if (!sock)
@@ -1050,9 +1050,8 @@ static struct socket *get_raw_socket(int fd)
1050 goto err; 1050 goto err;
1051 } 1051 }
1052 1052
1053 r = sock->ops->getname(sock, (struct sockaddr *)&uaddr.sa, 1053 r = sock->ops->getname(sock, (struct sockaddr *)&uaddr.sa, 0);
1054 &uaddr_len, 0); 1054 if (r < 0)
1055 if (r)
1056 goto err; 1055 goto err;
1057 1056
1058 if (uaddr.sa.sll_family != AF_PACKET) { 1057 if (uaddr.sa.sll_family != AF_PACKET) {
diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c
index cff79ea0c01d..5243989a60cc 100644
--- a/fs/dlm/lowcomms.c
+++ b/fs/dlm/lowcomms.c
@@ -482,7 +482,6 @@ static void lowcomms_error_report(struct sock *sk)
482{ 482{
483 struct connection *con; 483 struct connection *con;
484 struct sockaddr_storage saddr; 484 struct sockaddr_storage saddr;
485 int buflen;
486 void (*orig_report)(struct sock *) = NULL; 485 void (*orig_report)(struct sock *) = NULL;
487 486
488 read_lock_bh(&sk->sk_callback_lock); 487 read_lock_bh(&sk->sk_callback_lock);
@@ -492,7 +491,7 @@ static void lowcomms_error_report(struct sock *sk)
492 491
493 orig_report = listen_sock.sk_error_report; 492 orig_report = listen_sock.sk_error_report;
494 if (con->sock == NULL || 493 if (con->sock == NULL ||
495 kernel_getpeername(con->sock, (struct sockaddr *)&saddr, &buflen)) { 494 kernel_getpeername(con->sock, (struct sockaddr *)&saddr) < 0) {
496 printk_ratelimited(KERN_ERR "dlm: node %d: socket error " 495 printk_ratelimited(KERN_ERR "dlm: node %d: socket error "
497 "sending to node %d, port %d, " 496 "sending to node %d, port %d, "
498 "sk_err=%d/%d\n", dlm_our_nodeid(), 497 "sk_err=%d/%d\n", dlm_our_nodeid(),
@@ -757,8 +756,8 @@ static int tcp_accept_from_sock(struct connection *con)
757 756
758 /* Get the connected socket's peer */ 757 /* Get the connected socket's peer */
759 memset(&peeraddr, 0, sizeof(peeraddr)); 758 memset(&peeraddr, 0, sizeof(peeraddr));
760 if (newsock->ops->getname(newsock, (struct sockaddr *)&peeraddr, 759 len = newsock->ops->getname(newsock, (struct sockaddr *)&peeraddr, 2);
761 &len, 2)) { 760 if (len < 0) {
762 result = -ECONNABORTED; 761 result = -ECONNABORTED;
763 goto accept_err; 762 goto accept_err;
764 } 763 }
diff --git a/fs/ocfs2/cluster/tcp.c b/fs/ocfs2/cluster/tcp.c
index eac5140aac47..e5076185cc1e 100644
--- a/fs/ocfs2/cluster/tcp.c
+++ b/fs/ocfs2/cluster/tcp.c
@@ -1819,7 +1819,7 @@ int o2net_register_hb_callbacks(void)
1819 1819
1820static int o2net_accept_one(struct socket *sock, int *more) 1820static int o2net_accept_one(struct socket *sock, int *more)
1821{ 1821{
1822 int ret, slen; 1822 int ret;
1823 struct sockaddr_in sin; 1823 struct sockaddr_in sin;
1824 struct socket *new_sock = NULL; 1824 struct socket *new_sock = NULL;
1825 struct o2nm_node *node = NULL; 1825 struct o2nm_node *node = NULL;
@@ -1864,9 +1864,7 @@ static int o2net_accept_one(struct socket *sock, int *more)
1864 goto out; 1864 goto out;
1865 } 1865 }
1866 1866
1867 slen = sizeof(sin); 1867 ret = new_sock->ops->getname(new_sock, (struct sockaddr *) &sin, 1);
1868 ret = new_sock->ops->getname(new_sock, (struct sockaddr *) &sin,
1869 &slen, 1);
1870 if (ret < 0) 1868 if (ret < 0)
1871 goto out; 1869 goto out;
1872 1870
diff --git a/include/linux/net.h b/include/linux/net.h
index 91216b16feb7..000d1aada74f 100644
--- a/include/linux/net.h
+++ b/include/linux/net.h
@@ -146,7 +146,7 @@ struct proto_ops {
146 struct socket *newsock, int flags, bool kern); 146 struct socket *newsock, int flags, bool kern);
147 int (*getname) (struct socket *sock, 147 int (*getname) (struct socket *sock,
148 struct sockaddr *addr, 148 struct sockaddr *addr,
149 int *sockaddr_len, int peer); 149 int peer);
150 __poll_t (*poll) (struct file *file, struct socket *sock, 150 __poll_t (*poll) (struct file *file, struct socket *sock,
151 struct poll_table_struct *wait); 151 struct poll_table_struct *wait);
152 int (*ioctl) (struct socket *sock, unsigned int cmd, 152 int (*ioctl) (struct socket *sock, unsigned int cmd,
@@ -294,10 +294,8 @@ int kernel_listen(struct socket *sock, int backlog);
294int kernel_accept(struct socket *sock, struct socket **newsock, int flags); 294int kernel_accept(struct socket *sock, struct socket **newsock, int flags);
295int kernel_connect(struct socket *sock, struct sockaddr *addr, int addrlen, 295int kernel_connect(struct socket *sock, struct sockaddr *addr, int addrlen,
296 int flags); 296 int flags);
297int kernel_getsockname(struct socket *sock, struct sockaddr *addr, 297int kernel_getsockname(struct socket *sock, struct sockaddr *addr);
298 int *addrlen); 298int kernel_getpeername(struct socket *sock, struct sockaddr *addr);
299int kernel_getpeername(struct socket *sock, struct sockaddr *addr,
300 int *addrlen);
301int kernel_getsockopt(struct socket *sock, int level, int optname, char *optval, 299int kernel_getsockopt(struct socket *sock, int level, int optname, char *optval,
302 int *optlen); 300 int *optlen);
303int kernel_setsockopt(struct socket *sock, int level, int optname, char *optval, 301int kernel_setsockopt(struct socket *sock, int level, int optname, char *optval,
diff --git a/include/net/inet_common.h b/include/net/inet_common.h
index 5a54c9570977..500f81375200 100644
--- a/include/net/inet_common.h
+++ b/include/net/inet_common.h
@@ -32,7 +32,7 @@ int inet_shutdown(struct socket *sock, int how);
32int inet_listen(struct socket *sock, int backlog); 32int inet_listen(struct socket *sock, int backlog);
33void inet_sock_destruct(struct sock *sk); 33void inet_sock_destruct(struct sock *sk);
34int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len); 34int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len);
35int inet_getname(struct socket *sock, struct sockaddr *uaddr, int *uaddr_len, 35int inet_getname(struct socket *sock, struct sockaddr *uaddr,
36 int peer); 36 int peer);
37int inet_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); 37int inet_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);
38int inet_ctl_sock_create(struct sock **sk, unsigned short family, 38int inet_ctl_sock_create(struct sock **sk, unsigned short family,
diff --git a/include/net/ipv6.h b/include/net/ipv6.h
index 8606c9113d3f..7a98cd583c73 100644
--- a/include/net/ipv6.h
+++ b/include/net/ipv6.h
@@ -1056,7 +1056,7 @@ void ipv6_local_rxpmtu(struct sock *sk, struct flowi6 *fl6, u32 mtu);
1056 1056
1057int inet6_release(struct socket *sock); 1057int inet6_release(struct socket *sock);
1058int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len); 1058int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len);
1059int inet6_getname(struct socket *sock, struct sockaddr *uaddr, int *uaddr_len, 1059int inet6_getname(struct socket *sock, struct sockaddr *uaddr,
1060 int peer); 1060 int peer);
1061int inet6_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); 1061int inet6_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);
1062 1062
diff --git a/include/net/sock.h b/include/net/sock.h
index 169c92afcafa..3aa7b7d6e6c7 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -1584,7 +1584,7 @@ int sock_no_bind(struct socket *, struct sockaddr *, int);
1584int sock_no_connect(struct socket *, struct sockaddr *, int, int); 1584int sock_no_connect(struct socket *, struct sockaddr *, int, int);
1585int sock_no_socketpair(struct socket *, struct socket *); 1585int sock_no_socketpair(struct socket *, struct socket *);
1586int sock_no_accept(struct socket *, struct socket *, int, bool); 1586int sock_no_accept(struct socket *, struct socket *, int, bool);
1587int sock_no_getname(struct socket *, struct sockaddr *, int *, int); 1587int sock_no_getname(struct socket *, struct sockaddr *, int);
1588__poll_t sock_no_poll(struct file *, struct socket *, 1588__poll_t sock_no_poll(struct file *, struct socket *,
1589 struct poll_table_struct *); 1589 struct poll_table_struct *);
1590int sock_no_ioctl(struct socket *, unsigned int, unsigned long); 1590int sock_no_ioctl(struct socket *, unsigned int, unsigned long);
diff --git a/net/appletalk/ddp.c b/net/appletalk/ddp.c
index 03a9fc0771c0..9b6bc5abe946 100644
--- a/net/appletalk/ddp.c
+++ b/net/appletalk/ddp.c
@@ -1238,7 +1238,7 @@ out:
1238 * fields into the sockaddr. 1238 * fields into the sockaddr.
1239 */ 1239 */
1240static int atalk_getname(struct socket *sock, struct sockaddr *uaddr, 1240static int atalk_getname(struct socket *sock, struct sockaddr *uaddr,
1241 int *uaddr_len, int peer) 1241 int peer)
1242{ 1242{
1243 struct sockaddr_at sat; 1243 struct sockaddr_at sat;
1244 struct sock *sk = sock->sk; 1244 struct sock *sk = sock->sk;
@@ -1251,7 +1251,6 @@ static int atalk_getname(struct socket *sock, struct sockaddr *uaddr,
1251 if (atalk_autobind(sk) < 0) 1251 if (atalk_autobind(sk) < 0)
1252 goto out; 1252 goto out;
1253 1253
1254 *uaddr_len = sizeof(struct sockaddr_at);
1255 memset(&sat, 0, sizeof(sat)); 1254 memset(&sat, 0, sizeof(sat));
1256 1255
1257 if (peer) { 1256 if (peer) {
@@ -1268,9 +1267,9 @@ static int atalk_getname(struct socket *sock, struct sockaddr *uaddr,
1268 sat.sat_port = at->src_port; 1267 sat.sat_port = at->src_port;
1269 } 1268 }
1270 1269
1271 err = 0;
1272 sat.sat_family = AF_APPLETALK; 1270 sat.sat_family = AF_APPLETALK;
1273 memcpy(uaddr, &sat, sizeof(sat)); 1271 memcpy(uaddr, &sat, sizeof(sat));
1272 err = sizeof(struct sockaddr_at);
1274 1273
1275out: 1274out:
1276 release_sock(sk); 1275 release_sock(sk);
diff --git a/net/atm/pvc.c b/net/atm/pvc.c
index e1140b3bdcaa..2cb10af16afc 100644
--- a/net/atm/pvc.c
+++ b/net/atm/pvc.c
@@ -87,21 +87,20 @@ static int pvc_getsockopt(struct socket *sock, int level, int optname,
87} 87}
88 88
89static int pvc_getname(struct socket *sock, struct sockaddr *sockaddr, 89static int pvc_getname(struct socket *sock, struct sockaddr *sockaddr,
90 int *sockaddr_len, int peer) 90 int peer)
91{ 91{
92 struct sockaddr_atmpvc *addr; 92 struct sockaddr_atmpvc *addr;
93 struct atm_vcc *vcc = ATM_SD(sock); 93 struct atm_vcc *vcc = ATM_SD(sock);
94 94
95 if (!vcc->dev || !test_bit(ATM_VF_ADDR, &vcc->flags)) 95 if (!vcc->dev || !test_bit(ATM_VF_ADDR, &vcc->flags))
96 return -ENOTCONN; 96 return -ENOTCONN;
97 *sockaddr_len = sizeof(struct sockaddr_atmpvc);
98 addr = (struct sockaddr_atmpvc *)sockaddr; 97 addr = (struct sockaddr_atmpvc *)sockaddr;
99 memset(addr, 0, sizeof(*addr)); 98 memset(addr, 0, sizeof(*addr));
100 addr->sap_family = AF_ATMPVC; 99 addr->sap_family = AF_ATMPVC;
101 addr->sap_addr.itf = vcc->dev->number; 100 addr->sap_addr.itf = vcc->dev->number;
102 addr->sap_addr.vpi = vcc->vpi; 101 addr->sap_addr.vpi = vcc->vpi;
103 addr->sap_addr.vci = vcc->vci; 102 addr->sap_addr.vci = vcc->vci;
104 return 0; 103 return sizeof(struct sockaddr_atmpvc);
105} 104}
106 105
107static const struct proto_ops pvc_proto_ops = { 106static const struct proto_ops pvc_proto_ops = {
diff --git a/net/atm/svc.c b/net/atm/svc.c
index c458adcbc177..2f91b766ac42 100644
--- a/net/atm/svc.c
+++ b/net/atm/svc.c
@@ -419,15 +419,14 @@ out:
419} 419}
420 420
421static int svc_getname(struct socket *sock, struct sockaddr *sockaddr, 421static int svc_getname(struct socket *sock, struct sockaddr *sockaddr,
422 int *sockaddr_len, int peer) 422 int peer)
423{ 423{
424 struct sockaddr_atmsvc *addr; 424 struct sockaddr_atmsvc *addr;
425 425
426 *sockaddr_len = sizeof(struct sockaddr_atmsvc);
427 addr = (struct sockaddr_atmsvc *) sockaddr; 426 addr = (struct sockaddr_atmsvc *) sockaddr;
428 memcpy(addr, peer ? &ATM_SD(sock)->remote : &ATM_SD(sock)->local, 427 memcpy(addr, peer ? &ATM_SD(sock)->remote : &ATM_SD(sock)->local,
429 sizeof(struct sockaddr_atmsvc)); 428 sizeof(struct sockaddr_atmsvc));
430 return 0; 429 return sizeof(struct sockaddr_atmsvc);
431} 430}
432 431
433int svc_change_qos(struct atm_vcc *vcc, struct atm_qos *qos) 432int svc_change_qos(struct atm_vcc *vcc, struct atm_qos *qos)
diff --git a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c
index 47fdd399626b..c8319ed48485 100644
--- a/net/ax25/af_ax25.c
+++ b/net/ax25/af_ax25.c
@@ -1388,7 +1388,7 @@ out:
1388} 1388}
1389 1389
1390static int ax25_getname(struct socket *sock, struct sockaddr *uaddr, 1390static int ax25_getname(struct socket *sock, struct sockaddr *uaddr,
1391 int *uaddr_len, int peer) 1391 int peer)
1392{ 1392{
1393 struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)uaddr; 1393 struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)uaddr;
1394 struct sock *sk = sock->sk; 1394 struct sock *sk = sock->sk;
@@ -1427,7 +1427,7 @@ static int ax25_getname(struct socket *sock, struct sockaddr *uaddr,
1427 fsa->fsa_digipeater[0] = null_ax25_address; 1427 fsa->fsa_digipeater[0] = null_ax25_address;
1428 } 1428 }
1429 } 1429 }
1430 *uaddr_len = sizeof (struct full_sockaddr_ax25); 1430 err = sizeof (struct full_sockaddr_ax25);
1431 1431
1432out: 1432out:
1433 release_sock(sk); 1433 release_sock(sk);
diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c
index 923e9a271872..1506e1632394 100644
--- a/net/bluetooth/hci_sock.c
+++ b/net/bluetooth/hci_sock.c
@@ -1340,7 +1340,7 @@ done:
1340} 1340}
1341 1341
1342static int hci_sock_getname(struct socket *sock, struct sockaddr *addr, 1342static int hci_sock_getname(struct socket *sock, struct sockaddr *addr,
1343 int *addr_len, int peer) 1343 int peer)
1344{ 1344{
1345 struct sockaddr_hci *haddr = (struct sockaddr_hci *)addr; 1345 struct sockaddr_hci *haddr = (struct sockaddr_hci *)addr;
1346 struct sock *sk = sock->sk; 1346 struct sock *sk = sock->sk;
@@ -1360,10 +1360,10 @@ static int hci_sock_getname(struct socket *sock, struct sockaddr *addr,
1360 goto done; 1360 goto done;
1361 } 1361 }
1362 1362
1363 *addr_len = sizeof(*haddr);
1364 haddr->hci_family = AF_BLUETOOTH; 1363 haddr->hci_family = AF_BLUETOOTH;
1365 haddr->hci_dev = hdev->id; 1364 haddr->hci_dev = hdev->id;
1366 haddr->hci_channel= hci_pi(sk)->channel; 1365 haddr->hci_channel= hci_pi(sk)->channel;
1366 err = sizeof(*haddr);
1367 1367
1368done: 1368done:
1369 release_sock(sk); 1369 release_sock(sk);
diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c
index 67a8642f57ea..686bdc6b35b0 100644
--- a/net/bluetooth/l2cap_sock.c
+++ b/net/bluetooth/l2cap_sock.c
@@ -358,7 +358,7 @@ done:
358} 358}
359 359
360static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr, 360static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr,
361 int *len, int peer) 361 int peer)
362{ 362{
363 struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr; 363 struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr;
364 struct sock *sk = sock->sk; 364 struct sock *sk = sock->sk;
@@ -373,7 +373,6 @@ static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr,
373 373
374 memset(la, 0, sizeof(struct sockaddr_l2)); 374 memset(la, 0, sizeof(struct sockaddr_l2));
375 addr->sa_family = AF_BLUETOOTH; 375 addr->sa_family = AF_BLUETOOTH;
376 *len = sizeof(struct sockaddr_l2);
377 376
378 la->l2_psm = chan->psm; 377 la->l2_psm = chan->psm;
379 378
@@ -387,7 +386,7 @@ static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr,
387 la->l2_bdaddr_type = chan->src_type; 386 la->l2_bdaddr_type = chan->src_type;
388 } 387 }
389 388
390 return 0; 389 return sizeof(struct sockaddr_l2);
391} 390}
392 391
393static int l2cap_sock_getsockopt_old(struct socket *sock, int optname, 392static int l2cap_sock_getsockopt_old(struct socket *sock, int optname,
diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c
index 1aaccf637479..93a3b219db09 100644
--- a/net/bluetooth/rfcomm/sock.c
+++ b/net/bluetooth/rfcomm/sock.c
@@ -533,7 +533,7 @@ done:
533 return err; 533 return err;
534} 534}
535 535
536static int rfcomm_sock_getname(struct socket *sock, struct sockaddr *addr, int *len, int peer) 536static int rfcomm_sock_getname(struct socket *sock, struct sockaddr *addr, int peer)
537{ 537{
538 struct sockaddr_rc *sa = (struct sockaddr_rc *) addr; 538 struct sockaddr_rc *sa = (struct sockaddr_rc *) addr;
539 struct sock *sk = sock->sk; 539 struct sock *sk = sock->sk;
@@ -552,8 +552,7 @@ static int rfcomm_sock_getname(struct socket *sock, struct sockaddr *addr, int *
552 else 552 else
553 bacpy(&sa->rc_bdaddr, &rfcomm_pi(sk)->src); 553 bacpy(&sa->rc_bdaddr, &rfcomm_pi(sk)->src);
554 554
555 *len = sizeof(struct sockaddr_rc); 555 return sizeof(struct sockaddr_rc);
556 return 0;
557} 556}
558 557
559static int rfcomm_sock_sendmsg(struct socket *sock, struct msghdr *msg, 558static int rfcomm_sock_sendmsg(struct socket *sock, struct msghdr *msg,
diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c
index 08df57665e1f..413b8ee49fec 100644
--- a/net/bluetooth/sco.c
+++ b/net/bluetooth/sco.c
@@ -680,7 +680,7 @@ done:
680} 680}
681 681
682static int sco_sock_getname(struct socket *sock, struct sockaddr *addr, 682static int sco_sock_getname(struct socket *sock, struct sockaddr *addr,
683 int *len, int peer) 683 int peer)
684{ 684{
685 struct sockaddr_sco *sa = (struct sockaddr_sco *) addr; 685 struct sockaddr_sco *sa = (struct sockaddr_sco *) addr;
686 struct sock *sk = sock->sk; 686 struct sock *sk = sock->sk;
@@ -688,14 +688,13 @@ static int sco_sock_getname(struct socket *sock, struct sockaddr *addr,
688 BT_DBG("sock %p, sk %p", sock, sk); 688 BT_DBG("sock %p, sk %p", sock, sk);
689 689
690 addr->sa_family = AF_BLUETOOTH; 690 addr->sa_family = AF_BLUETOOTH;
691 *len = sizeof(struct sockaddr_sco);
692 691
693 if (peer) 692 if (peer)
694 bacpy(&sa->sco_bdaddr, &sco_pi(sk)->dst); 693 bacpy(&sa->sco_bdaddr, &sco_pi(sk)->dst);
695 else 694 else
696 bacpy(&sa->sco_bdaddr, &sco_pi(sk)->src); 695 bacpy(&sa->sco_bdaddr, &sco_pi(sk)->src);
697 696
698 return 0; 697 return sizeof(struct sockaddr_sco);
699} 698}
700 699
701static int sco_sock_sendmsg(struct socket *sock, struct msghdr *msg, 700static int sco_sock_sendmsg(struct socket *sock, struct msghdr *msg,
diff --git a/net/can/raw.c b/net/can/raw.c
index f2ecc43376a1..1051eee82581 100644
--- a/net/can/raw.c
+++ b/net/can/raw.c
@@ -470,7 +470,7 @@ static int raw_bind(struct socket *sock, struct sockaddr *uaddr, int len)
470} 470}
471 471
472static int raw_getname(struct socket *sock, struct sockaddr *uaddr, 472static int raw_getname(struct socket *sock, struct sockaddr *uaddr,
473 int *len, int peer) 473 int peer)
474{ 474{
475 struct sockaddr_can *addr = (struct sockaddr_can *)uaddr; 475 struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
476 struct sock *sk = sock->sk; 476 struct sock *sk = sock->sk;
@@ -483,9 +483,7 @@ static int raw_getname(struct socket *sock, struct sockaddr *uaddr,
483 addr->can_family = AF_CAN; 483 addr->can_family = AF_CAN;
484 addr->can_ifindex = ro->ifindex; 484 addr->can_ifindex = ro->ifindex;
485 485
486 *len = sizeof(*addr); 486 return sizeof(*addr);
487
488 return 0;
489} 487}
490 488
491static int raw_setsockopt(struct socket *sock, int level, int optname, 489static int raw_setsockopt(struct socket *sock, int level, int optname,
diff --git a/net/core/sock.c b/net/core/sock.c
index c501499a04fe..04e5e27c9b81 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -1274,7 +1274,8 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
1274 { 1274 {
1275 char address[128]; 1275 char address[128];
1276 1276
1277 if (sock->ops->getname(sock, (struct sockaddr *)address, &lv, 2)) 1277 lv = sock->ops->getname(sock, (struct sockaddr *)address, 2);
1278 if (lv < 0)
1278 return -ENOTCONN; 1279 return -ENOTCONN;
1279 if (lv < len) 1280 if (lv < len)
1280 return -EINVAL; 1281 return -EINVAL;
@@ -2497,7 +2498,7 @@ int sock_no_accept(struct socket *sock, struct socket *newsock, int flags,
2497EXPORT_SYMBOL(sock_no_accept); 2498EXPORT_SYMBOL(sock_no_accept);
2498 2499
2499int sock_no_getname(struct socket *sock, struct sockaddr *saddr, 2500int sock_no_getname(struct socket *sock, struct sockaddr *saddr,
2500 int *len, int peer) 2501 int peer)
2501{ 2502{
2502 return -EOPNOTSUPP; 2503 return -EOPNOTSUPP;
2503} 2504}
diff --git a/net/decnet/af_decnet.c b/net/decnet/af_decnet.c
index 91dd09f79808..45cb5bea884b 100644
--- a/net/decnet/af_decnet.c
+++ b/net/decnet/af_decnet.c
@@ -1180,14 +1180,12 @@ static int dn_accept(struct socket *sock, struct socket *newsock, int flags,
1180} 1180}
1181 1181
1182 1182
1183static int dn_getname(struct socket *sock, struct sockaddr *uaddr,int *uaddr_len,int peer) 1183static int dn_getname(struct socket *sock, struct sockaddr *uaddr,int peer)
1184{ 1184{
1185 struct sockaddr_dn *sa = (struct sockaddr_dn *)uaddr; 1185 struct sockaddr_dn *sa = (struct sockaddr_dn *)uaddr;
1186 struct sock *sk = sock->sk; 1186 struct sock *sk = sock->sk;
1187 struct dn_scp *scp = DN_SK(sk); 1187 struct dn_scp *scp = DN_SK(sk);
1188 1188
1189 *uaddr_len = sizeof(struct sockaddr_dn);
1190
1191 lock_sock(sk); 1189 lock_sock(sk);
1192 1190
1193 if (peer) { 1191 if (peer) {
@@ -1205,7 +1203,7 @@ static int dn_getname(struct socket *sock, struct sockaddr *uaddr,int *uaddr_len
1205 1203
1206 release_sock(sk); 1204 release_sock(sk);
1207 1205
1208 return 0; 1206 return sizeof(struct sockaddr_dn);
1209} 1207}
1210 1208
1211 1209
diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c
index e4329e161943..f98e2f0db841 100644
--- a/net/ipv4/af_inet.c
+++ b/net/ipv4/af_inet.c
@@ -723,7 +723,7 @@ EXPORT_SYMBOL(inet_accept);
723 * This does both peername and sockname. 723 * This does both peername and sockname.
724 */ 724 */
725int inet_getname(struct socket *sock, struct sockaddr *uaddr, 725int inet_getname(struct socket *sock, struct sockaddr *uaddr,
726 int *uaddr_len, int peer) 726 int peer)
727{ 727{
728 struct sock *sk = sock->sk; 728 struct sock *sk = sock->sk;
729 struct inet_sock *inet = inet_sk(sk); 729 struct inet_sock *inet = inet_sk(sk);
@@ -745,8 +745,7 @@ int inet_getname(struct socket *sock, struct sockaddr *uaddr,
745 sin->sin_addr.s_addr = addr; 745 sin->sin_addr.s_addr = addr;
746 } 746 }
747 memset(sin->sin_zero, 0, sizeof(sin->sin_zero)); 747 memset(sin->sin_zero, 0, sizeof(sin->sin_zero));
748 *uaddr_len = sizeof(*sin); 748 return sizeof(*sin);
749 return 0;
750} 749}
751EXPORT_SYMBOL(inet_getname); 750EXPORT_SYMBOL(inet_getname);
752 751
diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c
index 416917719a6f..c1e292db04db 100644
--- a/net/ipv6/af_inet6.c
+++ b/net/ipv6/af_inet6.c
@@ -470,7 +470,7 @@ EXPORT_SYMBOL_GPL(inet6_destroy_sock);
470 */ 470 */
471 471
472int inet6_getname(struct socket *sock, struct sockaddr *uaddr, 472int inet6_getname(struct socket *sock, struct sockaddr *uaddr,
473 int *uaddr_len, int peer) 473 int peer)
474{ 474{
475 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)uaddr; 475 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)uaddr;
476 struct sock *sk = sock->sk; 476 struct sock *sk = sock->sk;
@@ -500,8 +500,7 @@ int inet6_getname(struct socket *sock, struct sockaddr *uaddr,
500 } 500 }
501 sin->sin6_scope_id = ipv6_iface_scope_id(&sin->sin6_addr, 501 sin->sin6_scope_id = ipv6_iface_scope_id(&sin->sin6_addr,
502 sk->sk_bound_dev_if); 502 sk->sk_bound_dev_if);
503 *uaddr_len = sizeof(*sin); 503 return sizeof(*sin);
504 return 0;
505} 504}
506EXPORT_SYMBOL(inet6_getname); 505EXPORT_SYMBOL(inet6_getname);
507 506
diff --git a/net/iucv/af_iucv.c b/net/iucv/af_iucv.c
index 1e8cc7bcbca3..81ce15ffb878 100644
--- a/net/iucv/af_iucv.c
+++ b/net/iucv/af_iucv.c
@@ -989,14 +989,13 @@ done:
989} 989}
990 990
991static int iucv_sock_getname(struct socket *sock, struct sockaddr *addr, 991static int iucv_sock_getname(struct socket *sock, struct sockaddr *addr,
992 int *len, int peer) 992 int peer)
993{ 993{
994 struct sockaddr_iucv *siucv = (struct sockaddr_iucv *) addr; 994 struct sockaddr_iucv *siucv = (struct sockaddr_iucv *) addr;
995 struct sock *sk = sock->sk; 995 struct sock *sk = sock->sk;
996 struct iucv_sock *iucv = iucv_sk(sk); 996 struct iucv_sock *iucv = iucv_sk(sk);
997 997
998 addr->sa_family = AF_IUCV; 998 addr->sa_family = AF_IUCV;
999 *len = sizeof(struct sockaddr_iucv);
1000 999
1001 if (peer) { 1000 if (peer) {
1002 memcpy(siucv->siucv_user_id, iucv->dst_user_id, 8); 1001 memcpy(siucv->siucv_user_id, iucv->dst_user_id, 8);
@@ -1009,7 +1008,7 @@ static int iucv_sock_getname(struct socket *sock, struct sockaddr *addr,
1009 memset(&siucv->siucv_addr, 0, sizeof(siucv->siucv_addr)); 1008 memset(&siucv->siucv_addr, 0, sizeof(siucv->siucv_addr));
1010 memset(&siucv->siucv_nodeid, 0, sizeof(siucv->siucv_nodeid)); 1009 memset(&siucv->siucv_nodeid, 0, sizeof(siucv->siucv_nodeid));
1011 1010
1012 return 0; 1011 return sizeof(struct sockaddr_iucv);
1013} 1012}
1014 1013
1015/** 1014/**
diff --git a/net/l2tp/l2tp_ip.c b/net/l2tp/l2tp_ip.c
index ff61124fdf59..4614585e1720 100644
--- a/net/l2tp/l2tp_ip.c
+++ b/net/l2tp/l2tp_ip.c
@@ -349,7 +349,7 @@ static int l2tp_ip_disconnect(struct sock *sk, int flags)
349} 349}
350 350
351static int l2tp_ip_getname(struct socket *sock, struct sockaddr *uaddr, 351static int l2tp_ip_getname(struct socket *sock, struct sockaddr *uaddr,
352 int *uaddr_len, int peer) 352 int peer)
353{ 353{
354 struct sock *sk = sock->sk; 354 struct sock *sk = sock->sk;
355 struct inet_sock *inet = inet_sk(sk); 355 struct inet_sock *inet = inet_sk(sk);
@@ -370,8 +370,7 @@ static int l2tp_ip_getname(struct socket *sock, struct sockaddr *uaddr,
370 lsa->l2tp_conn_id = lsk->conn_id; 370 lsa->l2tp_conn_id = lsk->conn_id;
371 lsa->l2tp_addr.s_addr = addr; 371 lsa->l2tp_addr.s_addr = addr;
372 } 372 }
373 *uaddr_len = sizeof(*lsa); 373 return sizeof(*lsa);
374 return 0;
375} 374}
376 375
377static int l2tp_ip_backlog_recv(struct sock *sk, struct sk_buff *skb) 376static int l2tp_ip_backlog_recv(struct sock *sk, struct sk_buff *skb)
diff --git a/net/l2tp/l2tp_ip6.c b/net/l2tp/l2tp_ip6.c
index 192344688c06..efea58b66295 100644
--- a/net/l2tp/l2tp_ip6.c
+++ b/net/l2tp/l2tp_ip6.c
@@ -421,7 +421,7 @@ static int l2tp_ip6_disconnect(struct sock *sk, int flags)
421} 421}
422 422
423static int l2tp_ip6_getname(struct socket *sock, struct sockaddr *uaddr, 423static int l2tp_ip6_getname(struct socket *sock, struct sockaddr *uaddr,
424 int *uaddr_len, int peer) 424 int peer)
425{ 425{
426 struct sockaddr_l2tpip6 *lsa = (struct sockaddr_l2tpip6 *)uaddr; 426 struct sockaddr_l2tpip6 *lsa = (struct sockaddr_l2tpip6 *)uaddr;
427 struct sock *sk = sock->sk; 427 struct sock *sk = sock->sk;
@@ -449,8 +449,7 @@ static int l2tp_ip6_getname(struct socket *sock, struct sockaddr *uaddr,
449 } 449 }
450 if (ipv6_addr_type(&lsa->l2tp_addr) & IPV6_ADDR_LINKLOCAL) 450 if (ipv6_addr_type(&lsa->l2tp_addr) & IPV6_ADDR_LINKLOCAL)
451 lsa->l2tp_scope_id = sk->sk_bound_dev_if; 451 lsa->l2tp_scope_id = sk->sk_bound_dev_if;
452 *uaddr_len = sizeof(*lsa); 452 return sizeof(*lsa);
453 return 0;
454} 453}
455 454
456static int l2tp_ip6_backlog_recv(struct sock *sk, struct sk_buff *skb) 455static int l2tp_ip6_backlog_recv(struct sock *sk, struct sk_buff *skb)
diff --git a/net/l2tp/l2tp_ppp.c b/net/l2tp/l2tp_ppp.c
index 59f246d7b290..99a03c72db4f 100644
--- a/net/l2tp/l2tp_ppp.c
+++ b/net/l2tp/l2tp_ppp.c
@@ -870,7 +870,7 @@ err:
870/* getname() support. 870/* getname() support.
871 */ 871 */
872static int pppol2tp_getname(struct socket *sock, struct sockaddr *uaddr, 872static int pppol2tp_getname(struct socket *sock, struct sockaddr *uaddr,
873 int *usockaddr_len, int peer) 873 int peer)
874{ 874{
875 int len = 0; 875 int len = 0;
876 int error = 0; 876 int error = 0;
@@ -969,8 +969,7 @@ static int pppol2tp_getname(struct socket *sock, struct sockaddr *uaddr,
969 memcpy(uaddr, &sp, len); 969 memcpy(uaddr, &sp, len);
970 } 970 }
971 971
972 *usockaddr_len = len; 972 error = len;
973 error = 0;
974 973
975 sock_put(sk); 974 sock_put(sk);
976end: 975end:
diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c
index c38d16f22d2a..01dcc0823d1f 100644
--- a/net/llc/af_llc.c
+++ b/net/llc/af_llc.c
@@ -971,7 +971,7 @@ release:
971 * Return the address information of a socket. 971 * Return the address information of a socket.
972 */ 972 */
973static int llc_ui_getname(struct socket *sock, struct sockaddr *uaddr, 973static int llc_ui_getname(struct socket *sock, struct sockaddr *uaddr,
974 int *uaddrlen, int peer) 974 int peer)
975{ 975{
976 struct sockaddr_llc sllc; 976 struct sockaddr_llc sllc;
977 struct sock *sk = sock->sk; 977 struct sock *sk = sock->sk;
@@ -982,7 +982,6 @@ static int llc_ui_getname(struct socket *sock, struct sockaddr *uaddr,
982 lock_sock(sk); 982 lock_sock(sk);
983 if (sock_flag(sk, SOCK_ZAPPED)) 983 if (sock_flag(sk, SOCK_ZAPPED))
984 goto out; 984 goto out;
985 *uaddrlen = sizeof(sllc);
986 if (peer) { 985 if (peer) {
987 rc = -ENOTCONN; 986 rc = -ENOTCONN;
988 if (sk->sk_state != TCP_ESTABLISHED) 987 if (sk->sk_state != TCP_ESTABLISHED)
@@ -1003,9 +1002,9 @@ static int llc_ui_getname(struct socket *sock, struct sockaddr *uaddr,
1003 IFHWADDRLEN); 1002 IFHWADDRLEN);
1004 } 1003 }
1005 } 1004 }
1006 rc = 0;
1007 sllc.sllc_family = AF_LLC; 1005 sllc.sllc_family = AF_LLC;
1008 memcpy(uaddr, &sllc, sizeof(sllc)); 1006 memcpy(uaddr, &sllc, sizeof(sllc));
1007 rc = sizeof(sllc);
1009out: 1008out:
1010 release_sock(sk); 1009 release_sock(sk);
1011 return rc; 1010 return rc;
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
index 2ad445c1d27c..3c8af14330b5 100644
--- a/net/netlink/af_netlink.c
+++ b/net/netlink/af_netlink.c
@@ -1105,7 +1105,7 @@ static int netlink_connect(struct socket *sock, struct sockaddr *addr,
1105} 1105}
1106 1106
1107static int netlink_getname(struct socket *sock, struct sockaddr *addr, 1107static int netlink_getname(struct socket *sock, struct sockaddr *addr,
1108 int *addr_len, int peer) 1108 int peer)
1109{ 1109{
1110 struct sock *sk = sock->sk; 1110 struct sock *sk = sock->sk;
1111 struct netlink_sock *nlk = nlk_sk(sk); 1111 struct netlink_sock *nlk = nlk_sk(sk);
@@ -1113,7 +1113,6 @@ static int netlink_getname(struct socket *sock, struct sockaddr *addr,
1113 1113
1114 nladdr->nl_family = AF_NETLINK; 1114 nladdr->nl_family = AF_NETLINK;
1115 nladdr->nl_pad = 0; 1115 nladdr->nl_pad = 0;
1116 *addr_len = sizeof(*nladdr);
1117 1116
1118 if (peer) { 1117 if (peer) {
1119 nladdr->nl_pid = nlk->dst_portid; 1118 nladdr->nl_pid = nlk->dst_portid;
@@ -1124,7 +1123,7 @@ static int netlink_getname(struct socket *sock, struct sockaddr *addr,
1124 nladdr->nl_groups = nlk->groups ? nlk->groups[0] : 0; 1123 nladdr->nl_groups = nlk->groups ? nlk->groups[0] : 0;
1125 netlink_unlock_table(); 1124 netlink_unlock_table();
1126 } 1125 }
1127 return 0; 1126 return sizeof(*nladdr);
1128} 1127}
1129 1128
1130static int netlink_ioctl(struct socket *sock, unsigned int cmd, 1129static int netlink_ioctl(struct socket *sock, unsigned int cmd,
diff --git a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c
index 9ba30c63be3d..35bb6807927f 100644
--- a/net/netrom/af_netrom.c
+++ b/net/netrom/af_netrom.c
@@ -829,11 +829,12 @@ out_release:
829} 829}
830 830
831static int nr_getname(struct socket *sock, struct sockaddr *uaddr, 831static int nr_getname(struct socket *sock, struct sockaddr *uaddr,
832 int *uaddr_len, int peer) 832 int peer)
833{ 833{
834 struct full_sockaddr_ax25 *sax = (struct full_sockaddr_ax25 *)uaddr; 834 struct full_sockaddr_ax25 *sax = (struct full_sockaddr_ax25 *)uaddr;
835 struct sock *sk = sock->sk; 835 struct sock *sk = sock->sk;
836 struct nr_sock *nr = nr_sk(sk); 836 struct nr_sock *nr = nr_sk(sk);
837 int uaddr_len;
837 838
838 memset(&sax->fsa_ax25, 0, sizeof(struct sockaddr_ax25)); 839 memset(&sax->fsa_ax25, 0, sizeof(struct sockaddr_ax25));
839 840
@@ -848,16 +849,16 @@ static int nr_getname(struct socket *sock, struct sockaddr *uaddr,
848 sax->fsa_ax25.sax25_call = nr->user_addr; 849 sax->fsa_ax25.sax25_call = nr->user_addr;
849 memset(sax->fsa_digipeater, 0, sizeof(sax->fsa_digipeater)); 850 memset(sax->fsa_digipeater, 0, sizeof(sax->fsa_digipeater));
850 sax->fsa_digipeater[0] = nr->dest_addr; 851 sax->fsa_digipeater[0] = nr->dest_addr;
851 *uaddr_len = sizeof(struct full_sockaddr_ax25); 852 uaddr_len = sizeof(struct full_sockaddr_ax25);
852 } else { 853 } else {
853 sax->fsa_ax25.sax25_family = AF_NETROM; 854 sax->fsa_ax25.sax25_family = AF_NETROM;
854 sax->fsa_ax25.sax25_ndigis = 0; 855 sax->fsa_ax25.sax25_ndigis = 0;
855 sax->fsa_ax25.sax25_call = nr->source_addr; 856 sax->fsa_ax25.sax25_call = nr->source_addr;
856 *uaddr_len = sizeof(struct sockaddr_ax25); 857 uaddr_len = sizeof(struct sockaddr_ax25);
857 } 858 }
858 release_sock(sk); 859 release_sock(sk);
859 860
860 return 0; 861 return uaddr_len;
861} 862}
862 863
863int nr_rx_frame(struct sk_buff *skb, struct net_device *dev) 864int nr_rx_frame(struct sk_buff *skb, struct net_device *dev)
diff --git a/net/nfc/llcp_sock.c b/net/nfc/llcp_sock.c
index 376040092142..ea0c0c6f1874 100644
--- a/net/nfc/llcp_sock.c
+++ b/net/nfc/llcp_sock.c
@@ -497,7 +497,7 @@ error:
497} 497}
498 498
499static int llcp_sock_getname(struct socket *sock, struct sockaddr *uaddr, 499static int llcp_sock_getname(struct socket *sock, struct sockaddr *uaddr,
500 int *len, int peer) 500 int peer)
501{ 501{
502 struct sock *sk = sock->sk; 502 struct sock *sk = sock->sk;
503 struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk); 503 struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk);
@@ -510,7 +510,6 @@ static int llcp_sock_getname(struct socket *sock, struct sockaddr *uaddr,
510 llcp_sock->dsap, llcp_sock->ssap); 510 llcp_sock->dsap, llcp_sock->ssap);
511 511
512 memset(llcp_addr, 0, sizeof(*llcp_addr)); 512 memset(llcp_addr, 0, sizeof(*llcp_addr));
513 *len = sizeof(struct sockaddr_nfc_llcp);
514 513
515 lock_sock(sk); 514 lock_sock(sk);
516 if (!llcp_sock->dev) { 515 if (!llcp_sock->dev) {
@@ -528,7 +527,7 @@ static int llcp_sock_getname(struct socket *sock, struct sockaddr *uaddr,
528 llcp_addr->service_name_len); 527 llcp_addr->service_name_len);
529 release_sock(sk); 528 release_sock(sk);
530 529
531 return 0; 530 return sizeof(struct sockaddr_nfc_llcp);
532} 531}
533 532
534static inline __poll_t llcp_accept_poll(struct sock *parent) 533static inline __poll_t llcp_accept_poll(struct sock *parent)
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index e0f3f4aeeb4f..616cb9c18f88 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -3409,7 +3409,7 @@ out:
3409} 3409}
3410 3410
3411static int packet_getname_spkt(struct socket *sock, struct sockaddr *uaddr, 3411static int packet_getname_spkt(struct socket *sock, struct sockaddr *uaddr,
3412 int *uaddr_len, int peer) 3412 int peer)
3413{ 3413{
3414 struct net_device *dev; 3414 struct net_device *dev;
3415 struct sock *sk = sock->sk; 3415 struct sock *sk = sock->sk;
@@ -3424,13 +3424,12 @@ static int packet_getname_spkt(struct socket *sock, struct sockaddr *uaddr,
3424 if (dev) 3424 if (dev)
3425 strlcpy(uaddr->sa_data, dev->name, sizeof(uaddr->sa_data)); 3425 strlcpy(uaddr->sa_data, dev->name, sizeof(uaddr->sa_data));
3426 rcu_read_unlock(); 3426 rcu_read_unlock();
3427 *uaddr_len = sizeof(*uaddr);
3428 3427
3429 return 0; 3428 return sizeof(*uaddr);
3430} 3429}
3431 3430
3432static int packet_getname(struct socket *sock, struct sockaddr *uaddr, 3431static int packet_getname(struct socket *sock, struct sockaddr *uaddr,
3433 int *uaddr_len, int peer) 3432 int peer)
3434{ 3433{
3435 struct net_device *dev; 3434 struct net_device *dev;
3436 struct sock *sk = sock->sk; 3435 struct sock *sk = sock->sk;
@@ -3455,9 +3454,8 @@ static int packet_getname(struct socket *sock, struct sockaddr *uaddr,
3455 sll->sll_halen = 0; 3454 sll->sll_halen = 0;
3456 } 3455 }
3457 rcu_read_unlock(); 3456 rcu_read_unlock();
3458 *uaddr_len = offsetof(struct sockaddr_ll, sll_addr) + sll->sll_halen;
3459 3457
3460 return 0; 3458 return offsetof(struct sockaddr_ll, sll_addr) + sll->sll_halen;
3461} 3459}
3462 3460
3463static int packet_dev_mc(struct net_device *dev, struct packet_mclist *i, 3461static int packet_dev_mc(struct net_device *dev, struct packet_mclist *i,
diff --git a/net/phonet/socket.c b/net/phonet/socket.c
index fffcd69f63ff..f9b40e6a18a5 100644
--- a/net/phonet/socket.c
+++ b/net/phonet/socket.c
@@ -326,7 +326,7 @@ static int pn_socket_accept(struct socket *sock, struct socket *newsock,
326} 326}
327 327
328static int pn_socket_getname(struct socket *sock, struct sockaddr *addr, 328static int pn_socket_getname(struct socket *sock, struct sockaddr *addr,
329 int *sockaddr_len, int peer) 329 int peer)
330{ 330{
331 struct sock *sk = sock->sk; 331 struct sock *sk = sock->sk;
332 struct pn_sock *pn = pn_sk(sk); 332 struct pn_sock *pn = pn_sk(sk);
@@ -337,8 +337,7 @@ static int pn_socket_getname(struct socket *sock, struct sockaddr *addr,
337 pn_sockaddr_set_object((struct sockaddr_pn *)addr, 337 pn_sockaddr_set_object((struct sockaddr_pn *)addr,
338 pn->sobject); 338 pn->sobject);
339 339
340 *sockaddr_len = sizeof(struct sockaddr_pn); 340 return sizeof(struct sockaddr_pn);
341 return 0;
342} 341}
343 342
344static __poll_t pn_socket_poll(struct file *file, struct socket *sock, 343static __poll_t pn_socket_poll(struct file *file, struct socket *sock,
diff --git a/net/qrtr/qrtr.c b/net/qrtr/qrtr.c
index 5fb3929e3d7d..b33e5aeb4c06 100644
--- a/net/qrtr/qrtr.c
+++ b/net/qrtr/qrtr.c
@@ -893,7 +893,7 @@ static int qrtr_connect(struct socket *sock, struct sockaddr *saddr,
893} 893}
894 894
895static int qrtr_getname(struct socket *sock, struct sockaddr *saddr, 895static int qrtr_getname(struct socket *sock, struct sockaddr *saddr,
896 int *len, int peer) 896 int peer)
897{ 897{
898 struct qrtr_sock *ipc = qrtr_sk(sock->sk); 898 struct qrtr_sock *ipc = qrtr_sk(sock->sk);
899 struct sockaddr_qrtr qaddr; 899 struct sockaddr_qrtr qaddr;
@@ -912,12 +912,11 @@ static int qrtr_getname(struct socket *sock, struct sockaddr *saddr,
912 } 912 }
913 release_sock(sk); 913 release_sock(sk);
914 914
915 *len = sizeof(qaddr);
916 qaddr.sq_family = AF_QIPCRTR; 915 qaddr.sq_family = AF_QIPCRTR;
917 916
918 memcpy(saddr, &qaddr, sizeof(qaddr)); 917 memcpy(saddr, &qaddr, sizeof(qaddr));
919 918
920 return 0; 919 return sizeof(qaddr);
921} 920}
922 921
923static int qrtr_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) 922static int qrtr_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
diff --git a/net/rds/af_rds.c b/net/rds/af_rds.c
index 744c637c86b0..0a8eefd256b3 100644
--- a/net/rds/af_rds.c
+++ b/net/rds/af_rds.c
@@ -110,7 +110,7 @@ void rds_wake_sk_sleep(struct rds_sock *rs)
110} 110}
111 111
112static int rds_getname(struct socket *sock, struct sockaddr *uaddr, 112static int rds_getname(struct socket *sock, struct sockaddr *uaddr,
113 int *uaddr_len, int peer) 113 int peer)
114{ 114{
115 struct sockaddr_in *sin = (struct sockaddr_in *)uaddr; 115 struct sockaddr_in *sin = (struct sockaddr_in *)uaddr;
116 struct rds_sock *rs = rds_sk_to_rs(sock->sk); 116 struct rds_sock *rs = rds_sk_to_rs(sock->sk);
@@ -131,8 +131,7 @@ static int rds_getname(struct socket *sock, struct sockaddr *uaddr,
131 131
132 sin->sin_family = AF_INET; 132 sin->sin_family = AF_INET;
133 133
134 *uaddr_len = sizeof(*sin); 134 return sizeof(*sin);
135 return 0;
136} 135}
137 136
138/* 137/*
diff --git a/net/rds/tcp.c b/net/rds/tcp.c
index 44c4652721af..08230a145042 100644
--- a/net/rds/tcp.c
+++ b/net/rds/tcp.c
@@ -227,7 +227,6 @@ static void rds_tcp_tc_info(struct socket *rds_sock, unsigned int len,
227 struct rds_tcp_connection *tc; 227 struct rds_tcp_connection *tc;
228 unsigned long flags; 228 unsigned long flags;
229 struct sockaddr_in sin; 229 struct sockaddr_in sin;
230 int sinlen;
231 struct socket *sock; 230 struct socket *sock;
232 231
233 spin_lock_irqsave(&rds_tcp_tc_list_lock, flags); 232 spin_lock_irqsave(&rds_tcp_tc_list_lock, flags);
@@ -239,12 +238,10 @@ static void rds_tcp_tc_info(struct socket *rds_sock, unsigned int len,
239 238
240 sock = tc->t_sock; 239 sock = tc->t_sock;
241 if (sock) { 240 if (sock) {
242 sock->ops->getname(sock, (struct sockaddr *)&sin, 241 sock->ops->getname(sock, (struct sockaddr *)&sin, 0);
243 &sinlen, 0);
244 tsinfo.local_addr = sin.sin_addr.s_addr; 242 tsinfo.local_addr = sin.sin_addr.s_addr;
245 tsinfo.local_port = sin.sin_port; 243 tsinfo.local_port = sin.sin_port;
246 sock->ops->getname(sock, (struct sockaddr *)&sin, 244 sock->ops->getname(sock, (struct sockaddr *)&sin, 1);
247 &sinlen, 1);
248 tsinfo.peer_addr = sin.sin_addr.s_addr; 245 tsinfo.peer_addr = sin.sin_addr.s_addr;
249 tsinfo.peer_port = sin.sin_port; 246 tsinfo.peer_port = sin.sin_port;
250 } 247 }
diff --git a/net/rose/af_rose.c b/net/rose/af_rose.c
index 083bd251406f..5170373b797c 100644
--- a/net/rose/af_rose.c
+++ b/net/rose/af_rose.c
@@ -938,7 +938,7 @@ out_release:
938} 938}
939 939
940static int rose_getname(struct socket *sock, struct sockaddr *uaddr, 940static int rose_getname(struct socket *sock, struct sockaddr *uaddr,
941 int *uaddr_len, int peer) 941 int peer)
942{ 942{
943 struct full_sockaddr_rose *srose = (struct full_sockaddr_rose *)uaddr; 943 struct full_sockaddr_rose *srose = (struct full_sockaddr_rose *)uaddr;
944 struct sock *sk = sock->sk; 944 struct sock *sk = sock->sk;
@@ -964,8 +964,7 @@ static int rose_getname(struct socket *sock, struct sockaddr *uaddr,
964 srose->srose_digis[n] = rose->source_digis[n]; 964 srose->srose_digis[n] = rose->source_digis[n];
965 } 965 }
966 966
967 *uaddr_len = sizeof(struct full_sockaddr_rose); 967 return sizeof(struct full_sockaddr_rose);
968 return 0;
969} 968}
970 969
971int rose_rx_call_request(struct sk_buff *skb, struct net_device *dev, struct rose_neigh *neigh, unsigned int lci) 970int rose_rx_call_request(struct sk_buff *skb, struct net_device *dev, struct rose_neigh *neigh, unsigned int lci)
diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c
index e35d4f73d2df..0d873c58e516 100644
--- a/net/sctp/ipv6.c
+++ b/net/sctp/ipv6.c
@@ -952,16 +952,16 @@ static int sctp_inet6_supported_addrs(const struct sctp_sock *opt,
952 952
953/* Handle SCTP_I_WANT_MAPPED_V4_ADDR for getpeername() and getsockname() */ 953/* Handle SCTP_I_WANT_MAPPED_V4_ADDR for getpeername() and getsockname() */
954static int sctp_getname(struct socket *sock, struct sockaddr *uaddr, 954static int sctp_getname(struct socket *sock, struct sockaddr *uaddr,
955 int *uaddr_len, int peer) 955 int peer)
956{ 956{
957 int rc; 957 int rc;
958 958
959 rc = inet6_getname(sock, uaddr, uaddr_len, peer); 959 rc = inet6_getname(sock, uaddr, peer);
960 960
961 if (rc != 0) 961 if (rc < 0)
962 return rc; 962 return rc;
963 963
964 *uaddr_len = sctp_v6_addr_to_user(sctp_sk(sock->sk), 964 rc = sctp_v6_addr_to_user(sctp_sk(sock->sk),
965 (union sctp_addr *)uaddr); 965 (union sctp_addr *)uaddr);
966 966
967 return rc; 967 return rc;
diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c
index da1a5cdefd13..38ae22b65e77 100644
--- a/net/smc/af_smc.c
+++ b/net/smc/af_smc.c
@@ -281,7 +281,6 @@ int smc_netinfo_by_tcpsk(struct socket *clcsock,
281 struct in_device *in_dev; 281 struct in_device *in_dev;
282 struct sockaddr_in addr; 282 struct sockaddr_in addr;
283 int rc = -ENOENT; 283 int rc = -ENOENT;
284 int len;
285 284
286 if (!dst) { 285 if (!dst) {
287 rc = -ENOTCONN; 286 rc = -ENOTCONN;
@@ -293,7 +292,7 @@ int smc_netinfo_by_tcpsk(struct socket *clcsock,
293 } 292 }
294 293
295 /* get address to which the internal TCP socket is bound */ 294 /* get address to which the internal TCP socket is bound */
296 kernel_getsockname(clcsock, (struct sockaddr *)&addr, &len); 295 kernel_getsockname(clcsock, (struct sockaddr *)&addr);
297 /* analyze IPv4 specific data of net_device belonging to TCP socket */ 296 /* analyze IPv4 specific data of net_device belonging to TCP socket */
298 rcu_read_lock(); 297 rcu_read_lock();
299 in_dev = __in_dev_get_rcu(dst->dev); 298 in_dev = __in_dev_get_rcu(dst->dev);
@@ -771,7 +770,7 @@ static void smc_listen_work(struct work_struct *work)
771 u8 buf[SMC_CLC_MAX_LEN]; 770 u8 buf[SMC_CLC_MAX_LEN];
772 struct smc_link *link; 771 struct smc_link *link;
773 int reason_code = 0; 772 int reason_code = 0;
774 int rc = 0, len; 773 int rc = 0;
775 __be32 subnet; 774 __be32 subnet;
776 u8 prefix_len; 775 u8 prefix_len;
777 u8 ibport; 776 u8 ibport;
@@ -824,7 +823,7 @@ static void smc_listen_work(struct work_struct *work)
824 } 823 }
825 824
826 /* get address of the peer connected to the internal TCP socket */ 825 /* get address of the peer connected to the internal TCP socket */
827 kernel_getpeername(newclcsock, (struct sockaddr *)&peeraddr, &len); 826 kernel_getpeername(newclcsock, (struct sockaddr *)&peeraddr);
828 827
829 /* allocate connection / link group */ 828 /* allocate connection / link group */
830 mutex_lock(&smc_create_lgr_pending); 829 mutex_lock(&smc_create_lgr_pending);
@@ -1075,7 +1074,7 @@ out:
1075} 1074}
1076 1075
1077static int smc_getname(struct socket *sock, struct sockaddr *addr, 1076static int smc_getname(struct socket *sock, struct sockaddr *addr,
1078 int *len, int peer) 1077 int peer)
1079{ 1078{
1080 struct smc_sock *smc; 1079 struct smc_sock *smc;
1081 1080
@@ -1085,7 +1084,7 @@ static int smc_getname(struct socket *sock, struct sockaddr *addr,
1085 1084
1086 smc = smc_sk(sock->sk); 1085 smc = smc_sk(sock->sk);
1087 1086
1088 return smc->clcsock->ops->getname(smc->clcsock, addr, len, peer); 1087 return smc->clcsock->ops->getname(smc->clcsock, addr, peer);
1089} 1088}
1090 1089
1091static int smc_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) 1090static int smc_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
diff --git a/net/socket.c b/net/socket.c
index a93c99b518ca..fac8246a8ae8 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -1573,8 +1573,9 @@ SYSCALL_DEFINE4(accept4, int, fd, struct sockaddr __user *, upeer_sockaddr,
1573 goto out_fd; 1573 goto out_fd;
1574 1574
1575 if (upeer_sockaddr) { 1575 if (upeer_sockaddr) {
1576 if (newsock->ops->getname(newsock, (struct sockaddr *)&address, 1576 len = newsock->ops->getname(newsock,
1577 &len, 2) < 0) { 1577 (struct sockaddr *)&address, 2);
1578 if (len < 0) {
1578 err = -ECONNABORTED; 1579 err = -ECONNABORTED;
1579 goto out_fd; 1580 goto out_fd;
1580 } 1581 }
@@ -1654,7 +1655,7 @@ SYSCALL_DEFINE3(getsockname, int, fd, struct sockaddr __user *, usockaddr,
1654{ 1655{
1655 struct socket *sock; 1656 struct socket *sock;
1656 struct sockaddr_storage address; 1657 struct sockaddr_storage address;
1657 int len, err, fput_needed; 1658 int err, fput_needed;
1658 1659
1659 sock = sockfd_lookup_light(fd, &err, &fput_needed); 1660 sock = sockfd_lookup_light(fd, &err, &fput_needed);
1660 if (!sock) 1661 if (!sock)
@@ -1664,10 +1665,11 @@ SYSCALL_DEFINE3(getsockname, int, fd, struct sockaddr __user *, usockaddr,
1664 if (err) 1665 if (err)
1665 goto out_put; 1666 goto out_put;
1666 1667
1667 err = sock->ops->getname(sock, (struct sockaddr *)&address, &len, 0); 1668 err = sock->ops->getname(sock, (struct sockaddr *)&address, 0);
1668 if (err) 1669 if (err < 0)
1669 goto out_put; 1670 goto out_put;
1670 err = move_addr_to_user(&address, len, usockaddr, usockaddr_len); 1671 /* "err" is actually length in this case */
1672 err = move_addr_to_user(&address, err, usockaddr, usockaddr_len);
1671 1673
1672out_put: 1674out_put:
1673 fput_light(sock->file, fput_needed); 1675 fput_light(sock->file, fput_needed);
@@ -1685,7 +1687,7 @@ SYSCALL_DEFINE3(getpeername, int, fd, struct sockaddr __user *, usockaddr,
1685{ 1687{
1686 struct socket *sock; 1688 struct socket *sock;
1687 struct sockaddr_storage address; 1689 struct sockaddr_storage address;
1688 int len, err, fput_needed; 1690 int err, fput_needed;
1689 1691
1690 sock = sockfd_lookup_light(fd, &err, &fput_needed); 1692 sock = sockfd_lookup_light(fd, &err, &fput_needed);
1691 if (sock != NULL) { 1693 if (sock != NULL) {
@@ -1695,11 +1697,10 @@ SYSCALL_DEFINE3(getpeername, int, fd, struct sockaddr __user *, usockaddr,
1695 return err; 1697 return err;
1696 } 1698 }
1697 1699
1698 err = 1700 err = sock->ops->getname(sock, (struct sockaddr *)&address, 1);
1699 sock->ops->getname(sock, (struct sockaddr *)&address, &len, 1701 if (err >= 0)
1700 1); 1702 /* "err" is actually length in this case */
1701 if (!err) 1703 err = move_addr_to_user(&address, err, usockaddr,
1702 err = move_addr_to_user(&address, len, usockaddr,
1703 usockaddr_len); 1704 usockaddr_len);
1704 fput_light(sock->file, fput_needed); 1705 fput_light(sock->file, fput_needed);
1705 } 1706 }
@@ -3166,17 +3167,15 @@ int kernel_connect(struct socket *sock, struct sockaddr *addr, int addrlen,
3166} 3167}
3167EXPORT_SYMBOL(kernel_connect); 3168EXPORT_SYMBOL(kernel_connect);
3168 3169
3169int kernel_getsockname(struct socket *sock, struct sockaddr *addr, 3170int kernel_getsockname(struct socket *sock, struct sockaddr *addr)
3170 int *addrlen)
3171{ 3171{
3172 return sock->ops->getname(sock, addr, addrlen, 0); 3172 return sock->ops->getname(sock, addr, 0);
3173} 3173}
3174EXPORT_SYMBOL(kernel_getsockname); 3174EXPORT_SYMBOL(kernel_getsockname);
3175 3175
3176int kernel_getpeername(struct socket *sock, struct sockaddr *addr, 3176int kernel_getpeername(struct socket *sock, struct sockaddr *addr)
3177 int *addrlen)
3178{ 3177{
3179 return sock->ops->getname(sock, addr, addrlen, 1); 3178 return sock->ops->getname(sock, addr, 1);
3180} 3179}
3181EXPORT_SYMBOL(kernel_getpeername); 3180EXPORT_SYMBOL(kernel_getpeername);
3182 3181
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c
index 6e432ecd7f99..806395687bb6 100644
--- a/net/sunrpc/clnt.c
+++ b/net/sunrpc/clnt.c
@@ -1231,7 +1231,7 @@ static const struct sockaddr_in6 rpc_in6addr_loopback = {
1231 * negative errno is returned. 1231 * negative errno is returned.
1232 */ 1232 */
1233static int rpc_sockname(struct net *net, struct sockaddr *sap, size_t salen, 1233static int rpc_sockname(struct net *net, struct sockaddr *sap, size_t salen,
1234 struct sockaddr *buf, int buflen) 1234 struct sockaddr *buf)
1235{ 1235{
1236 struct socket *sock; 1236 struct socket *sock;
1237 int err; 1237 int err;
@@ -1269,7 +1269,7 @@ static int rpc_sockname(struct net *net, struct sockaddr *sap, size_t salen,
1269 goto out_release; 1269 goto out_release;
1270 } 1270 }
1271 1271
1272 err = kernel_getsockname(sock, buf, &buflen); 1272 err = kernel_getsockname(sock, buf);
1273 if (err < 0) { 1273 if (err < 0) {
1274 dprintk("RPC: getsockname failed (%d)\n", err); 1274 dprintk("RPC: getsockname failed (%d)\n", err);
1275 goto out_release; 1275 goto out_release;
@@ -1353,7 +1353,7 @@ int rpc_localaddr(struct rpc_clnt *clnt, struct sockaddr *buf, size_t buflen)
1353 rcu_read_unlock(); 1353 rcu_read_unlock();
1354 1354
1355 rpc_set_port(sap, 0); 1355 rpc_set_port(sap, 0);
1356 err = rpc_sockname(net, sap, salen, buf, buflen); 1356 err = rpc_sockname(net, sap, salen, buf);
1357 put_net(net); 1357 put_net(net);
1358 if (err != 0) 1358 if (err != 0)
1359 /* Couldn't discover local address, return ANYADDR */ 1359 /* Couldn't discover local address, return ANYADDR */
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c
index 943f2a745cd5..08cd951aaeea 100644
--- a/net/sunrpc/svcsock.c
+++ b/net/sunrpc/svcsock.c
@@ -832,12 +832,13 @@ static struct svc_xprt *svc_tcp_accept(struct svc_xprt *xprt)
832 } 832 }
833 set_bit(XPT_CONN, &svsk->sk_xprt.xpt_flags); 833 set_bit(XPT_CONN, &svsk->sk_xprt.xpt_flags);
834 834
835 err = kernel_getpeername(newsock, sin, &slen); 835 err = kernel_getpeername(newsock, sin);
836 if (err < 0) { 836 if (err < 0) {
837 net_warn_ratelimited("%s: peername failed (err %d)!\n", 837 net_warn_ratelimited("%s: peername failed (err %d)!\n",
838 serv->sv_name, -err); 838 serv->sv_name, -err);
839 goto failed; /* aborted connection or whatever */ 839 goto failed; /* aborted connection or whatever */
840 } 840 }
841 slen = err;
841 842
842 /* Ideally, we would want to reject connections from unauthorized 843 /* Ideally, we would want to reject connections from unauthorized
843 * hosts here, but when we get encryption, the IP of the host won't 844 * hosts here, but when we get encryption, the IP of the host won't
@@ -866,7 +867,8 @@ static struct svc_xprt *svc_tcp_accept(struct svc_xprt *xprt)
866 if (IS_ERR(newsvsk)) 867 if (IS_ERR(newsvsk))
867 goto failed; 868 goto failed;
868 svc_xprt_set_remote(&newsvsk->sk_xprt, sin, slen); 869 svc_xprt_set_remote(&newsvsk->sk_xprt, sin, slen);
869 err = kernel_getsockname(newsock, sin, &slen); 870 err = kernel_getsockname(newsock, sin);
871 slen = err;
870 if (unlikely(err < 0)) { 872 if (unlikely(err < 0)) {
871 dprintk("svc_tcp_accept: kernel_getsockname error %d\n", -err); 873 dprintk("svc_tcp_accept: kernel_getsockname error %d\n", -err);
872 slen = offsetof(struct sockaddr, sa_data); 874 slen = offsetof(struct sockaddr, sa_data);
@@ -1465,7 +1467,8 @@ int svc_addsock(struct svc_serv *serv, const int fd, char *name_return,
1465 err = PTR_ERR(svsk); 1467 err = PTR_ERR(svsk);
1466 goto out; 1468 goto out;
1467 } 1469 }
1468 if (kernel_getsockname(svsk->sk_sock, sin, &salen) == 0) 1470 salen = kernel_getsockname(svsk->sk_sock, sin);
1471 if (salen >= 0)
1469 svc_xprt_set_local(&svsk->sk_xprt, sin, salen); 1472 svc_xprt_set_local(&svsk->sk_xprt, sin, salen);
1470 svc_add_new_perm_xprt(serv, &svsk->sk_xprt); 1473 svc_add_new_perm_xprt(serv, &svsk->sk_xprt);
1471 return svc_one_sock_name(svsk, name_return, len); 1474 return svc_one_sock_name(svsk, name_return, len);
@@ -1539,10 +1542,10 @@ static struct svc_xprt *svc_create_socket(struct svc_serv *serv,
1539 if (error < 0) 1542 if (error < 0)
1540 goto bummer; 1543 goto bummer;
1541 1544
1542 newlen = len; 1545 error = kernel_getsockname(sock, newsin);
1543 error = kernel_getsockname(sock, newsin, &newlen);
1544 if (error < 0) 1546 if (error < 0)
1545 goto bummer; 1547 goto bummer;
1548 newlen = error;
1546 1549
1547 if (protocol == IPPROTO_TCP) { 1550 if (protocol == IPPROTO_TCP) {
1548 if ((error = kernel_listen(sock, 64)) < 0) 1551 if ((error = kernel_listen(sock, 64)) < 0)
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
index a6b8c1f8f92a..956e29c1438d 100644
--- a/net/sunrpc/xprtsock.c
+++ b/net/sunrpc/xprtsock.c
@@ -1794,10 +1794,9 @@ static void xs_sock_set_reuseport(struct socket *sock)
1794static unsigned short xs_sock_getport(struct socket *sock) 1794static unsigned short xs_sock_getport(struct socket *sock)
1795{ 1795{
1796 struct sockaddr_storage buf; 1796 struct sockaddr_storage buf;
1797 int buflen;
1798 unsigned short port = 0; 1797 unsigned short port = 0;
1799 1798
1800 if (kernel_getsockname(sock, (struct sockaddr *)&buf, &buflen) < 0) 1799 if (kernel_getsockname(sock, (struct sockaddr *)&buf) < 0)
1801 goto out; 1800 goto out;
1802 switch (buf.ss_family) { 1801 switch (buf.ss_family) {
1803 case AF_INET6: 1802 case AF_INET6:
diff --git a/net/tipc/socket.c b/net/tipc/socket.c
index b0323ec7971e..f93477187a90 100644
--- a/net/tipc/socket.c
+++ b/net/tipc/socket.c
@@ -665,7 +665,7 @@ exit:
665 * a completely predictable manner). 665 * a completely predictable manner).
666 */ 666 */
667static int tipc_getname(struct socket *sock, struct sockaddr *uaddr, 667static int tipc_getname(struct socket *sock, struct sockaddr *uaddr,
668 int *uaddr_len, int peer) 668 int peer)
669{ 669{
670 struct sockaddr_tipc *addr = (struct sockaddr_tipc *)uaddr; 670 struct sockaddr_tipc *addr = (struct sockaddr_tipc *)uaddr;
671 struct sock *sk = sock->sk; 671 struct sock *sk = sock->sk;
@@ -684,13 +684,12 @@ static int tipc_getname(struct socket *sock, struct sockaddr *uaddr,
684 addr->addr.id.node = tn->own_addr; 684 addr->addr.id.node = tn->own_addr;
685 } 685 }
686 686
687 *uaddr_len = sizeof(*addr);
688 addr->addrtype = TIPC_ADDR_ID; 687 addr->addrtype = TIPC_ADDR_ID;
689 addr->family = AF_TIPC; 688 addr->family = AF_TIPC;
690 addr->scope = 0; 689 addr->scope = 0;
691 addr->addr.name.domain = 0; 690 addr->addr.name.domain = 0;
692 691
693 return 0; 692 return sizeof(*addr);
694} 693}
695 694
696/** 695/**
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
index d545e1d0dea2..723698416242 100644
--- a/net/unix/af_unix.c
+++ b/net/unix/af_unix.c
@@ -637,7 +637,7 @@ static int unix_stream_connect(struct socket *, struct sockaddr *,
637 int addr_len, int flags); 637 int addr_len, int flags);
638static int unix_socketpair(struct socket *, struct socket *); 638static int unix_socketpair(struct socket *, struct socket *);
639static int unix_accept(struct socket *, struct socket *, int, bool); 639static int unix_accept(struct socket *, struct socket *, int, bool);
640static int unix_getname(struct socket *, struct sockaddr *, int *, int); 640static int unix_getname(struct socket *, struct sockaddr *, int);
641static __poll_t unix_poll(struct file *, struct socket *, poll_table *); 641static __poll_t unix_poll(struct file *, struct socket *, poll_table *);
642static __poll_t unix_dgram_poll(struct file *, struct socket *, 642static __poll_t unix_dgram_poll(struct file *, struct socket *,
643 poll_table *); 643 poll_table *);
@@ -1453,7 +1453,7 @@ out:
1453} 1453}
1454 1454
1455 1455
1456static int unix_getname(struct socket *sock, struct sockaddr *uaddr, int *uaddr_len, int peer) 1456static int unix_getname(struct socket *sock, struct sockaddr *uaddr, int peer)
1457{ 1457{
1458 struct sock *sk = sock->sk; 1458 struct sock *sk = sock->sk;
1459 struct unix_sock *u; 1459 struct unix_sock *u;
@@ -1476,12 +1476,12 @@ static int unix_getname(struct socket *sock, struct sockaddr *uaddr, int *uaddr_
1476 if (!u->addr) { 1476 if (!u->addr) {
1477 sunaddr->sun_family = AF_UNIX; 1477 sunaddr->sun_family = AF_UNIX;
1478 sunaddr->sun_path[0] = 0; 1478 sunaddr->sun_path[0] = 0;
1479 *uaddr_len = sizeof(short); 1479 err = sizeof(short);
1480 } else { 1480 } else {
1481 struct unix_address *addr = u->addr; 1481 struct unix_address *addr = u->addr;
1482 1482
1483 *uaddr_len = addr->len; 1483 err = addr->len;
1484 memcpy(sunaddr, addr->name, *uaddr_len); 1484 memcpy(sunaddr, addr->name, addr->len);
1485 } 1485 }
1486 unix_state_unlock(sk); 1486 unix_state_unlock(sk);
1487 sock_put(sk); 1487 sock_put(sk);
diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c
index e0fc84daed94..aac9b8f6552e 100644
--- a/net/vmw_vsock/af_vsock.c
+++ b/net/vmw_vsock/af_vsock.c
@@ -759,7 +759,7 @@ vsock_bind(struct socket *sock, struct sockaddr *addr, int addr_len)
759} 759}
760 760
761static int vsock_getname(struct socket *sock, 761static int vsock_getname(struct socket *sock,
762 struct sockaddr *addr, int *addr_len, int peer) 762 struct sockaddr *addr, int peer)
763{ 763{
764 int err; 764 int err;
765 struct sock *sk; 765 struct sock *sk;
@@ -794,7 +794,7 @@ static int vsock_getname(struct socket *sock,
794 */ 794 */
795 BUILD_BUG_ON(sizeof(*vm_addr) > 128); 795 BUILD_BUG_ON(sizeof(*vm_addr) > 128);
796 memcpy(addr, vm_addr, sizeof(*vm_addr)); 796 memcpy(addr, vm_addr, sizeof(*vm_addr));
797 *addr_len = sizeof(*vm_addr); 797 err = sizeof(*vm_addr);
798 798
799out: 799out:
800 release_sock(sk); 800 release_sock(sk);
diff --git a/net/x25/af_x25.c b/net/x25/af_x25.c
index 562cc11131f6..d49aa79b7997 100644
--- a/net/x25/af_x25.c
+++ b/net/x25/af_x25.c
@@ -896,7 +896,7 @@ out:
896} 896}
897 897
898static int x25_getname(struct socket *sock, struct sockaddr *uaddr, 898static int x25_getname(struct socket *sock, struct sockaddr *uaddr,
899 int *uaddr_len, int peer) 899 int peer)
900{ 900{
901 struct sockaddr_x25 *sx25 = (struct sockaddr_x25 *)uaddr; 901 struct sockaddr_x25 *sx25 = (struct sockaddr_x25 *)uaddr;
902 struct sock *sk = sock->sk; 902 struct sock *sk = sock->sk;
@@ -913,7 +913,7 @@ static int x25_getname(struct socket *sock, struct sockaddr *uaddr,
913 sx25->sx25_addr = x25->source_addr; 913 sx25->sx25_addr = x25->source_addr;
914 914
915 sx25->sx25_family = AF_X25; 915 sx25->sx25_family = AF_X25;
916 *uaddr_len = sizeof(*sx25); 916 rc = sizeof(*sx25);
917 917
918out: 918out:
919 return rc; 919 return rc;
diff --git a/security/tomoyo/network.c b/security/tomoyo/network.c
index cd6932e5225c..9094f4b3b367 100644
--- a/security/tomoyo/network.c
+++ b/security/tomoyo/network.c
@@ -655,10 +655,11 @@ int tomoyo_socket_listen_permission(struct socket *sock)
655 return 0; 655 return 0;
656 { 656 {
657 const int error = sock->ops->getname(sock, (struct sockaddr *) 657 const int error = sock->ops->getname(sock, (struct sockaddr *)
658 &addr, &addr_len, 0); 658 &addr, 0);
659 659
660 if (error) 660 if (error < 0)
661 return error; 661 return error;
662 addr_len = error;
662 } 663 }
663 address.protocol = type; 664 address.protocol = type;
664 address.operation = TOMOYO_NETWORK_LISTEN; 665 address.operation = TOMOYO_NETWORK_LISTEN;