]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
net: make getname() functions return length rather than use int* parameter
authorDenys Vlasenko <dvlasenk@redhat.com>
Mon, 12 Feb 2018 19:00:20 +0000 (20:00 +0100)
committerDavid S. Miller <davem@davemloft.net>
Mon, 12 Feb 2018 19:15:04 +0000 (14:15 -0500)
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>
55 files changed:
drivers/infiniband/hw/usnic/usnic_transport.c
drivers/isdn/mISDN/socket.c
drivers/net/ppp/pppoe.c
drivers/net/ppp/pptp.c
drivers/scsi/iscsi_tcp.c
drivers/soc/qcom/qmi_interface.c
drivers/staging/ipx/af_ipx.c
drivers/staging/irda/net/af_irda.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
include/linux/net.h
include/net/inet_common.h
include/net/ipv6.h
include/net/sock.h
net/appletalk/ddp.c
net/atm/pvc.c
net/atm/svc.c
net/ax25/af_ax25.c
net/bluetooth/hci_sock.c
net/bluetooth/l2cap_sock.c
net/bluetooth/rfcomm/sock.c
net/bluetooth/sco.c
net/can/raw.c
net/core/sock.c
net/decnet/af_decnet.c
net/ipv4/af_inet.c
net/ipv6/af_inet6.c
net/iucv/af_iucv.c
net/l2tp/l2tp_ip.c
net/l2tp/l2tp_ip6.c
net/l2tp/l2tp_ppp.c
net/llc/af_llc.c
net/netlink/af_netlink.c
net/netrom/af_netrom.c
net/nfc/llcp_sock.c
net/packet/af_packet.c
net/phonet/socket.c
net/qrtr/qrtr.c
net/rds/af_rds.c
net/rds/tcp.c
net/rose/af_rose.c
net/sctp/ipv6.c
net/smc/af_smc.c
net/socket.c
net/sunrpc/clnt.c
net/sunrpc/svcsock.c
net/sunrpc/xprtsock.c
net/tipc/socket.c
net/unix/af_unix.c
net/vmw_vsock/af_vsock.c
net/x25/af_x25.c
security/tomoyo/network.c

index de318389a301a58058fb166acd85aef0189e89d5..67de94343cb4dd51046d5bc1853e728ed6dfd2a6 100644 (file)
@@ -174,14 +174,13 @@ void usnic_transport_put_socket(struct socket *sock)
 int usnic_transport_sock_get_addr(struct socket *sock, int *proto,
                                        uint32_t *addr, uint16_t *port)
 {
-       int len;
        int err;
        struct sockaddr_in sock_addr;
 
        err = sock->ops->getname(sock,
                                (struct sockaddr *)&sock_addr,
-                               &len, 0);
-       if (err)
+                               0);
+       if (err < 0)
                return err;
 
        if (sock_addr.sin_family != AF_INET)
index c5603d1a07d6e86ce7f6913168daacb56b134ea3..1f8f489b41674192f7a981a525d02b444083f4ce 100644 (file)
@@ -560,7 +560,7 @@ data_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_len)
 
 static int
 data_sock_getname(struct socket *sock, struct sockaddr *addr,
-                 int *addr_len, int peer)
+                 int peer)
 {
        struct sockaddr_mISDN   *maddr = (struct sockaddr_mISDN *) addr;
        struct sock             *sk = sock->sk;
@@ -570,14 +570,13 @@ data_sock_getname(struct socket *sock, struct sockaddr *addr,
 
        lock_sock(sk);
 
-       *addr_len = sizeof(*maddr);
        maddr->family = AF_ISDN;
        maddr->dev = _pms(sk)->dev->id;
        maddr->channel = _pms(sk)->ch.nr;
        maddr->sapi = _pms(sk)->ch.addr & 0xff;
        maddr->tei = (_pms(sk)->ch.addr >> 8) & 0xff;
        release_sock(sk);
-       return 0;
+       return sizeof(*maddr);
 }
 
 static const struct proto_ops data_sock_ops = {
index 5aa59f41bf8c3992b5ba58e24ac8763ab264eb5f..bd89d1c559cef5329a7b7dfa238d04d4bf54811c 100644 (file)
@@ -714,7 +714,7 @@ static int pppoe_connect(struct socket *sock, struct sockaddr *uservaddr,
 }
 
 static int pppoe_getname(struct socket *sock, struct sockaddr *uaddr,
-                 int *usockaddr_len, int peer)
+                 int peer)
 {
        int len = sizeof(struct sockaddr_pppox);
        struct sockaddr_pppox sp;
@@ -726,9 +726,7 @@ static int pppoe_getname(struct socket *sock, struct sockaddr *uaddr,
 
        memcpy(uaddr, &sp, len);
 
-       *usockaddr_len = len;
-
-       return 0;
+       return len;
 }
 
 static int pppoe_ioctl(struct socket *sock, unsigned int cmd,
index 6dde9a0cfe76ca3b09fcb355b26b75c3dad7c622..8249d46a784493faedbfad5ec78212afab8c872e 100644 (file)
@@ -483,7 +483,7 @@ static int pptp_connect(struct socket *sock, struct sockaddr *uservaddr,
 }
 
 static int pptp_getname(struct socket *sock, struct sockaddr *uaddr,
-       int *usockaddr_len, int peer)
+       int peer)
 {
        int len = sizeof(struct sockaddr_pppox);
        struct sockaddr_pppox sp;
@@ -496,9 +496,7 @@ static int pptp_getname(struct socket *sock, struct sockaddr *uaddr,
 
        memcpy(uaddr, &sp, len);
 
-       *usockaddr_len = len;
-
-       return 0;
+       return len;
 }
 
 static int pptp_release(struct socket *sock)
index 6198559abbd8f8e9ae9293a03ea511726946f953..0ad00dbf912df08e58b869baac09bc8815260a96 100644 (file)
@@ -732,7 +732,7 @@ static int iscsi_sw_tcp_conn_get_param(struct iscsi_cls_conn *cls_conn,
        struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
        struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
        struct sockaddr_in6 addr;
-       int rc, len;
+       int rc;
 
        switch(param) {
        case ISCSI_PARAM_CONN_PORT:
@@ -745,12 +745,12 @@ static int iscsi_sw_tcp_conn_get_param(struct iscsi_cls_conn *cls_conn,
                }
                if (param == ISCSI_PARAM_LOCAL_PORT)
                        rc = kernel_getsockname(tcp_sw_conn->sock,
-                                               (struct sockaddr *)&addr, &len);
+                                               (struct sockaddr *)&addr);
                else
                        rc = kernel_getpeername(tcp_sw_conn->sock,
-                                               (struct sockaddr *)&addr, &len);
+                                               (struct sockaddr *)&addr);
                spin_unlock_bh(&conn->session->frwd_lock);
-               if (rc)
+               if (rc < 0)
                        return rc;
 
                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,
        struct iscsi_tcp_conn *tcp_conn;
        struct iscsi_sw_tcp_conn *tcp_sw_conn;
        struct sockaddr_in6 addr;
-       int rc, len;
+       int rc;
 
        switch (param) {
        case ISCSI_HOST_PARAM_IPADDRESS:
@@ -793,9 +793,9 @@ static int iscsi_sw_tcp_host_get_param(struct Scsi_Host *shost,
                }
 
                rc = kernel_getsockname(tcp_sw_conn->sock,
-                                       (struct sockaddr *)&addr, &len);
+                                       (struct sockaddr *)&addr);
                spin_unlock_bh(&session->frwd_lock);
-               if (rc)
+               if (rc < 0)
                        return rc;
 
                return iscsi_conn_get_addr_param((struct sockaddr_storage *)
index 877611d5c42b067dd7508bfdef2abc5ecc4413e1..321982277697552402c3d07ed77dd5b8a9c6e523 100644 (file)
@@ -586,7 +586,6 @@ static struct socket *qmi_sock_create(struct qmi_handle *qmi,
                                      struct sockaddr_qrtr *sq)
 {
        struct socket *sock;
-       int sl = sizeof(*sq);
        int ret;
 
        ret = sock_create_kern(&init_net, AF_QIPCRTR, SOCK_DGRAM,
@@ -594,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, &sl);
+       ret = kernel_getsockname(sock, (struct sockaddr *)sq);
        if (ret < 0) {
                sock_release(sock);
                return ERR_PTR(ret);
index d21a9d128d3e44cf175cce502d0a5ca3825d338f..5703dd176787b0a09cdd2093710a99352c192399 100644 (file)
@@ -1577,7 +1577,7 @@ static int ipx_connect(struct socket *sock, struct sockaddr *uaddr,
 
 
 static int ipx_getname(struct socket *sock, struct sockaddr *uaddr,
-                       int *uaddr_len, int peer)
+                       int peer)
 {
        struct ipx_address *addr;
        struct sockaddr_ipx sipx;
@@ -1585,8 +1585,6 @@ static int ipx_getname(struct socket *sock, struct sockaddr *uaddr,
        struct ipx_sock *ipxs = ipx_sk(sk);
        int rc;
 
-       *uaddr_len = sizeof(struct sockaddr_ipx);
-
        lock_sock(sk);
        if (peer) {
                rc = -ENOTCONN;
@@ -1620,7 +1618,7 @@ static int ipx_getname(struct socket *sock, struct sockaddr *uaddr,
        sipx.sipx_zero   = 0;
        memcpy(uaddr, &sipx, sizeof(sipx));
 
-       rc = 0;
+       rc = sizeof(struct sockaddr_ipx);
 out:
        release_sock(sk);
        return rc;
index 2f1e9ab3d6d0ff10c59a99f917567b5fd339ec52..c13553a9ee1132439f789881b9dd9104749a6c9b 100644 (file)
@@ -697,7 +697,7 @@ static int irda_discover_daddr_and_lsap_sel(struct irda_sock *self, char *name)
  *
  */
 static int irda_getname(struct socket *sock, struct sockaddr *uaddr,
-                       int *uaddr_len, int peer)
+                       int peer)
 {
        struct sockaddr_irda saddr;
        struct sock *sk = sock->sk;
@@ -720,11 +720,9 @@ static int irda_getname(struct socket *sock, struct sockaddr *uaddr,
        pr_debug("%s(), tsap_sel = %#x\n", __func__, saddr.sir_lsap_sel);
        pr_debug("%s(), addr = %08x\n", __func__, saddr.sir_addr);
 
-       /* uaddr_len come to us uninitialised */
-       *uaddr_len = sizeof (struct sockaddr_irda);
-       memcpy(uaddr, &saddr, *uaddr_len);
+       memcpy(uaddr, &saddr, sizeof (struct sockaddr_irda));
 
-       return 0;
+       return sizeof (struct sockaddr_irda);
 }
 
 /*
index ce93806eefca077f33478f2765f1a9e6d9fa71c8..1bee667802b0234b7e6bf24bed3d5c10d263c722 100644 (file)
@@ -448,14 +448,13 @@ int
 lnet_sock_getaddr(struct socket *sock, bool remote, __u32 *ip, int *port)
 {
        struct sockaddr_in sin;
-       int len = sizeof(sin);
        int rc;
 
        if (remote)
-               rc = kernel_getpeername(sock, (struct sockaddr *)&sin, &len);
+               rc = kernel_getpeername(sock, (struct sockaddr *)&sin);
        else
-               rc = kernel_getsockname(sock, (struct sockaddr *)&sin, &len);
-       if (rc) {
+               rc = kernel_getsockname(sock, (struct sockaddr *)&sin);
+       if (rc < 0) {
                CERROR("Error %d getting sock %s IP/port\n",
                       rc, remote ? "peer" : "local");
                return rc;
index 64c5a57b92e4923a1b8298cdc71637bd03314276..99501785cdc1ea669c463a754b9e24ea51d0f956 100644 (file)
@@ -1020,7 +1020,7 @@ int iscsit_accept_np(struct iscsi_np *np, struct iscsi_conn *conn)
        struct socket *new_sock, *sock = np->np_socket;
        struct sockaddr_in sock_in;
        struct sockaddr_in6 sock_in6;
-       int rc, err;
+       int rc;
 
        rc = kernel_accept(sock, &new_sock, 0);
        if (rc < 0)
@@ -1033,8 +1033,8 @@ int iscsit_accept_np(struct iscsi_np *np, struct iscsi_conn *conn)
                memset(&sock_in6, 0, sizeof(struct sockaddr_in6));
 
                rc = conn->sock->ops->getname(conn->sock,
-                               (struct sockaddr *)&sock_in6, &err, 1);
-               if (!rc) {
+                               (struct sockaddr *)&sock_in6, 1);
+               if (rc >= 0) {
                        if (!ipv6_addr_v4mapped(&sock_in6.sin6_addr)) {
                                memcpy(&conn->login_sockaddr, &sock_in6, sizeof(sock_in6));
                        } else {
@@ -1047,8 +1047,8 @@ int iscsit_accept_np(struct iscsi_np *np, struct iscsi_conn *conn)
                }
 
                rc = conn->sock->ops->getname(conn->sock,
-                               (struct sockaddr *)&sock_in6, &err, 0);
-               if (!rc) {
+                               (struct sockaddr *)&sock_in6, 0);
+               if (rc >= 0) {
                        if (!ipv6_addr_v4mapped(&sock_in6.sin6_addr)) {
                                memcpy(&conn->local_sockaddr, &sock_in6, sizeof(sock_in6));
                        } else {
@@ -1063,13 +1063,13 @@ int iscsit_accept_np(struct iscsi_np *np, struct iscsi_conn *conn)
                memset(&sock_in, 0, sizeof(struct sockaddr_in));
 
                rc = conn->sock->ops->getname(conn->sock,
-                               (struct sockaddr *)&sock_in, &err, 1);
-               if (!rc)
+                               (struct sockaddr *)&sock_in, 1);
+               if (rc >= 0)
                        memcpy(&conn->login_sockaddr, &sock_in, sizeof(sock_in));
 
                rc = conn->sock->ops->getname(conn->sock,
-                               (struct sockaddr *)&sock_in, &err, 0);
-               if (!rc)
+                               (struct sockaddr *)&sock_in, 0);
+               if (rc >= 0)
                        memcpy(&conn->local_sockaddr, &sock_in, sizeof(sock_in));
        }
 
index 610cba276d4762a2b69d90a49dc0f846c6822835..b5fb56b822fde48bd28650a51c761a672541c31c 100644 (file)
@@ -1038,7 +1038,7 @@ static struct socket *get_raw_socket(int fd)
                struct sockaddr_ll sa;
                char  buf[MAX_ADDR_LEN];
        } uaddr;
-       int uaddr_len = sizeof uaddr, r;
+       int r;
        struct socket *sock = sockfd_lookup(fd, &r);
 
        if (!sock)
@@ -1050,9 +1050,8 @@ static struct socket *get_raw_socket(int fd)
                goto err;
        }
 
-       r = sock->ops->getname(sock, (struct sockaddr *)&uaddr.sa,
-                              &uaddr_len, 0);
-       if (r)
+       r = sock->ops->getname(sock, (struct sockaddr *)&uaddr.sa, 0);
+       if (r < 0)
                goto err;
 
        if (uaddr.sa.sll_family != AF_PACKET) {
index cff79ea0c01dbb8259a0de1bf8e4e621979de3f1..5243989a60cc34725359a066ed31861cd73ec9f0 100644 (file)
@@ -482,7 +482,6 @@ static void lowcomms_error_report(struct sock *sk)
 {
        struct connection *con;
        struct sockaddr_storage saddr;
-       int buflen;
        void (*orig_report)(struct sock *) = NULL;
 
        read_lock_bh(&sk->sk_callback_lock);
@@ -492,7 +491,7 @@ static void lowcomms_error_report(struct sock *sk)
 
        orig_report = listen_sock.sk_error_report;
        if (con->sock == NULL ||
-           kernel_getpeername(con->sock, (struct sockaddr *)&saddr, &buflen)) {
+           kernel_getpeername(con->sock, (struct sockaddr *)&saddr) < 0) {
                printk_ratelimited(KERN_ERR "dlm: node %d: socket error "
                                   "sending to node %d, port %d, "
                                   "sk_err=%d/%d\n", dlm_our_nodeid(),
@@ -757,8 +756,8 @@ static int tcp_accept_from_sock(struct connection *con)
 
        /* Get the connected socket's peer */
        memset(&peeraddr, 0, sizeof(peeraddr));
-       if (newsock->ops->getname(newsock, (struct sockaddr *)&peeraddr,
-                                 &len, 2)) {
+       len = newsock->ops->getname(newsock, (struct sockaddr *)&peeraddr, 2);
+       if (len < 0) {
                result = -ECONNABORTED;
                goto accept_err;
        }
index eac5140aac47cb8aa6e52de723cff9ed8dbbec3a..e5076185cc1ecf560193958a2bab37d106e340d7 100644 (file)
@@ -1819,7 +1819,7 @@ int o2net_register_hb_callbacks(void)
 
 static int o2net_accept_one(struct socket *sock, int *more)
 {
-       int ret, slen;
+       int ret;
        struct sockaddr_in sin;
        struct socket *new_sock = NULL;
        struct o2nm_node *node = NULL;
@@ -1864,9 +1864,7 @@ static int o2net_accept_one(struct socket *sock, int *more)
                goto out;
        }
 
-       slen = sizeof(sin);
-       ret = new_sock->ops->getname(new_sock, (struct sockaddr *) &sin,
-                                      &slen, 1);
+       ret = new_sock->ops->getname(new_sock, (struct sockaddr *) &sin, 1);
        if (ret < 0)
                goto out;
 
index 91216b16feb78e0a19b2129aa5c390fd0cd7eaff..000d1aada74fea597be27d3fe68d9268b837dfe0 100644 (file)
@@ -146,7 +146,7 @@ struct proto_ops {
                                      struct socket *newsock, int flags, bool kern);
        int             (*getname)   (struct socket *sock,
                                      struct sockaddr *addr,
-                                     int *sockaddr_len, int peer);
+                                     int peer);
        __poll_t        (*poll)      (struct file *file, struct socket *sock,
                                      struct poll_table_struct *wait);
        int             (*ioctl)     (struct socket *sock, unsigned int cmd,
@@ -294,10 +294,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 *addrlen);
-int kernel_getpeername(struct socket *sock, struct sockaddr *addr,
-                      int *addrlen);
+int kernel_getsockname(struct socket *sock, struct sockaddr *addr);
+int kernel_getpeername(struct socket *sock, struct sockaddr *addr);
 int kernel_getsockopt(struct socket *sock, int level, int optname, char *optval,
                      int *optlen);
 int kernel_setsockopt(struct socket *sock, int level, int optname, char *optval,
index 5a54c9570977ea871c85847315b546e0addc4cb4..500f81375200d79690d629a102eafaf834079b93 100644 (file)
@@ -32,7 +32,7 @@ int inet_shutdown(struct socket *sock, int how);
 int inet_listen(struct socket *sock, int backlog);
 void inet_sock_destruct(struct sock *sk);
 int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len);
-int inet_getname(struct socket *sock, struct sockaddr *uaddr, int *uaddr_len,
+int inet_getname(struct socket *sock, struct sockaddr *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,
index 8606c9113d3f0870d84d8f8cdfc279f6d7033bd5..7a98cd583c73ca858342a230daf371f5169f23ff 100644 (file)
@@ -1056,7 +1056,7 @@ void ipv6_local_rxpmtu(struct sock *sk, struct flowi6 *fl6, u32 mtu);
 
 int inet6_release(struct socket *sock);
 int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len);
-int inet6_getname(struct socket *sock, struct sockaddr *uaddr, int *uaddr_len,
+int inet6_getname(struct socket *sock, struct sockaddr *uaddr,
                  int peer);
 int inet6_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);
 
index 169c92afcafa3d548f8238e91606b87c187559f4..3aa7b7d6e6c7faddf08a77f5c0844049b31d8442 100644 (file)
@@ -1584,7 +1584,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 *, int, bool);
-int sock_no_getname(struct socket *, struct sockaddr *, int *, int);
+int sock_no_getname(struct socket *, struct sockaddr *, int);
 __poll_t sock_no_poll(struct file *, struct socket *,
                          struct poll_table_struct *);
 int sock_no_ioctl(struct socket *, unsigned int, unsigned long);
index 03a9fc0771c084f04ad782c15a502bca13301e2b..9b6bc5abe94680c0a982b9193932f245080f2f85 100644 (file)
@@ -1238,7 +1238,7 @@ static int atalk_connect(struct socket *sock, struct sockaddr *uaddr,
  * fields into the sockaddr.
  */
 static int atalk_getname(struct socket *sock, struct sockaddr *uaddr,
-                        int *uaddr_len, int peer)
+                        int peer)
 {
        struct sockaddr_at sat;
        struct sock *sk = sock->sk;
@@ -1251,7 +1251,6 @@ static int atalk_getname(struct socket *sock, struct sockaddr *uaddr,
                if (atalk_autobind(sk) < 0)
                        goto out;
 
-       *uaddr_len = sizeof(struct sockaddr_at);
        memset(&sat, 0, sizeof(sat));
 
        if (peer) {
@@ -1268,9 +1267,9 @@ static int atalk_getname(struct socket *sock, struct sockaddr *uaddr,
                sat.sat_port        = at->src_port;
        }
 
-       err = 0;
        sat.sat_family = AF_APPLETALK;
        memcpy(uaddr, &sat, sizeof(sat));
+       err = sizeof(struct sockaddr_at);
 
 out:
        release_sock(sk);
index e1140b3bdcaa1984694b5b753732f4cb20cd1a6e..2cb10af16afcf8eeb925bfe1aab33e839821109a 100644 (file)
@@ -87,21 +87,20 @@ static int pvc_getsockopt(struct socket *sock, int level, int optname,
 }
 
 static int pvc_getname(struct socket *sock, struct sockaddr *sockaddr,
-                      int *sockaddr_len, int peer)
+                      int peer)
 {
        struct sockaddr_atmpvc *addr;
        struct atm_vcc *vcc = ATM_SD(sock);
 
        if (!vcc->dev || !test_bit(ATM_VF_ADDR, &vcc->flags))
                return -ENOTCONN;
-       *sockaddr_len = sizeof(struct sockaddr_atmpvc);
        addr = (struct sockaddr_atmpvc *)sockaddr;
        memset(addr, 0, sizeof(*addr));
        addr->sap_family = AF_ATMPVC;
        addr->sap_addr.itf = vcc->dev->number;
        addr->sap_addr.vpi = vcc->vpi;
        addr->sap_addr.vci = vcc->vci;
-       return 0;
+       return sizeof(struct sockaddr_atmpvc);
 }
 
 static const struct proto_ops pvc_proto_ops = {
index c458adcbc1770d8b2cf1d2e4352cbb1698d894b9..2f91b766ac423c97a0b9c1fd340222e31b17eefa 100644 (file)
@@ -419,15 +419,14 @@ static int svc_accept(struct socket *sock, struct socket *newsock, int flags,
 }
 
 static int svc_getname(struct socket *sock, struct sockaddr *sockaddr,
-                      int *sockaddr_len, int peer)
+                      int peer)
 {
        struct sockaddr_atmsvc *addr;
 
-       *sockaddr_len = sizeof(struct sockaddr_atmsvc);
        addr = (struct sockaddr_atmsvc *) sockaddr;
        memcpy(addr, peer ? &ATM_SD(sock)->remote : &ATM_SD(sock)->local,
               sizeof(struct sockaddr_atmsvc));
-       return 0;
+       return sizeof(struct sockaddr_atmsvc);
 }
 
 int svc_change_qos(struct atm_vcc *vcc, struct atm_qos *qos)
index 47fdd399626bf3bbe4aaeaa7c1332a066b078e8d..c8319ed48485ebfda00c640b93ebe1305266314e 100644 (file)
@@ -1388,7 +1388,7 @@ static int ax25_accept(struct socket *sock, struct socket *newsock, int flags,
 }
 
 static int ax25_getname(struct socket *sock, struct sockaddr *uaddr,
-       int *uaddr_len, int peer)
+       int peer)
 {
        struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)uaddr;
        struct sock *sk = sock->sk;
@@ -1427,7 +1427,7 @@ static int ax25_getname(struct socket *sock, struct sockaddr *uaddr,
                        fsa->fsa_digipeater[0] = null_ax25_address;
                }
        }
-       *uaddr_len = sizeof (struct full_sockaddr_ax25);
+       err = sizeof (struct full_sockaddr_ax25);
 
 out:
        release_sock(sk);
index 923e9a27187205e5ea6f07103a87b71e7c48e262..1506e1632394acf06e9f5873d045bd394e5b3059 100644 (file)
@@ -1340,7 +1340,7 @@ static int hci_sock_bind(struct socket *sock, struct sockaddr *addr,
 }
 
 static int hci_sock_getname(struct socket *sock, struct sockaddr *addr,
-                           int *addr_len, int peer)
+                           int peer)
 {
        struct sockaddr_hci *haddr = (struct sockaddr_hci *)addr;
        struct sock *sk = sock->sk;
@@ -1360,10 +1360,10 @@ static int hci_sock_getname(struct socket *sock, struct sockaddr *addr,
                goto done;
        }
 
-       *addr_len = sizeof(*haddr);
        haddr->hci_family = AF_BLUETOOTH;
        haddr->hci_dev    = hdev->id;
        haddr->hci_channel= hci_pi(sk)->channel;
+       err = sizeof(*haddr);
 
 done:
        release_sock(sk);
index 67a8642f57ea7c8ceadc1d379019ea6135877068..686bdc6b35b03d1fd0965dc0fd76c5edde78c1eb 100644 (file)
@@ -358,7 +358,7 @@ static int l2cap_sock_accept(struct socket *sock, struct socket *newsock,
 }
 
 static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr,
-                             int *len, int peer)
+                             int peer)
 {
        struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr;
        struct sock *sk = sock->sk;
@@ -373,7 +373,6 @@ static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr,
 
        memset(la, 0, sizeof(struct sockaddr_l2));
        addr->sa_family = AF_BLUETOOTH;
-       *len = sizeof(struct sockaddr_l2);
 
        la->l2_psm = chan->psm;
 
@@ -387,7 +386,7 @@ static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr,
                la->l2_bdaddr_type = chan->src_type;
        }
 
-       return 0;
+       return sizeof(struct sockaddr_l2);
 }
 
 static int l2cap_sock_getsockopt_old(struct socket *sock, int optname,
index 1aaccf63747937bb1f335c1490bae29c9ff898e7..93a3b219db09738a0a27a45b002ea7c60fd1896e 100644 (file)
@@ -533,7 +533,7 @@ static int rfcomm_sock_accept(struct socket *sock, struct socket *newsock, int f
        return err;
 }
 
-static int rfcomm_sock_getname(struct socket *sock, struct sockaddr *addr, int *len, int peer)
+static int rfcomm_sock_getname(struct socket *sock, struct sockaddr *addr, int peer)
 {
        struct sockaddr_rc *sa = (struct sockaddr_rc *) addr;
        struct sock *sk = sock->sk;
@@ -552,8 +552,7 @@ static int rfcomm_sock_getname(struct socket *sock, struct sockaddr *addr, int *
        else
                bacpy(&sa->rc_bdaddr, &rfcomm_pi(sk)->src);
 
-       *len = sizeof(struct sockaddr_rc);
-       return 0;
+       return sizeof(struct sockaddr_rc);
 }
 
 static int rfcomm_sock_sendmsg(struct socket *sock, struct msghdr *msg,
index 08df57665e1ff62fd3714598c5911833fe24a55b..413b8ee49feca325dea79e328c11b8ba00afbce3 100644 (file)
@@ -680,7 +680,7 @@ static int sco_sock_accept(struct socket *sock, struct socket *newsock,
 }
 
 static int sco_sock_getname(struct socket *sock, struct sockaddr *addr,
-                           int *len, int peer)
+                           int peer)
 {
        struct sockaddr_sco *sa = (struct sockaddr_sco *) addr;
        struct sock *sk = sock->sk;
@@ -688,14 +688,13 @@ static int sco_sock_getname(struct socket *sock, struct sockaddr *addr,
        BT_DBG("sock %p, sk %p", sock, sk);
 
        addr->sa_family = AF_BLUETOOTH;
-       *len = sizeof(struct sockaddr_sco);
 
        if (peer)
                bacpy(&sa->sco_bdaddr, &sco_pi(sk)->dst);
        else
                bacpy(&sa->sco_bdaddr, &sco_pi(sk)->src);
 
-       return 0;
+       return sizeof(struct sockaddr_sco);
 }
 
 static int sco_sock_sendmsg(struct socket *sock, struct msghdr *msg,
index f2ecc43376a15993463401770d3ef41ca4cc3a33..1051eee8258184f33d15a6142ee8b387839c9adc 100644 (file)
@@ -470,7 +470,7 @@ static int raw_bind(struct socket *sock, struct sockaddr *uaddr, int len)
 }
 
 static int raw_getname(struct socket *sock, struct sockaddr *uaddr,
-                      int *len, int peer)
+                      int peer)
 {
        struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
        struct sock *sk = sock->sk;
@@ -483,9 +483,7 @@ static int raw_getname(struct socket *sock, struct sockaddr *uaddr,
        addr->can_family  = AF_CAN;
        addr->can_ifindex = ro->ifindex;
 
-       *len = sizeof(*addr);
-
-       return 0;
+       return sizeof(*addr);
 }
 
 static int raw_setsockopt(struct socket *sock, int level, int optname,
index c501499a04fe973e80e18655b306d762d348ff44..04e5e27c9b81d6a0c46c868cbdd58106a11085e4 100644 (file)
@@ -1274,7 +1274,8 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
        {
                char address[128];
 
-               if (sock->ops->getname(sock, (struct sockaddr *)address, &lv, 2))
+               lv = sock->ops->getname(sock, (struct sockaddr *)address, 2);
+               if (lv < 0)
                        return -ENOTCONN;
                if (lv < len)
                        return -EINVAL;
@@ -2497,7 +2498,7 @@ int sock_no_accept(struct socket *sock, struct socket *newsock, int flags,
 EXPORT_SYMBOL(sock_no_accept);
 
 int sock_no_getname(struct socket *sock, struct sockaddr *saddr,
-                   int *len, int peer)
+                   int peer)
 {
        return -EOPNOTSUPP;
 }
index 91dd09f798089e1a1144579f128e5c6dae3a9c0e..45cb5bea884ba349f86cf5360c1386e349159491 100644 (file)
@@ -1180,14 +1180,12 @@ static int dn_accept(struct socket *sock, struct socket *newsock, int flags,
 }
 
 
-static int dn_getname(struct socket *sock, struct sockaddr *uaddr,int *uaddr_len,int peer)
+static int dn_getname(struct socket *sock, struct sockaddr *uaddr,int peer)
 {
        struct sockaddr_dn *sa = (struct sockaddr_dn *)uaddr;
        struct sock *sk = sock->sk;
        struct dn_scp *scp = DN_SK(sk);
 
-       *uaddr_len = sizeof(struct sockaddr_dn);
-
        lock_sock(sk);
 
        if (peer) {
@@ -1205,7 +1203,7 @@ static int dn_getname(struct socket *sock, struct sockaddr *uaddr,int *uaddr_len
 
        release_sock(sk);
 
-       return 0;
+       return sizeof(struct sockaddr_dn);
 }
 
 
index e4329e161943636e1cb3a705fd1c2afb6c74026b..f98e2f0db841b1ff9c75ab7cab2f7e95c0e20654 100644 (file)
@@ -723,7 +723,7 @@ EXPORT_SYMBOL(inet_accept);
  *     This does both peername and sockname.
  */
 int inet_getname(struct socket *sock, struct sockaddr *uaddr,
-                       int *uaddr_len, int peer)
+                       int peer)
 {
        struct sock *sk         = sock->sk;
        struct inet_sock *inet  = inet_sk(sk);
@@ -745,8 +745,7 @@ int inet_getname(struct socket *sock, struct sockaddr *uaddr,
                sin->sin_addr.s_addr = addr;
        }
        memset(sin->sin_zero, 0, sizeof(sin->sin_zero));
-       *uaddr_len = sizeof(*sin);
-       return 0;
+       return sizeof(*sin);
 }
 EXPORT_SYMBOL(inet_getname);
 
index 416917719a6f25065279ab4eede03804443cd9c6..c1e292db04db649821ae5accdd6d3c108983cb95 100644 (file)
@@ -470,7 +470,7 @@ EXPORT_SYMBOL_GPL(inet6_destroy_sock);
  */
 
 int inet6_getname(struct socket *sock, struct sockaddr *uaddr,
-                int *uaddr_len, int peer)
+                int peer)
 {
        struct sockaddr_in6 *sin = (struct sockaddr_in6 *)uaddr;
        struct sock *sk = sock->sk;
@@ -500,8 +500,7 @@ int inet6_getname(struct socket *sock, struct sockaddr *uaddr,
        }
        sin->sin6_scope_id = ipv6_iface_scope_id(&sin->sin6_addr,
                                                 sk->sk_bound_dev_if);
-       *uaddr_len = sizeof(*sin);
-       return 0;
+       return sizeof(*sin);
 }
 EXPORT_SYMBOL(inet6_getname);
 
index 1e8cc7bcbca3a4fe830b7668fd9b143988e4fb46..81ce15ffb8783d787fbf3db60bf676136669e5ae 100644 (file)
@@ -989,14 +989,13 @@ static int iucv_sock_accept(struct socket *sock, struct socket *newsock,
 }
 
 static int iucv_sock_getname(struct socket *sock, struct sockaddr *addr,
-                            int *len, int peer)
+                            int peer)
 {
        struct sockaddr_iucv *siucv = (struct sockaddr_iucv *) addr;
        struct sock *sk = sock->sk;
        struct iucv_sock *iucv = iucv_sk(sk);
 
        addr->sa_family = AF_IUCV;
-       *len = sizeof(struct sockaddr_iucv);
 
        if (peer) {
                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,
        memset(&siucv->siucv_addr, 0, sizeof(siucv->siucv_addr));
        memset(&siucv->siucv_nodeid, 0, sizeof(siucv->siucv_nodeid));
 
-       return 0;
+       return sizeof(struct sockaddr_iucv);
 }
 
 /**
index ff61124fdf593ff14116179a2564aaec6173ef07..4614585e172071fb1eea1d7f08115fa8049f86b3 100644 (file)
@@ -349,7 +349,7 @@ static int l2tp_ip_disconnect(struct sock *sk, int flags)
 }
 
 static int l2tp_ip_getname(struct socket *sock, struct sockaddr *uaddr,
-                          int *uaddr_len, int peer)
+                          int peer)
 {
        struct sock *sk         = sock->sk;
        struct inet_sock *inet  = inet_sk(sk);
@@ -370,8 +370,7 @@ static int l2tp_ip_getname(struct socket *sock, struct sockaddr *uaddr,
                lsa->l2tp_conn_id = lsk->conn_id;
                lsa->l2tp_addr.s_addr = addr;
        }
-       *uaddr_len = sizeof(*lsa);
-       return 0;
+       return sizeof(*lsa);
 }
 
 static int l2tp_ip_backlog_recv(struct sock *sk, struct sk_buff *skb)
index 192344688c06b9fe0f921f5612ad6f9b32d56b85..efea58b662953eb7e81ae18523a0b2e35bd15da8 100644 (file)
@@ -421,7 +421,7 @@ static int l2tp_ip6_disconnect(struct sock *sk, int flags)
 }
 
 static int l2tp_ip6_getname(struct socket *sock, struct sockaddr *uaddr,
-                           int *uaddr_len, int peer)
+                           int peer)
 {
        struct sockaddr_l2tpip6 *lsa = (struct sockaddr_l2tpip6 *)uaddr;
        struct sock *sk = sock->sk;
@@ -449,8 +449,7 @@ static int l2tp_ip6_getname(struct socket *sock, struct sockaddr *uaddr,
        }
        if (ipv6_addr_type(&lsa->l2tp_addr) & IPV6_ADDR_LINKLOCAL)
                lsa->l2tp_scope_id = sk->sk_bound_dev_if;
-       *uaddr_len = sizeof(*lsa);
-       return 0;
+       return sizeof(*lsa);
 }
 
 static int l2tp_ip6_backlog_recv(struct sock *sk, struct sk_buff *skb)
index 59f246d7b2906a1fcf53d76bc6f020dd9b2462b1..99a03c72db4f8d9af4043945d2a618da3b198726 100644 (file)
@@ -870,7 +870,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,
-                           int *usockaddr_len, int peer)
+                           int peer)
 {
        int len = 0;
        int error = 0;
@@ -969,8 +969,7 @@ static int pppol2tp_getname(struct socket *sock, struct sockaddr *uaddr,
                memcpy(uaddr, &sp, len);
        }
 
-       *usockaddr_len = len;
-       error = 0;
+       error = len;
 
        sock_put(sk);
 end:
index c38d16f22d2a7ff265b8729d43b164312598fd9f..01dcc0823d1fd6b94357518a53aaa7cab4308cc8 100644 (file)
@@ -971,7 +971,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,
-                         int *uaddrlen, int peer)
+                         int peer)
 {
        struct sockaddr_llc sllc;
        struct sock *sk = sock->sk;
@@ -982,7 +982,6 @@ static int llc_ui_getname(struct socket *sock, struct sockaddr *uaddr,
        lock_sock(sk);
        if (sock_flag(sk, SOCK_ZAPPED))
                goto out;
-       *uaddrlen = sizeof(sllc);
        if (peer) {
                rc = -ENOTCONN;
                if (sk->sk_state != TCP_ESTABLISHED)
@@ -1003,9 +1002,9 @@ static int llc_ui_getname(struct socket *sock, struct sockaddr *uaddr,
                               IFHWADDRLEN);
                }
        }
-       rc = 0;
        sllc.sllc_family = AF_LLC;
        memcpy(uaddr, &sllc, sizeof(sllc));
+       rc = sizeof(sllc);
 out:
        release_sock(sk);
        return rc;
index 2ad445c1d27ccda471132e035229188b77a579eb..3c8af14330b50f39266129ba9622df4a22ce007b 100644 (file)
@@ -1105,7 +1105,7 @@ static int netlink_connect(struct socket *sock, struct sockaddr *addr,
 }
 
 static int netlink_getname(struct socket *sock, struct sockaddr *addr,
-                          int *addr_len, int peer)
+                          int peer)
 {
        struct sock *sk = sock->sk;
        struct netlink_sock *nlk = nlk_sk(sk);
@@ -1113,7 +1113,6 @@ static int netlink_getname(struct socket *sock, struct sockaddr *addr,
 
        nladdr->nl_family = AF_NETLINK;
        nladdr->nl_pad = 0;
-       *addr_len = sizeof(*nladdr);
 
        if (peer) {
                nladdr->nl_pid = nlk->dst_portid;
@@ -1124,7 +1123,7 @@ static int netlink_getname(struct socket *sock, struct sockaddr *addr,
                nladdr->nl_groups = nlk->groups ? nlk->groups[0] : 0;
                netlink_unlock_table();
        }
-       return 0;
+       return sizeof(*nladdr);
 }
 
 static int netlink_ioctl(struct socket *sock, unsigned int cmd,
index 9ba30c63be3d9d6dfbf56e1740e4787b319f4d77..35bb6807927feaea11fe2eb2189be32bc69f9658 100644 (file)
@@ -829,11 +829,12 @@ static int nr_accept(struct socket *sock, struct socket *newsock, int flags,
 }
 
 static int nr_getname(struct socket *sock, struct sockaddr *uaddr,
-       int *uaddr_len, int peer)
+       int peer)
 {
        struct full_sockaddr_ax25 *sax = (struct full_sockaddr_ax25 *)uaddr;
        struct sock *sk = sock->sk;
        struct nr_sock *nr = nr_sk(sk);
+       int uaddr_len;
 
        memset(&sax->fsa_ax25, 0, sizeof(struct sockaddr_ax25));
 
@@ -848,16 +849,16 @@ static int nr_getname(struct socket *sock, struct sockaddr *uaddr,
                sax->fsa_ax25.sax25_call   = nr->user_addr;
                memset(sax->fsa_digipeater, 0, sizeof(sax->fsa_digipeater));
                sax->fsa_digipeater[0]     = nr->dest_addr;
-               *uaddr_len = sizeof(struct full_sockaddr_ax25);
+               uaddr_len = sizeof(struct full_sockaddr_ax25);
        } else {
                sax->fsa_ax25.sax25_family = AF_NETROM;
                sax->fsa_ax25.sax25_ndigis = 0;
                sax->fsa_ax25.sax25_call   = nr->source_addr;
-               *uaddr_len = sizeof(struct sockaddr_ax25);
+               uaddr_len = sizeof(struct sockaddr_ax25);
        }
        release_sock(sk);
 
-       return 0;
+       return uaddr_len;
 }
 
 int nr_rx_frame(struct sk_buff *skb, struct net_device *dev)
index 376040092142d335a6e09e27faf6190fad73aef5..ea0c0c6f187429426f4849347c09b847f0111fff 100644 (file)
@@ -497,7 +497,7 @@ static int llcp_sock_accept(struct socket *sock, struct socket *newsock,
 }
 
 static int llcp_sock_getname(struct socket *sock, struct sockaddr *uaddr,
-                            int *len, int peer)
+                            int peer)
 {
        struct sock *sk = sock->sk;
        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,
                 llcp_sock->dsap, llcp_sock->ssap);
 
        memset(llcp_addr, 0, sizeof(*llcp_addr));
-       *len = sizeof(struct sockaddr_nfc_llcp);
 
        lock_sock(sk);
        if (!llcp_sock->dev) {
@@ -528,7 +527,7 @@ static int llcp_sock_getname(struct socket *sock, struct sockaddr *uaddr,
               llcp_addr->service_name_len);
        release_sock(sk);
 
-       return 0;
+       return sizeof(struct sockaddr_nfc_llcp);
 }
 
 static inline __poll_t llcp_accept_poll(struct sock *parent)
index e0f3f4aeeb4fb93b253f2487cfb3cf7c484dbd7c..616cb9c18f88edd759dfb461051670c225978afa 100644 (file)
@@ -3409,7 +3409,7 @@ static int packet_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
 }
 
 static int packet_getname_spkt(struct socket *sock, struct sockaddr *uaddr,
-                              int *uaddr_len, int peer)
+                              int peer)
 {
        struct net_device *dev;
        struct sock *sk = sock->sk;
@@ -3424,13 +3424,12 @@ static int packet_getname_spkt(struct socket *sock, struct sockaddr *uaddr,
        if (dev)
                strlcpy(uaddr->sa_data, dev->name, sizeof(uaddr->sa_data));
        rcu_read_unlock();
-       *uaddr_len = sizeof(*uaddr);
 
-       return 0;
+       return sizeof(*uaddr);
 }
 
 static int packet_getname(struct socket *sock, struct sockaddr *uaddr,
-                         int *uaddr_len, int peer)
+                         int peer)
 {
        struct net_device *dev;
        struct sock *sk = sock->sk;
@@ -3455,9 +3454,8 @@ static int packet_getname(struct socket *sock, struct sockaddr *uaddr,
                sll->sll_halen = 0;
        }
        rcu_read_unlock();
-       *uaddr_len = offsetof(struct sockaddr_ll, sll_addr) + sll->sll_halen;
 
-       return 0;
+       return offsetof(struct sockaddr_ll, sll_addr) + sll->sll_halen;
 }
 
 static int packet_dev_mc(struct net_device *dev, struct packet_mclist *i,
index fffcd69f63ff4d10b5471348b130052fc491d852..f9b40e6a18a5ff14f353511465703a9f6ad18baa 100644 (file)
@@ -326,7 +326,7 @@ static int pn_socket_accept(struct socket *sock, struct socket *newsock,
 }
 
 static int pn_socket_getname(struct socket *sock, struct sockaddr *addr,
-                               int *sockaddr_len, int peer)
+                               int peer)
 {
        struct sock *sk = sock->sk;
        struct pn_sock *pn = pn_sk(sk);
@@ -337,8 +337,7 @@ static int pn_socket_getname(struct socket *sock, struct sockaddr *addr,
                pn_sockaddr_set_object((struct sockaddr_pn *)addr,
                                        pn->sobject);
 
-       *sockaddr_len = sizeof(struct sockaddr_pn);
-       return 0;
+       return sizeof(struct sockaddr_pn);
 }
 
 static __poll_t pn_socket_poll(struct file *file, struct socket *sock,
index 5fb3929e3d7d26cce02b2b866f3445e7123e15e0..b33e5aeb4c06d30b9c576ed2c2adb9a1915c9492 100644 (file)
@@ -893,7 +893,7 @@ static int qrtr_connect(struct socket *sock, struct sockaddr *saddr,
 }
 
 static int qrtr_getname(struct socket *sock, struct sockaddr *saddr,
-                       int *len, int peer)
+                       int peer)
 {
        struct qrtr_sock *ipc = qrtr_sk(sock->sk);
        struct sockaddr_qrtr qaddr;
@@ -912,12 +912,11 @@ static int qrtr_getname(struct socket *sock, struct sockaddr *saddr,
        }
        release_sock(sk);
 
-       *len = sizeof(qaddr);
        qaddr.sq_family = AF_QIPCRTR;
 
        memcpy(saddr, &qaddr, sizeof(qaddr));
 
-       return 0;
+       return sizeof(qaddr);
 }
 
 static int qrtr_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
index 744c637c86b01b68ce52fd8f5453f2d2b88beeb1..0a8eefd256b3e7af8e4cb58a4729924752a4391b 100644 (file)
@@ -110,7 +110,7 @@ void rds_wake_sk_sleep(struct rds_sock *rs)
 }
 
 static int rds_getname(struct socket *sock, struct sockaddr *uaddr,
-                      int *uaddr_len, int peer)
+                      int peer)
 {
        struct sockaddr_in *sin = (struct sockaddr_in *)uaddr;
        struct rds_sock *rs = rds_sk_to_rs(sock->sk);
@@ -131,8 +131,7 @@ static int rds_getname(struct socket *sock, struct sockaddr *uaddr,
 
        sin->sin_family = AF_INET;
 
-       *uaddr_len = sizeof(*sin);
-       return 0;
+       return sizeof(*sin);
 }
 
 /*
index 44c4652721af23a0f2d6a3486495310755515350..08230a1450427c031bccae1920cdc461f593e10c 100644 (file)
@@ -227,7 +227,6 @@ static void rds_tcp_tc_info(struct socket *rds_sock, unsigned int len,
        struct rds_tcp_connection *tc;
        unsigned long flags;
        struct sockaddr_in sin;
-       int sinlen;
        struct socket *sock;
 
        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,
 
                sock = tc->t_sock;
                if (sock) {
-                       sock->ops->getname(sock, (struct sockaddr *)&sin,
-                                          &sinlen, 0);
+                       sock->ops->getname(sock, (struct sockaddr *)&sin, 0);
                        tsinfo.local_addr = sin.sin_addr.s_addr;
                        tsinfo.local_port = sin.sin_port;
-                       sock->ops->getname(sock, (struct sockaddr *)&sin,
-                                          &sinlen, 1);
+                       sock->ops->getname(sock, (struct sockaddr *)&sin, 1);
                        tsinfo.peer_addr = sin.sin_addr.s_addr;
                        tsinfo.peer_port = sin.sin_port;
                }
index 083bd251406fa6269ee2bca6d0fc528e1f19297f..5170373b797c6a4945b4403c2d59828d1d800360 100644 (file)
@@ -938,7 +938,7 @@ static int rose_accept(struct socket *sock, struct socket *newsock, int flags,
 }
 
 static int rose_getname(struct socket *sock, struct sockaddr *uaddr,
-       int *uaddr_len, int peer)
+       int peer)
 {
        struct full_sockaddr_rose *srose = (struct full_sockaddr_rose *)uaddr;
        struct sock *sk = sock->sk;
@@ -964,8 +964,7 @@ static int rose_getname(struct socket *sock, struct sockaddr *uaddr,
                        srose->srose_digis[n] = rose->source_digis[n];
        }
 
-       *uaddr_len = sizeof(struct full_sockaddr_rose);
-       return 0;
+       return sizeof(struct full_sockaddr_rose);
 }
 
 int rose_rx_call_request(struct sk_buff *skb, struct net_device *dev, struct rose_neigh *neigh, unsigned int lci)
index e35d4f73d2dffffea6d966714ce7f011b3fdeae5..0d873c58e5167a8855d62de14d88dc738bc70e48 100644 (file)
@@ -952,16 +952,16 @@ 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,
-                       int *uaddr_len, int peer)
+                       int peer)
 {
        int rc;
 
-       rc = inet6_getname(sock, uaddr, uaddr_len, peer);
+       rc = inet6_getname(sock, uaddr, peer);
 
-       if (rc != 0)
+       if (rc < 0)
                return rc;
 
-       *uaddr_len = sctp_v6_addr_to_user(sctp_sk(sock->sk),
+       rc = sctp_v6_addr_to_user(sctp_sk(sock->sk),
                                          (union sctp_addr *)uaddr);
 
        return rc;
index da1a5cdefd13e96ac4acbec1a891a73af09dfa77..38ae22b65e778b7f9d4e3cc0afa4f0c98c211479 100644 (file)
@@ -281,7 +281,6 @@ int smc_netinfo_by_tcpsk(struct socket *clcsock,
        struct in_device *in_dev;
        struct sockaddr_in addr;
        int rc = -ENOENT;
-       int len;
 
        if (!dst) {
                rc = -ENOTCONN;
@@ -293,7 +292,7 @@ int smc_netinfo_by_tcpsk(struct socket *clcsock,
        }
 
        /* get address to which the internal TCP socket is bound */
-       kernel_getsockname(clcsock, (struct sockaddr *)&addr, &len);
+       kernel_getsockname(clcsock, (struct sockaddr *)&addr);
        /* analyze IPv4 specific data of net_device belonging to TCP socket */
        rcu_read_lock();
        in_dev = __in_dev_get_rcu(dst->dev);
@@ -771,7 +770,7 @@ static void smc_listen_work(struct work_struct *work)
        u8 buf[SMC_CLC_MAX_LEN];
        struct smc_link *link;
        int reason_code = 0;
-       int rc = 0, len;
+       int rc = 0;
        __be32 subnet;
        u8 prefix_len;
        u8 ibport;
@@ -824,7 +823,7 @@ static void smc_listen_work(struct work_struct *work)
        }
 
        /* get address of the peer connected to the internal TCP socket */
-       kernel_getpeername(newclcsock, (struct sockaddr *)&peeraddr, &len);
+       kernel_getpeername(newclcsock, (struct sockaddr *)&peeraddr);
 
        /* allocate connection / link group */
        mutex_lock(&smc_create_lgr_pending);
@@ -1075,7 +1074,7 @@ static int smc_accept(struct socket *sock, struct socket *new_sock,
 }
 
 static int smc_getname(struct socket *sock, struct sockaddr *addr,
-                      int *len, int peer)
+                      int peer)
 {
        struct smc_sock *smc;
 
@@ -1085,7 +1084,7 @@ static int smc_getname(struct socket *sock, struct sockaddr *addr,
 
        smc = smc_sk(sock->sk);
 
-       return smc->clcsock->ops->getname(smc->clcsock, addr, len, peer);
+       return smc->clcsock->ops->getname(smc->clcsock, addr, peer);
 }
 
 static int smc_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
index a93c99b518cab69b67d53a71298d15ce17c4d06b..fac8246a8ae8ee9e839ad2047dea10bc81ea8eca 100644 (file)
@@ -1573,8 +1573,9 @@ SYSCALL_DEFINE4(accept4, int, fd, struct sockaddr __user *, upeer_sockaddr,
                goto out_fd;
 
        if (upeer_sockaddr) {
-               if (newsock->ops->getname(newsock, (struct sockaddr *)&address,
-                                         &len, 2) < 0) {
+               len = newsock->ops->getname(newsock,
+                                       (struct sockaddr *)&address, 2);
+               if (len < 0) {
                        err = -ECONNABORTED;
                        goto out_fd;
                }
@@ -1654,7 +1655,7 @@ SYSCALL_DEFINE3(getsockname, int, fd, struct sockaddr __user *, usockaddr,
 {
        struct socket *sock;
        struct sockaddr_storage address;
-       int len, err, fput_needed;
+       int err, fput_needed;
 
        sock = sockfd_lookup_light(fd, &err, &fput_needed);
        if (!sock)
@@ -1664,10 +1665,11 @@ SYSCALL_DEFINE3(getsockname, int, fd, struct sockaddr __user *, usockaddr,
        if (err)
                goto out_put;
 
-       err = sock->ops->getname(sock, (struct sockaddr *)&address, &len, 0);
-       if (err)
+       err = sock->ops->getname(sock, (struct sockaddr *)&address, 0);
+       if (err < 0)
                goto out_put;
-       err = move_addr_to_user(&address, len, usockaddr, usockaddr_len);
+        /* "err" is actually length in this case */
+       err = move_addr_to_user(&address, err, usockaddr, usockaddr_len);
 
 out_put:
        fput_light(sock->file, fput_needed);
@@ -1685,7 +1687,7 @@ SYSCALL_DEFINE3(getpeername, int, fd, struct sockaddr __user *, usockaddr,
 {
        struct socket *sock;
        struct sockaddr_storage address;
-       int len, err, fput_needed;
+       int err, fput_needed;
 
        sock = sockfd_lookup_light(fd, &err, &fput_needed);
        if (sock != NULL) {
@@ -1695,11 +1697,10 @@ SYSCALL_DEFINE3(getpeername, int, fd, struct sockaddr __user *, usockaddr,
                        return err;
                }
 
-               err =
-                   sock->ops->getname(sock, (struct sockaddr *)&address, &len,
-                                      1);
-               if (!err)
-                       err = move_addr_to_user(&address, len, usockaddr,
+               err = sock->ops->getname(sock, (struct sockaddr *)&address, 1);
+               if (err >= 0)
+                       /* "err" is actually length in this case */
+                       err = move_addr_to_user(&address, err, usockaddr,
                                                usockaddr_len);
                fput_light(sock->file, fput_needed);
        }
@@ -3166,17 +3167,15 @@ int kernel_connect(struct socket *sock, struct sockaddr *addr, int addrlen,
 }
 EXPORT_SYMBOL(kernel_connect);
 
-int kernel_getsockname(struct socket *sock, struct sockaddr *addr,
-                        int *addrlen)
+int kernel_getsockname(struct socket *sock, struct sockaddr *addr)
 {
-       return sock->ops->getname(sock, addr, addrlen, 0);
+       return sock->ops->getname(sock, addr, 0);
 }
 EXPORT_SYMBOL(kernel_getsockname);
 
-int kernel_getpeername(struct socket *sock, struct sockaddr *addr,
-                        int *addrlen)
+int kernel_getpeername(struct socket *sock, struct sockaddr *addr)
 {
-       return sock->ops->getname(sock, addr, addrlen, 1);
+       return sock->ops->getname(sock, addr, 1);
 }
 EXPORT_SYMBOL(kernel_getpeername);
 
index 6e432ecd7f99d1f23762a913c194f9311093c6c5..806395687bb661ab570b7dbc20858edba12ca931 100644 (file)
@@ -1231,7 +1231,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, int buflen)
+                       struct sockaddr *buf)
 {
        struct socket *sock;
        int err;
@@ -1269,7 +1269,7 @@ static int rpc_sockname(struct net *net, struct sockaddr *sap, size_t salen,
                goto out_release;
        }
 
-       err = kernel_getsockname(sock, buf, &buflen);
+       err = kernel_getsockname(sock, buf);
        if (err < 0) {
                dprintk("RPC:       getsockname failed (%d)\n", err);
                goto out_release;
@@ -1353,7 +1353,7 @@ int rpc_localaddr(struct rpc_clnt *clnt, struct sockaddr *buf, size_t buflen)
        rcu_read_unlock();
 
        rpc_set_port(sap, 0);
-       err = rpc_sockname(net, sap, salen, buf, buflen);
+       err = rpc_sockname(net, sap, salen, buf);
        put_net(net);
        if (err != 0)
                /* Couldn't discover local address, return ANYADDR */
index 943f2a745cd500a46988db079ec426691f2cb5c2..08cd951aaeeae8e1d1cca3cfa90513699496c9bb 100644 (file)
@@ -832,12 +832,13 @@ 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, &slen);
+       err = kernel_getpeername(newsock, sin);
        if (err < 0) {
                net_warn_ratelimited("%s: peername failed (err %d)!\n",
                                     serv->sv_name, -err);
                goto failed;            /* aborted connection or whatever */
        }
+       slen = err;
 
        /* Ideally, we would want to reject connections from unauthorized
         * 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)
        if (IS_ERR(newsvsk))
                goto failed;
        svc_xprt_set_remote(&newsvsk->sk_xprt, sin, slen);
-       err = kernel_getsockname(newsock, sin, &slen);
+       err = kernel_getsockname(newsock, sin);
+       slen = err;
        if (unlikely(err < 0)) {
                dprintk("svc_tcp_accept: kernel_getsockname error %d\n", -err);
                slen = offsetof(struct sockaddr, sa_data);
@@ -1465,7 +1467,8 @@ int svc_addsock(struct svc_serv *serv, const int fd, char *name_return,
                err = PTR_ERR(svsk);
                goto out;
        }
-       if (kernel_getsockname(svsk->sk_sock, sin, &salen) == 0)
+       salen = kernel_getsockname(svsk->sk_sock, sin);
+       if (salen >= 0)
                svc_xprt_set_local(&svsk->sk_xprt, sin, salen);
        svc_add_new_perm_xprt(serv, &svsk->sk_xprt);
        return svc_one_sock_name(svsk, name_return, len);
@@ -1539,10 +1542,10 @@ static struct svc_xprt *svc_create_socket(struct svc_serv *serv,
        if (error < 0)
                goto bummer;
 
-       newlen = len;
-       error = kernel_getsockname(sock, newsin, &newlen);
+       error = kernel_getsockname(sock, newsin);
        if (error < 0)
                goto bummer;
+       newlen = error;
 
        if (protocol == IPPROTO_TCP) {
                if ((error = kernel_listen(sock, 64)) < 0)
index a6b8c1f8f92a815db5fcce32c78b4355dc308c03..956e29c1438d504261f1ba4cd116c150ca74aa76 100644 (file)
@@ -1794,10 +1794,9 @@ static void xs_sock_set_reuseport(struct socket *sock)
 static unsigned short xs_sock_getport(struct socket *sock)
 {
        struct sockaddr_storage buf;
-       int buflen;
        unsigned short port = 0;
 
-       if (kernel_getsockname(sock, (struct sockaddr *)&buf, &buflen) < 0)
+       if (kernel_getsockname(sock, (struct sockaddr *)&buf) < 0)
                goto out;
        switch (buf.ss_family) {
        case AF_INET6:
index b0323ec7971ed04cca532674fc85e9882f03c373..f93477187a9081ed79f1bbda19769a1ea8a84833 100644 (file)
@@ -665,7 +665,7 @@ static int tipc_bind(struct socket *sock, struct sockaddr *uaddr,
  *       a completely predictable manner).
  */
 static int tipc_getname(struct socket *sock, struct sockaddr *uaddr,
-                       int *uaddr_len, int peer)
+                       int peer)
 {
        struct sockaddr_tipc *addr = (struct sockaddr_tipc *)uaddr;
        struct sock *sk = sock->sk;
@@ -684,13 +684,12 @@ static int tipc_getname(struct socket *sock, struct sockaddr *uaddr,
                addr->addr.id.node = tn->own_addr;
        }
 
-       *uaddr_len = sizeof(*addr);
        addr->addrtype = TIPC_ADDR_ID;
        addr->family = AF_TIPC;
        addr->scope = 0;
        addr->addr.name.domain = 0;
 
-       return 0;
+       return sizeof(*addr);
 }
 
 /**
index d545e1d0dea22cf15426c73224a8ce38855f202b..7236984162422d31435c7ed4b8cf44fbceb745fb 100644 (file)
@@ -637,7 +637,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 *, int, bool);
-static int unix_getname(struct socket *, struct sockaddr *, int *, int);
+static int unix_getname(struct socket *, struct sockaddr *, int);
 static __poll_t unix_poll(struct file *, struct socket *, poll_table *);
 static __poll_t unix_dgram_poll(struct file *, struct socket *,
                                    poll_table *);
@@ -1453,7 +1453,7 @@ static int unix_accept(struct socket *sock, struct socket *newsock, int flags,
 }
 
 
-static int unix_getname(struct socket *sock, struct sockaddr *uaddr, int *uaddr_len, int peer)
+static int unix_getname(struct socket *sock, struct sockaddr *uaddr, int peer)
 {
        struct sock *sk = sock->sk;
        struct unix_sock *u;
@@ -1476,12 +1476,12 @@ static int unix_getname(struct socket *sock, struct sockaddr *uaddr, int *uaddr_
        if (!u->addr) {
                sunaddr->sun_family = AF_UNIX;
                sunaddr->sun_path[0] = 0;
-               *uaddr_len = sizeof(short);
+               err = sizeof(short);
        } else {
                struct unix_address *addr = u->addr;
 
-               *uaddr_len = addr->len;
-               memcpy(sunaddr, addr->name, *uaddr_len);
+               err = addr->len;
+               memcpy(sunaddr, addr->name, addr->len);
        }
        unix_state_unlock(sk);
        sock_put(sk);
index e0fc84daed944b7753a11b8d8629a78380425414..aac9b8f6552e670c2fef8d7c77c90618c65a7fc8 100644 (file)
@@ -759,7 +759,7 @@ vsock_bind(struct socket *sock, struct sockaddr *addr, int addr_len)
 }
 
 static int vsock_getname(struct socket *sock,
-                        struct sockaddr *addr, int *addr_len, int peer)
+                        struct sockaddr *addr, int peer)
 {
        int err;
        struct sock *sk;
@@ -794,7 +794,7 @@ static int vsock_getname(struct socket *sock,
         */
        BUILD_BUG_ON(sizeof(*vm_addr) > 128);
        memcpy(addr, vm_addr, sizeof(*vm_addr));
-       *addr_len = sizeof(*vm_addr);
+       err = sizeof(*vm_addr);
 
 out:
        release_sock(sk);
index 562cc11131f6c8ba37cb5e4e09b1587dca3c8a2c..d49aa79b79970d403b5c165d4000b2aa1d493442 100644 (file)
@@ -896,7 +896,7 @@ static int x25_accept(struct socket *sock, struct socket *newsock, int flags,
 }
 
 static int x25_getname(struct socket *sock, struct sockaddr *uaddr,
-                      int *uaddr_len, int peer)
+                      int peer)
 {
        struct sockaddr_x25 *sx25 = (struct sockaddr_x25 *)uaddr;
        struct sock *sk = sock->sk;
@@ -913,7 +913,7 @@ static int x25_getname(struct socket *sock, struct sockaddr *uaddr,
                sx25->sx25_addr = x25->source_addr;
 
        sx25->sx25_family = AF_X25;
-       *uaddr_len = sizeof(*sx25);
+       rc = sizeof(*sx25);
 
 out:
        return rc;
index cd6932e5225c4ff636f16e274c653df37c0b5ce0..9094f4b3b367b5d37332727d11722602bed03e5a 100644 (file)
@@ -655,10 +655,11 @@ int tomoyo_socket_listen_permission(struct socket *sock)
                return 0;
        {
                const int error = sock->ops->getname(sock, (struct sockaddr *)
-                                                    &addr, &addr_len, 0);
+                                                    &addr, 0);
 
-               if (error)
+               if (error < 0)
                        return error;
+               addr_len = error;
        }
        address.protocol = type;
        address.operation = TOMOYO_NETWORK_LISTEN;