[systemd-devel] [PATCH] selinux: fix selinux check for transient units

Lennart Poettering lennart at poettering.net
Mon Nov 4 08:06:36 PST 2013


On Thu, 31.10.13 15:51, Vaclav Pavlin (vpavlin at redhat.com) wrote:

> From: Václav Pavlín <vpavlin at redhat.com>

Sorry, I don't understand what this patch is doing. Please explain in a
commit message!

> 
> ---
>  src/core/selinux-access.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++-
>  src/core/selinux-access.h | 15 +++++++++---
>  2 files changed, 70 insertions(+), 4 deletions(-)
> 
> diff --git a/src/core/selinux-access.c b/src/core/selinux-access.c
> index 0a3ee18..5908a79 100644
> --- a/src/core/selinux-access.c
> +++ b/src/core/selinux-access.c
> @@ -333,6 +333,50 @@ static int get_calling_context(
>          return 0;
>  }
>  
> +static int load_context(
> +                const char *path,
> +                const char *name,
> +                char **context) {
> +
> +        int r = 0;
> +        char l[LINE_MAX];
> +        char *p;
> +        FILE *fd;
> +
> +        fd = fopen(path, "r");

Please always use "re" rather than "r". Not that it would matter much
here, but Please always do.

> +        if (!fd)
> +                return -EEXIST;
> +
> +        if (!fgets(l, sizeof(l), fd)) {

Hmm, isn't this a job for read_one_line_file()?

> +                if (feof(fd)) {
> +                        r = -EINVAL;
> +                        goto finish;
> +                }
> +
> +                log_error("Failed to read context file '%s': %m", path);
> +                r = -errno;
> +                goto finish;
> +        }
> +
> +        p = strtok (l, "=");

strtok() is evil, as it keeps internal state, please don't use it. Also
one space too much...

> +        if (p && streq(p, name)) {
> +                p = strtok (NULL, "=");
> +                if (!p) {
> +                        r = -EINVAL;
> +                        goto finish;
> +                }
> +
> +                *context = strdup(p);

Missing OOM check.

> +        } else
> +                r = -EINVAL;
> +
> +finish:
> +        if (fd)
> +                fclose(fd);

Please use _cleanup_close_ for cases like this.

> +        } else if (class == CLASS_TRANSIENT) {
> +                const char *context_path =
> selinux_systemd_contexts_path();

Where is selinux_systemd_contexts_path() define? I cant find it in this
patch and neither in the sources? What am I missing?

> +                if (_u->source_path || _u->fragment_path)              \
> +                        _r = selinux_access_check(_c, _m, CLASS_SERVICE, _u->source_path ?: _u->fragment_path, (permission), &_error); \
> +                else                                                    \
> +                        _r = selinux_access_check(_c, _m, CLASS_TRANSIENT, _u->id, (permission), &_error); \

You can recognize transient units via the transient bool on the Unit structure.

Lennart

-- 
Lennart Poettering, Red Hat


More information about the systemd-devel mailing list