[lxc-devel] [PATCH 1/1] seccomp: add 'lxc.seccomp.optional'
Stéphane Graber
stgraber at ubuntu.com
Mon Feb 17 22:23:46 UTC 2014
On Mon, Feb 17, 2014 at 05:16:51PM -0500, Stéphane Graber wrote:
> On Mon, Feb 17, 2014 at 02:05:10PM -0600, Serge Hallyn wrote:
> > If that is set, then if reading the policy failed, we continue
> > without trying to load seccomp. (If reading the policy
> > succeeded, then we do not ignore failure to load the policy;
> > we could consider doing that as well, however the goal here
> > is to have a generic container configuration work whether
> > the host has seccompv2 support or not)
> >
> > Signed-off-by: Serge Hallyn <serge.hallyn at ubuntu.com>
>
> Acked-by: Stéphane Graber <stgraber at ubuntu.com>
Actually, I'll wait a bit before pushing this, the code isn't
technically wrong (that I could see) but it's pretty confusing.
The option isn't documented in lxc.container.conf.sgml and the behavior
of the option is a bit odd too.
Let's take a lxc-clone example:
If .optional == 1 and .seccomp is invalid => neither option appear in target container
If .optional == 1 and .seccomp is valid => only .seccomp appears in the target
It's also not possible to query its value or set it through the API.
>
> > ---
> > src/lxc/attach.c | 10 ++++++++--
> > src/lxc/conf.h | 1 +
> > src/lxc/confile.c | 15 +++++++++++++++
> > src/lxc/start.c | 9 +++++++--
> > 4 files changed, 31 insertions(+), 4 deletions(-)
> >
> > diff --git a/src/lxc/attach.c b/src/lxc/attach.c
> > index 31a5ae7..600332a 100644
> > --- a/src/lxc/attach.c
> > +++ b/src/lxc/attach.c
> > @@ -613,8 +613,14 @@ static bool fetch_seccomp(const char *name, const char *lxcpath,
> > if (!c->lxc_conf)
> > return false;
> > if (lxc_read_seccomp_config(c->lxc_conf) < 0) {
> > - ERROR("Error reaading seccomp policy");
> > - return false;
> > + if (c->lxc_conf->seccomp_optional) {
> > + WARN("Ignoring error loading seccomp policy.");
> > + lxc_container_put(c);
> > + i->container = NULL;
> > + } else {
> > + ERROR("Error reaading seccomp policy");
> > + return false;
> > + }
> > }
> >
> > return true;
> > diff --git a/src/lxc/conf.h b/src/lxc/conf.h
> > index 4591470..3622287 100644
> > --- a/src/lxc/conf.h
> > +++ b/src/lxc/conf.h
> > @@ -303,6 +303,7 @@ struct lxc_conf {
> > char *lsm_se_context;
> > int tmp_umount_proc;
> > char *seccomp; // filename with the seccomp rules
> > + bool seccomp_optional; // proceed if seccomp_load fails
> > #if HAVE_SCMP_FILTER_CTX
> > scmp_filter_ctx *seccomp_ctx;
> > #endif
> > diff --git a/src/lxc/confile.c b/src/lxc/confile.c
> > index afc9e32..bc99e45 100644
> > --- a/src/lxc/confile.c
> > +++ b/src/lxc/confile.c
> > @@ -89,6 +89,7 @@ static int config_cap_drop(const char *, const char *, struct lxc_conf *);
> > static int config_cap_keep(const char *, const char *, struct lxc_conf *);
> > static int config_console(const char *, const char *, struct lxc_conf *);
> > static int config_seccomp(const char *, const char *, struct lxc_conf *);
> > +static int config_seccomp_opt(const char *, const char *, struct lxc_conf *);
> > static int config_includefile(const char *, const char *, struct lxc_conf *);
> > static int config_network_nic(const char *, const char *, struct lxc_conf *);
> > static int config_autodev(const char *, const char *, struct lxc_conf *);
> > @@ -143,6 +144,7 @@ static struct lxc_config_t config[] = {
> > { "lxc.cap.drop", config_cap_drop },
> > { "lxc.cap.keep", config_cap_keep },
> > { "lxc.console", config_console },
> > + { "lxc.seccomp.optional", config_seccomp_opt },
> > { "lxc.seccomp", config_seccomp },
> > { "lxc.include", config_includefile },
> > { "lxc.autodev", config_autodev },
> > @@ -928,6 +930,19 @@ static int config_seccomp(const char *key, const char *value,
> > return config_path_item(&lxc_conf->seccomp, value);
> > }
> >
> > +static int config_seccomp_opt(const char *key, const char *value,
> > + struct lxc_conf *lxc_conf)
> > +{
> > + int opt, ret;
> > +
> > + ret = sscanf(value, "%d", &opt);
> > + if (ret != 1)
> > + return -1;
> > + lxc_conf->seccomp_optional = opt == 1;
> > +
> > + return 0;
> > +}
> > +
> > static int config_hook(const char *key, const char *value,
> > struct lxc_conf *lxc_conf)
> > {
> > diff --git a/src/lxc/start.c b/src/lxc/start.c
> > index 5b3b6eb..8c3c40f 100644
> > --- a/src/lxc/start.c
> > +++ b/src/lxc/start.c
> > @@ -381,8 +381,13 @@ struct lxc_handler *lxc_init(const char *name, struct lxc_conf *conf, const char
> > goto out_free_name;
> >
> > if (lxc_read_seccomp_config(conf) != 0) {
> > - ERROR("failed loading seccomp policy");
> > - goto out_close_maincmd_fd;
> > + if (conf->seccomp_optional) {
> > + WARN("Ignoring error loading seccomp policy.");
> > + lxc_seccomp_free(conf);
> > + } else {
> > + ERROR("Exiting on failure to load seccomp policy");
> > + goto out_close_maincmd_fd;
> > + }
> > }
> >
> > /* Begin by setting the state to STARTING */
> > --
> > 1.9.rc1
> >
> > _______________________________________________
> > lxc-devel mailing list
> > lxc-devel at lists.linuxcontainers.org
> > http://lists.linuxcontainers.org/listinfo/lxc-devel
>
> --
> Stéphane Graber
> Ubuntu developer
> http://www.ubuntu.com
> _______________________________________________
> lxc-devel mailing list
> lxc-devel at lists.linuxcontainers.org
> http://lists.linuxcontainers.org/listinfo/lxc-devel
--
Stéphane Graber
Ubuntu developer
http://www.ubuntu.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20140217/2def12bc/attachment.pgp>
More information about the lxc-devel
mailing list