Skip to content

Commit

Permalink
vhost: fix ubuf_info cleanup
Browse files Browse the repository at this point in the history
vhost_net_clear_ubuf_info didn't clear ubuf_info
after kfree, this could trigger double free.
Fix this and simplify this code to make it more robust: make sure
ubuf info is always freed through vhost_net_clear_ubuf_info.

Reported-by: Tommi Rantala <tt.rantala@gmail.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
mstsirkin authored and davem330 committed Jun 11, 2013
1 parent 05c0535 commit 288cfe7
Showing 1 changed file with 7 additions and 15 deletions.
22 changes: 7 additions & 15 deletions drivers/vhost/net.c
Original file line number Diff line number Diff line change
Expand Up @@ -155,14 +155,11 @@ static void vhost_net_ubuf_put_and_wait(struct vhost_net_ubuf_ref *ubufs)

static void vhost_net_clear_ubuf_info(struct vhost_net *n)
{

bool zcopy;
int i;

for (i = 0; i < n->dev.nvqs; ++i) {
zcopy = vhost_net_zcopy_mask & (0x1 << i);
if (zcopy)
kfree(n->vqs[i].ubuf_info);
for (i = 0; i < VHOST_NET_VQ_MAX; ++i) {
kfree(n->vqs[i].ubuf_info);
n->vqs[i].ubuf_info = NULL;
}
}

Expand All @@ -171,7 +168,7 @@ int vhost_net_set_ubuf_info(struct vhost_net *n)
bool zcopy;
int i;

for (i = 0; i < n->dev.nvqs; ++i) {
for (i = 0; i < VHOST_NET_VQ_MAX; ++i) {
zcopy = vhost_net_zcopy_mask & (0x1 << i);
if (!zcopy)
continue;
Expand All @@ -183,25 +180,20 @@ int vhost_net_set_ubuf_info(struct vhost_net *n)
return 0;

err:
while (i--) {
zcopy = vhost_net_zcopy_mask & (0x1 << i);
if (!zcopy)
continue;
kfree(n->vqs[i].ubuf_info);
}
vhost_net_clear_ubuf_info(n);
return -ENOMEM;
}

void vhost_net_vq_reset(struct vhost_net *n)
{
int i;

vhost_net_clear_ubuf_info(n);

for (i = 0; i < VHOST_NET_VQ_MAX; i++) {
n->vqs[i].done_idx = 0;
n->vqs[i].upend_idx = 0;
n->vqs[i].ubufs = NULL;
kfree(n->vqs[i].ubuf_info);
n->vqs[i].ubuf_info = NULL;
n->vqs[i].vhost_hlen = 0;
n->vqs[i].sock_hlen = 0;
}
Expand Down

0 comments on commit 288cfe7

Please sign in to comment.