aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/xen
diff options
context:
space:
mode:
authorRoger Pau Monné <royger@FreeBSD.org>2018-07-30 11:27:51 +0000
committerRoger Pau Monné <royger@FreeBSD.org>2018-07-30 11:27:51 +0000
commit83c2fa73e682235d96a356991ed9028d782c5796 (patch)
treeebad1910fd1f4c9b564ca98ac800e8e1e9486737 /sys/dev/xen
parent8b19549b0e4f4e202f0c0ba9c634712fc23d6371 (diff)
downloadsrc-83c2fa73e682235d96a356991ed9028d782c5796.tar.gz
src-83c2fa73e682235d96a356991ed9028d782c5796.zip
xen-blkfront: fix memory leak in xbd_connect error path
If gnttab_grant_foreign_access() fails for any of the indirection pages, the code breaks out of both the loops without freeing the local variable indirectpages, causing a memory leak. Submitted by: Pratyush Yadav <pratyush@freebsd.org> Differential Review: https://reviews.freebsd.org/D16136
Notes
Notes: svn path=/head/; revision=336896
Diffstat (limited to 'sys/dev/xen')
-rw-r--r--sys/dev/xen/blkfront/blkfront.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/sys/dev/xen/blkfront/blkfront.c b/sys/dev/xen/blkfront/blkfront.c
index 1f21fb838e9d..26f935199b99 100644
--- a/sys/dev/xen/blkfront/blkfront.c
+++ b/sys/dev/xen/blkfront/blkfront.c
@@ -1333,7 +1333,10 @@ xbd_connect(struct xbd_softc *sc)
if (sc->xbd_max_request_indirectpages > 0) {
indirectpages = contigmalloc(
PAGE_SIZE * sc->xbd_max_request_indirectpages,
- M_XENBLOCKFRONT, M_ZERO, 0, ~0, PAGE_SIZE, 0);
+ M_XENBLOCKFRONT, M_ZERO | M_NOWAIT, 0, ~0,
+ PAGE_SIZE, 0);
+ if (indirectpages == NULL)
+ sc->xbd_max_request_indirectpages = 0;
} else {
indirectpages = NULL;
}
@@ -1345,8 +1348,12 @@ xbd_connect(struct xbd_softc *sc)
&cm->cm_indirectionrefs[j]))
break;
}
- if (j < sc->xbd_max_request_indirectpages)
+ if (j < sc->xbd_max_request_indirectpages) {
+ contigfree(indirectpages,
+ PAGE_SIZE * sc->xbd_max_request_indirectpages,
+ M_XENBLOCKFRONT);
break;
+ }
cm->cm_indirectionpages = indirectpages;
xbd_free_command(cm);
}