diff options
author | jamie <jamie@FreeBSD.org> | 2016-06-15 01:58:54 +0000 |
---|---|---|
committer | jamie <jamie@FreeBSD.org> | 2016-06-15 01:58:54 +0000 |
commit | b19195f81214ebe5c4d846e7cab2c6e159a14458 (patch) | |
tree | ca2cc54013f60b23493854e450b3948ef613f49c /sys/kern/kern_jail.c | |
parent | 8b4e58204b785e1caaa23b2b31c55ae39b6406e2 (diff) | |
download | FreeBSD-src-b19195f81214ebe5c4d846e7cab2c6e159a14458.zip FreeBSD-src-b19195f81214ebe5c4d846e7cab2c6e159a14458.tar.gz |
MFC r301760:
Re-order some jail parameter reading to prevent a vnode leak.
Diffstat (limited to 'sys/kern/kern_jail.c')
-rw-r--r-- | sys/kern/kern_jail.c | 80 |
1 files changed, 40 insertions, 40 deletions
diff --git a/sys/kern/kern_jail.c b/sys/kern/kern_jail.c index 133a909..4f3633b 100644 --- a/sys/kern/kern_jail.c +++ b/sys/kern/kern_jail.c @@ -932,6 +932,46 @@ kern_jail_set(struct thread *td, struct uio *optuio, int flags) } #endif + error = vfs_getopt(opts, "osrelease", (void **)&osrelstr, &len); + if (error == ENOENT) + osrelstr = NULL; + else if (error != 0) + goto done_free; + else { + if (flags & JAIL_UPDATE) { + error = EINVAL; + vfs_opterror(opts, + "osrelease cannot be changed after creation"); + goto done_errmsg; + } + if (len == 0 || len >= OSRELEASELEN) { + error = EINVAL; + vfs_opterror(opts, + "osrelease string must be 1-%d bytes long", + OSRELEASELEN - 1); + goto done_errmsg; + } + } + + error = vfs_copyopt(opts, "osreldate", &osreldt, sizeof(osreldt)); + if (error == ENOENT) + osreldt = 0; + else if (error != 0) + goto done_free; + else { + if (flags & JAIL_UPDATE) { + error = EINVAL; + vfs_opterror(opts, + "osreldate cannot be changed after creation"); + goto done_errmsg; + } + if (osreldt == 0) { + error = EINVAL; + vfs_opterror(opts, "osreldate cannot be 0"); + goto done_errmsg; + } + } + fullpath_disabled = 0; root = NULL; error = vfs_getopt(opts, "path", (void **)&path, &len); @@ -987,46 +1027,6 @@ kern_jail_set(struct thread *td, struct uio *optuio, int flags) } } - error = vfs_getopt(opts, "osrelease", (void **)&osrelstr, &len); - if (error == ENOENT) - osrelstr = NULL; - else if (error != 0) - goto done_free; - else { - if (flags & JAIL_UPDATE) { - error = EINVAL; - vfs_opterror(opts, - "osrelease cannot be changed after creation"); - goto done_errmsg; - } - if (len == 0 || len >= OSRELEASELEN) { - error = EINVAL; - vfs_opterror(opts, - "osrelease string must be 1-%d bytes long", - OSRELEASELEN - 1); - goto done_errmsg; - } - } - - error = vfs_copyopt(opts, "osreldate", &osreldt, sizeof(osreldt)); - if (error == ENOENT) - osreldt = 0; - else if (error != 0) - goto done_free; - else { - if (flags & JAIL_UPDATE) { - error = EINVAL; - vfs_opterror(opts, - "osreldate cannot be changed after creation"); - goto done_errmsg; - } - if (osreldt == 0) { - error = EINVAL; - vfs_opterror(opts, "osreldate cannot be 0"); - goto done_errmsg; - } - } - /* * Find the specified jail, or at least its parent. * This abuses the file error codes ENOENT and EEXIST. |