summaryrefslogtreecommitdiffstats
path: root/net/socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/socket.c')
-rw-r--r--net/socket.c35
1 files changed, 17 insertions, 18 deletions
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