X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=drivers%2Fvhost%2Fnet.c;h=026be580d318481f6ed3732dd06b6fb2ea2c5160;hb=d8316f3991d207fe32881a9ac20241be8fa2bad0;hp=a0fa5de210cf57ac6842625ceb21499ac07a7969;hpb=ae693400bd2dd438f2bbacbb925233ba1dee9236;p=~andy%2Flinux diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c index a0fa5de210c..026be580d31 100644 --- a/drivers/vhost/net.c +++ b/drivers/vhost/net.c @@ -532,6 +532,12 @@ static int get_rx_bufs(struct vhost_virtqueue *vq, *iovcount = seg; if (unlikely(log)) *log_num = nlogs; + + /* Detect overrun */ + if (unlikely(datalen > 0)) { + r = UIO_MAXIOV + 1; + goto err; + } return headcount; err: vhost_discard_vq_desc(vq, headcount); @@ -587,6 +593,14 @@ static void handle_rx(struct vhost_net *net) /* On error, stop handling until the next kick. */ if (unlikely(headcount < 0)) break; + /* On overrun, truncate and discard */ + if (unlikely(headcount > UIO_MAXIOV)) { + msg.msg_iovlen = 1; + err = sock->ops->recvmsg(NULL, sock, &msg, + 1, MSG_DONTWAIT | MSG_TRUNC); + pr_debug("Discarded rx packet: len %zd\n", sock_len); + continue; + } /* OK, now we need to know about added descriptors. */ if (!headcount) { if (unlikely(vhost_enable_notify(&net->dev, vq))) {