git: b4e87a632955 - main - jail: Clean up allprison_lock handing in kern_jail_set

Jamie Gritton jamie at FreeBSD.org
Thu Dec 31 23:19:02 UTC 2020


The branch main has been updated by jamie:

URL: https://cgit.FreeBSD.org/src/commit/?id=b4e87a632955a3a10ef6031c3d3e51c64e410749

commit b4e87a632955a3a10ef6031c3d3e51c64e410749
Author:     Jamie Gritton <jamie at FreeBSD.org>
AuthorDate: 2020-12-31 23:18:43 +0000
Commit:     Jamie Gritton <jamie at FreeBSD.org>
CommitDate: 2020-12-31 23:18:43 +0000

    jail: Clean up allprison_lock handing in kern_jail_set
    
    Keep explicit track of the allprison_lock state during the final part
    of kern_jail_set, instead of deducing it from the JAIL_ATTACH flag.
    
    Also properly clean up when the attachment fails, fixing a long-
    standing (though minor) memory leak.
---
 sys/kern/kern_jail.c | 30 ++++++++++++++++++------------
 1 file changed, 18 insertions(+), 12 deletions(-)

diff --git a/sys/kern/kern_jail.c b/sys/kern/kern_jail.c
index fb77cf87126d..1ecb023717bd 100644
--- a/sys/kern/kern_jail.c
+++ b/sys/kern/kern_jail.c
@@ -526,7 +526,7 @@ kern_jail_set(struct thread *td, struct uio *optuio, int flags)
 #endif
 	unsigned long hid;
 	size_t namelen, onamelen, pnamelen;
-	int born, created, cuflags, descend, enforce;
+	int born, created, cuflags, descend, enforce, slocked;
 	int error, errmsg_len, errmsg_pos;
 	int gotchildmax, gotenforce, gothid, gotrsnum, gotslevel;
 	int jid, jsys, len, level;
@@ -1828,24 +1828,32 @@ kern_jail_set(struct thread *td, struct uio *optuio, int flags)
 	}
 
 	/* Attach this process to the prison if requested. */
+	slocked = PD_LIST_SLOCKED;
 	if (flags & JAIL_ATTACH) {
 		mtx_lock(&pr->pr_mtx);
 		error = do_jail_attach(td, pr);
+		slocked = 0;
 		if (error) {
 			vfs_opterror(opts, "attach failed");
-			if (!created)
-				prison_deref(pr, PD_DEREF);
+			if (born) {
+				sx_slock(&allprison_lock);
+				slocked = PD_LIST_SLOCKED;
+				(void)osd_jail_call(pr, PR_METHOD_REMOVE, NULL);
+			}
+			prison_deref(pr, created
+			    ? slocked
+			    : PD_DEREF | slocked);
 			goto done_errmsg;
 		}
 	}
 
 #ifdef RACCT
 	if (racct_enable && !created) {
-		if (!(flags & JAIL_ATTACH))
+		if (slocked) {
 			sx_sunlock(&allprison_lock);
+			slocked = 0;
+		}
 		prison_racct_modify(pr);
-		if (!(flags & JAIL_ATTACH))
-			sx_slock(&allprison_lock);
 	}
 #endif
 
@@ -1857,18 +1865,16 @@ kern_jail_set(struct thread *td, struct uio *optuio, int flags)
 	 * (which was not done earlier so that the prison would not be publicly
 	 * visible).
 	 */
-	if (!created) {
-		prison_deref(pr, (flags & JAIL_ATTACH)
-		    ? PD_DEREF
-		    : PD_DEREF | PD_LIST_SLOCKED);
-	} else {
+	if (!created)
+		prison_deref(pr, PD_DEREF | slocked);
+	else {
 		if (pr_flags & PR_PERSIST) {
 			mtx_lock(&pr->pr_mtx);
 			pr->pr_ref++;
 			pr->pr_uref++;
 			mtx_unlock(&pr->pr_mtx);
 		}
-		if (!(flags & JAIL_ATTACH))
+		if (slocked)
 			sx_sunlock(&allprison_lock);
 	}
 


More information about the dev-commits-src-all mailing list