提交 9012956d 编写于 作者: E Eugenio Pérez 提交者: Yang Yingliang

vhost: Check docket sk_family instead of call getname

commit 42d84c84 upstream.

Doing so, we save one call to get data we already have in the struct.

Also, since there is no guarantee that getname use sockaddr_ll
parameter beyond its size, we add a little bit of security here.
It should do not do beyond MAX_ADDR_LEN, but syzbot found that
ax25_getname writes more (72 bytes, the size of full_sockaddr_ax25,
versus 20 + 32 bytes of sockaddr_ll + MAX_ADDR_LEN in syzbot repro).

Fixes: 3a4d5c94 ("vhost_net: a kernel-level virtio server")
Reported-by: syzbot+f2a62d07a5198c819c7b@syzkaller.appspotmail.com
Signed-off-by: NEugenio Pérez <eperezma@redhat.com>
Acked-by: NMichael S. Tsirkin <mst@redhat.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
上级 7d19836c
...@@ -1187,10 +1187,6 @@ static int vhost_net_release(struct inode *inode, struct file *f) ...@@ -1187,10 +1187,6 @@ static int vhost_net_release(struct inode *inode, struct file *f)
static struct socket *get_raw_socket(int fd) static struct socket *get_raw_socket(int fd)
{ {
struct {
struct sockaddr_ll sa;
char buf[MAX_ADDR_LEN];
} uaddr;
int r; int r;
struct socket *sock = sockfd_lookup(fd, &r); struct socket *sock = sockfd_lookup(fd, &r);
...@@ -1203,11 +1199,7 @@ static struct socket *get_raw_socket(int fd) ...@@ -1203,11 +1199,7 @@ static struct socket *get_raw_socket(int fd)
goto err; goto err;
} }
r = sock->ops->getname(sock, (struct sockaddr *)&uaddr.sa, 0); if (sock->sk->sk_family != AF_PACKET) {
if (r < 0)
goto err;
if (uaddr.sa.sll_family != AF_PACKET) {
r = -EPFNOSUPPORT; r = -EPFNOSUPPORT;
goto err; goto err;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册