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