svn commit: r336896 - head/sys/dev/xen/blkfront

Roger Pau Monné royger at FreeBSD.org
Mon Jul 30 11:27:52 UTC 2018


Author: royger
Date: Mon Jul 30 11:27:51 2018
New Revision: 336896
URL: https://svnweb.freebsd.org/changeset/base/336896

Log:
  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 at freebsd.org>
  Differential Review:	https://reviews.freebsd.org/D16136

Modified:
  head/sys/dev/xen/blkfront/blkfront.c

Modified: head/sys/dev/xen/blkfront/blkfront.c
==============================================================================
--- head/sys/dev/xen/blkfront/blkfront.c	Mon Jul 30 11:15:20 2018	(r336895)
+++ head/sys/dev/xen/blkfront/blkfront.c	Mon Jul 30 11:27:51 2018	(r336896)
@@ -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);
 	}


More information about the svn-src-all mailing list