git: 097db30a8e03 - main - jail: Allow nested jail definitions.
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sun, 04 Jun 2023 00:46:25 UTC
The branch main has been updated by jamie:
URL: https://cgit.FreeBSD.org/src/commit/?id=097db30a8e0310ac28075787fb92ea40dad8b27b
commit 097db30a8e0310ac28075787fb92ea40dad8b27b
Author: Jamie Gritton <jamie@FreeBSD.org>
AuthorDate: 2023-06-04 00:45:54 +0000
Commit: Jamie Gritton <jamie@FreeBSD.org>
CommitDate: 2023-06-04 00:45:54 +0000
jail: Allow nested jail definitions.
Make the jail.conf specification recursive, with jail definitions
allowed within a jail's parameter list, just as they are allowed
at the top level. Such inner jails are part of the outer jail's
hierarchy, as if they were specified with hierarchical names.
---
usr.sbin/jail/jailp.h | 1 +
usr.sbin/jail/jailparse.y | 65 +++++++++++++++++++++++++----------------------
2 files changed, 36 insertions(+), 30 deletions(-)
diff --git a/usr.sbin/jail/jailp.h b/usr.sbin/jail/jailp.h
index 00865185fbd1..0325c2a101a4 100644
--- a/usr.sbin/jail/jailp.h
+++ b/usr.sbin/jail/jailp.h
@@ -176,6 +176,7 @@ struct cfjail {
struct cfparams params;
struct cfdepends dep[2];
struct cfjails *queue;
+ struct cfjail *cfparent;
struct cfparam *intparams[IP_NPARAM];
struct cfstring *comstring;
struct jailparam *jp;
diff --git a/usr.sbin/jail/jailparse.y b/usr.sbin/jail/jailparse.y
index 9426444f0d09..44e2aacb457e 100644
--- a/usr.sbin/jail/jailparse.y
+++ b/usr.sbin/jail/jailparse.y
@@ -38,11 +38,12 @@ __FBSDID("$FreeBSD$");
#ifdef DEBUG
#define YYDEBUG 1
#endif
+
+static struct cfjail *current_jail;
+static struct cfjail *global_jail;
%}
%union {
- struct cfjail *j;
- struct cfparams *pp;
struct cfparam *p;
struct cfstrings *ss;
struct cfstring *s;
@@ -52,8 +53,6 @@ __FBSDID("$FreeBSD$");
%token PLEQ
%token <cs> STR STR1 VAR VAR1
-%type <j> jail
-%type <pp> param_l
%type <p> param name
%type <ss> value
%type <s> string
@@ -61,46 +60,54 @@ __FBSDID("$FreeBSD$");
%%
/*
- * A config file is a series of jails (containing parameters) and jail-less
- * parameters which really belong to a global pseudo-jail.
+ * A config file is a list of jails and parameters. Parameters are
+ * added to the current jail, otherwise to a global pesudo-jail.
*/
conf :
- ;
| conf jail
- ;
| conf param ';'
{
- struct cfjail *j;
+ struct cfjail *j = current_jail;
- j = TAILQ_LAST(&cfjails, cfjails);
- if (!j || strcmp(j->name, "*")) {
- j = add_jail();
- j->name = estrdup("*");
+ if (j == NULL) {
+ if (global_jail == NULL) {
+ global_jail = add_jail();
+ global_jail->name = estrdup("*");
+ }
+ j = global_jail;
}
TAILQ_INSERT_TAIL(&j->params, $2, tq);
}
| conf ';'
+ ;
-jail : STR '{' param_l '}'
+jail : jail_name '{' conf '}'
{
- $$ = add_jail();
- $$->name = $1;
- TAILQ_CONCAT(&$$->params, $3, tq);
- free($3);
+ current_jail = current_jail->cfparent;
}
;
-param_l :
- {
- $$ = emalloc(sizeof(struct cfparams));
- TAILQ_INIT($$);
- }
- | param_l param ';'
- {
- $$ = $1;
- TAILQ_INSERT_TAIL($$, $2, tq);
+jail_name : STR
+ {
+ struct cfjail *j = add_jail();
+
+ if (current_jail == NULL)
+ j->name = $1;
+ else {
+ /*
+ * A nested jail definition becomes
+ * a hierarchically-named sub-jail.
+ */
+ size_t parentlen = strlen(current_jail->name);
+ j->name = emalloc(parentlen + strlen($1) + 2);
+ strcpy(j->name, current_jail->name);
+ j->name[parentlen++] = '.';
+ strcpy(j->name + parentlen, $1);
+ free($1);
+ }
+ j->cfparent = current_jail;
+ current_jail = j;
}
- | param_l ';'
;
/*
@@ -131,8 +138,6 @@ param : name
free($2);
}
| error
- {
- }
;
/*