diff options
Diffstat (limited to 'net/socket.c')
-rw-r--r-- | net/socket.c | 35 |
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 | ||
1672 | out_put: | 1674 | out_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 | } |
3167 | EXPORT_SYMBOL(kernel_connect); | 3168 | EXPORT_SYMBOL(kernel_connect); |
3168 | 3169 | ||
3169 | int kernel_getsockname(struct socket *sock, struct sockaddr *addr, | 3170 | int 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 | } |
3174 | EXPORT_SYMBOL(kernel_getsockname); | 3174 | EXPORT_SYMBOL(kernel_getsockname); |
3175 | 3175 | ||
3176 | int kernel_getpeername(struct socket *sock, struct sockaddr *addr, | 3176 | int 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 | } |
3181 | EXPORT_SYMBOL(kernel_getpeername); | 3180 | EXPORT_SYMBOL(kernel_getpeername); |
3182 | 3181 | ||