aboutsummaryrefslogtreecommitdiffstats
path: root/net/socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/socket.c')
-rw-r--r--net/socket.c51
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
237static struct kmem_cache *sock_inode_cachep __read_mostly; 236static struct kmem_cache *sock_inode_cachep __ro_after_init;
238 237
239static struct inode *sock_alloc_inode(struct super_block *sb) 238static 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
994static struct ns_common *get_net_ns(struct ns_common *ns) 993struct 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}
997EXPORT_SYMBOL_GPL(get_net_ns);
998 998
999static long sock_ioctl(struct file *file, unsigned cmd, unsigned long arg) 999static 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
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 }
@@ -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}
3172EXPORT_SYMBOL(kernel_connect); 3175EXPORT_SYMBOL(kernel_connect);
3173 3176
3174int kernel_getsockname(struct socket *sock, struct sockaddr *addr, 3177int 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}
3179EXPORT_SYMBOL(kernel_getsockname); 3181EXPORT_SYMBOL(kernel_getsockname);
3180 3182
3181int kernel_getpeername(struct socket *sock, struct sockaddr *addr, 3183int 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}
3186EXPORT_SYMBOL(kernel_getpeername); 3187EXPORT_SYMBOL(kernel_getpeername);
3187 3188