jail_getid(3): add special-case immediate return for jid 0

As depicted in the comment: jid 0 always exists, but the lookup will fail as
it does not appear in the kernel's alljails list being a special jail. Some
callers will expect/rely on this, and we have no reason to lie because it
does always exist.

Reported by:	Stefan Hegnauer <stefan.hegnauer gmx ch>
MFC after:	soon (regression, breaks inspecting jail host bits, partial
revert)
This commit is contained in:
kevans 2019-06-02 14:03:56 +00:00
parent 0a5977d317
commit ebec61f967

View File

@ -54,6 +54,15 @@ jail_getid(const char *name)
jid = strtoul(name, &ep, 10); jid = strtoul(name, &ep, 10);
if (*name && !*ep) { if (*name && !*ep) {
/*
* jid == 0 is a special case; it will not appear in the
* kernel's jail list, but naturally processes will be assigned
* to it because it is prison 0. Trivially return this one
* without a trip to the kernel, because it always exists but
* the lookup won't succeed.
*/
if (jid == 0)
return jid;
jiov[0].iov_base = __DECONST(char *, "jid"); jiov[0].iov_base = __DECONST(char *, "jid");
jiov[0].iov_len = sizeof("jid"); jiov[0].iov_len = sizeof("jid");
jiov[1].iov_base = &jid; jiov[1].iov_base = &jid;