diff options
author | Roger Pau Monné <royger@FreeBSD.org> | 2018-07-30 11:27:51 +0000 |
---|---|---|
committer | Roger Pau Monné <royger@FreeBSD.org> | 2018-07-30 11:27:51 +0000 |
commit | 83c2fa73e682235d96a356991ed9028d782c5796 (patch) | |
tree | ebad1910fd1f4c9b564ca98ac800e8e1e9486737 /sys/dev/xen | |
parent | 8b19549b0e4f4e202f0c0ba9c634712fc23d6371 (diff) | |
download | src-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.c | 11 |
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); } |