From: Sasha Levin <levinsasha928@gmail.com>
To: "Michael S. Tsirkin" <mst@redhat.com>
Cc: linux-kernel@vger.kernel.org,
Rusty Russell <rusty@rustcorp.com.au>,
virtualization@lists.linux-foundation.org,
netdev@vger.kernel.org, kvm@vger.kernel.org
Subject: Re: [PATCH 1/2] virtio-net: Verify page list size before fitting into skb
Date: Tue, 27 Sep 2011 09:44:02 +0300 [thread overview]
Message-ID: <1317105842.3467.3.camel@lappy> (raw)
In-Reply-To: <20110926195541.GA23086@redhat.com>
On Mon, 2011-09-26 at 22:55 +0300, Michael S. Tsirkin wrote:
> On Mon, Sep 26, 2011 at 10:37:22PM +0300, Sasha Levin wrote:
> > On Mon, 2011-09-26 at 21:44 +0300, Michael S. Tsirkin wrote:
> > > On Mon, Sep 26, 2011 at 08:41:08PM +0300, Sasha Levin wrote:
> > > > This patch verifies that the length of a buffer stored in a linked list
> > > > of pages is small enough to fit into a skb.
> > > >
> > > > If the size is larger than a max size of a skb, it means that we shouldn't
> > > > go ahead building skbs anyway since we won't be able to send the buffer as
> > > > the user requested.
> > > >
> > > > Cc: Rusty Russell <rusty@rustcorp.com.au>
> > > > Cc: "Michael S. Tsirkin" <mst@redhat.com>
> > > > Cc: virtualization@lists.linux-foundation.org
> > > > Cc: netdev@vger.kernel.org
> > > > Cc: kvm@vger.kernel.org
> > > > Signed-off-by: Sasha Levin <levinsasha928@gmail.com>
> > >
> > > Interesting. This is a theoretical issue, correct?
> > > Not a crash you actually see.
> >
> > Actually it was an actual crash caused when our virtio-net driver in kvm
> > tools did funny things and passed '(u32)-1' length as a buffer length to
> > the guest kernel.
> >
> > > This crash would mean device is giving us packets
> > > that are way too large. Avoiding crashes even in the face of
> > > a misbehaved device is a good idea, but should
> > > we print a diagnostic to a system log?
> > > Maybe rate-limited or print once to avoid filling
> > > up the disk. Other places in driver print with pr_debug
> > > I'm not sure that's right but better than nothing.
> >
> > Yup, I'll add some debug info.
> >
> > > > ---
> > > > drivers/net/virtio_net.c | 3 +++
> > > > 1 files changed, 3 insertions(+), 0 deletions(-)
> > > >
> > > > diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
> > > > index 0c7321c..64e0717 100644
> > > > --- a/drivers/net/virtio_net.c
> > > > +++ b/drivers/net/virtio_net.c
> > > > @@ -165,6 +165,9 @@ static struct sk_buff *page_to_skb(struct virtnet_info *vi,
> > > > unsigned int copy, hdr_len, offset;
> > > > char *p;
> > > >
> > > > + if (len > MAX_SKB_FRAGS * PAGE_SIZE)
> > >
> > > unlikely()?
> > >
> > > Also, this seems too aggressive: at this point len includes the header
> > > and the linear part. The right place for this
> > > test is probably where we fill in the frags, just before
> > > while (len)
> > >
> > > The whole can only happen when mergeable buffers
> > > are disabled, right?
> >
> > >From what I understand it can happen whenever you're going to build a
> > skb longer than PAGE_SIZE.
>
> Hmm how exactly? With mergeable buffers this only gets
> the length of the 1st chunk which is up to 4K unless the driver
> is buggy ...
What about the case where TSO or ECN features are set? The code flow
suggests that mergeable would get ignored in that case:
/* If we can receive ANY GSO packets, we must allocate large ones. */
if (virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO4) ||
virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO6) ||
virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_ECN))
vi->big_packets = true;
[...]
if (!vi->mergeable_rx_bufs && !vi->big_packets) {
skb = buf;
len -= sizeof(struct virtio_net_hdr);
skb_trim(skb, len);
} else {
page = buf;
skb = page_to_skb(vi, page, len);
...
I haven't actually tested it with mergeable buffers enabled, but could
do it later today.
--
Sasha.
next prev parent reply other threads:[~2011-09-27 6:44 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-09-26 17:41 [PATCH 1/2] virtio-net: Verify page list size before fitting into skb Sasha Levin
2011-09-26 17:41 ` [PATCH 2/2] virtio-net: Prevent NULL dereference Sasha Levin
2011-09-26 18:47 ` Michael S. Tsirkin
2011-09-26 18:44 ` [PATCH 1/2] virtio-net: Verify page list size before fitting into skb Michael S. Tsirkin
2011-09-26 19:37 ` Sasha Levin
2011-09-26 19:45 ` Pekka Enberg
2011-09-26 19:57 ` Michael S. Tsirkin
2011-09-26 20:04 ` Pekka Enberg
2011-09-26 19:57 ` Sasha Levin
2011-09-26 19:55 ` Michael S. Tsirkin
2011-09-27 6:44 ` Sasha Levin [this message]
2011-09-27 7:00 ` Michael S. Tsirkin
2011-09-27 11:20 ` Sasha Levin
2011-09-27 12:37 ` Michael S. Tsirkin
2011-09-28 12:19 ` Sasha Levin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1317105842.3467.3.camel@lappy \
--to=levinsasha928@gmail.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mst@redhat.com \
--cc=netdev@vger.kernel.org \
--cc=rusty@rustcorp.com.au \
--cc=virtualization@lists.linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.