diff options
Diffstat (limited to 'net/socket.c')
-rw-r--r-- | net/socket.c | 51 |
1 files changed, 26 insertions, 25 deletions
diff --git a/net/socket.c b/net/socket.c index 08847c3b8c39..3d1948d27a25 100644 --- a/net/socket.c +++ b/net/socket.c | |||
@@ -104,7 +104,6 @@ | |||
104 | #include <linux/ipv6_route.h> | 104 | #include <linux/ipv6_route.h> |
105 | #include <linux/route.h> | 105 | #include <linux/route.h> |
106 | #include <linux/sockios.h> | 106 | #include <linux/sockios.h> |
107 | #include <linux/atalk.h> | ||
108 | #include <net/busy_poll.h> | 107 | #include <net/busy_poll.h> |
109 | #include <linux/errqueue.h> | 108 | #include <linux/errqueue.h> |
110 | 109 | ||
@@ -234,7 +233,7 @@ static int move_addr_to_user(struct sockaddr_storage *kaddr, int klen, | |||
234 | return __put_user(klen, ulen); | 233 | return __put_user(klen, ulen); |
235 | } | 234 | } |
236 | 235 | ||
237 | static struct kmem_cache *sock_inode_cachep __read_mostly; | 236 | static struct kmem_cache *sock_inode_cachep __ro_after_init; |
238 | 237 | ||
239 | static struct inode *sock_alloc_inode(struct super_block *sb) | 238 | static struct inode *sock_alloc_inode(struct super_block *sb) |
240 | { | 239 | { |
@@ -991,10 +990,11 @@ static long sock_do_ioctl(struct net *net, struct socket *sock, | |||
991 | * what to do with it - that's up to the protocol still. | 990 | * what to do with it - that's up to the protocol still. |
992 | */ | 991 | */ |
993 | 992 | ||
994 | static struct ns_common *get_net_ns(struct ns_common *ns) | 993 | struct ns_common *get_net_ns(struct ns_common *ns) |
995 | { | 994 | { |
996 | return &get_net(container_of(ns, struct net, ns))->ns; | 995 | return &get_net(container_of(ns, struct net, ns))->ns; |
997 | } | 996 | } |
997 | EXPORT_SYMBOL_GPL(get_net_ns); | ||
998 | 998 | ||
999 | static long sock_ioctl(struct file *file, unsigned cmd, unsigned long arg) | 999 | static long sock_ioctl(struct file *file, unsigned cmd, unsigned long arg) |
1000 | { | 1000 | { |
@@ -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 | } |
@@ -2288,10 +2289,12 @@ int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen, | |||
2288 | if (!sock) | 2289 | if (!sock) |
2289 | return err; | 2290 | return err; |
2290 | 2291 | ||
2291 | err = sock_error(sock->sk); | 2292 | if (likely(!(flags & MSG_ERRQUEUE))) { |
2292 | if (err) { | 2293 | err = sock_error(sock->sk); |
2293 | datagrams = err; | 2294 | if (err) { |
2294 | goto out_put; | 2295 | datagrams = err; |
2296 | goto out_put; | ||
2297 | } | ||
2295 | } | 2298 | } |
2296 | 2299 | ||
2297 | entry = mmsg; | 2300 | entry = mmsg; |
@@ -3171,17 +3174,15 @@ int kernel_connect(struct socket *sock, struct sockaddr *addr, int addrlen, | |||
3171 | } | 3174 | } |
3172 | EXPORT_SYMBOL(kernel_connect); | 3175 | EXPORT_SYMBOL(kernel_connect); |
3173 | 3176 | ||
3174 | int kernel_getsockname(struct socket *sock, struct sockaddr *addr, | 3177 | int kernel_getsockname(struct socket *sock, struct sockaddr *addr) |
3175 | int *addrlen) | ||
3176 | { | 3178 | { |
3177 | return sock->ops->getname(sock, addr, addrlen, 0); | 3179 | return sock->ops->getname(sock, addr, 0); |
3178 | } | 3180 | } |
3179 | EXPORT_SYMBOL(kernel_getsockname); | 3181 | EXPORT_SYMBOL(kernel_getsockname); |
3180 | 3182 | ||
3181 | int kernel_getpeername(struct socket *sock, struct sockaddr *addr, | 3183 | int kernel_getpeername(struct socket *sock, struct sockaddr *addr) |
3182 | int *addrlen) | ||
3183 | { | 3184 | { |
3184 | return sock->ops->getname(sock, addr, addrlen, 1); | 3185 | return sock->ops->getname(sock, addr, 1); |
3185 | } | 3186 | } |
3186 | EXPORT_SYMBOL(kernel_getpeername); | 3187 | EXPORT_SYMBOL(kernel_getpeername); |
3187 | 3188 | ||