Re: [RFC PATCH v2 5/9] libselinux: sidtab updates

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Jan 31, 2024 at 8:18 AM Christian Göttsche
<cgzones@xxxxxxxxxxxxxx> wrote:
>
> Add sidtab_context_lookup() to just lookup a context, not inserting
> non-existent ones.
>
> Tweak sidtab_destroy() to accept a zero'ed struct sidtab.
>
> Remove redundant lookup in sidtab_context_to_sid() after insertion by
> returning the newly created node directly from sidtab_insert().
>
> Drop declaration of only internal used sidtab_insert().
>
> Signed-off-by: Christian Göttsche <cgzones@xxxxxxxxxxxxxx>
> ---
> v2:
>   add patch
> ---
>  libselinux/src/avc_sidtab.c | 55 +++++++++++++++++++++----------------
>  libselinux/src/avc_sidtab.h |  2 +-
>  2 files changed, 32 insertions(+), 25 deletions(-)
>
> diff --git a/libselinux/src/avc_sidtab.c b/libselinux/src/avc_sidtab.c
> index 9475dcb0..3d347cea 100644
> --- a/libselinux/src/avc_sidtab.c
> +++ b/libselinux/src/avc_sidtab.c
> @@ -44,28 +44,23 @@ int sidtab_init(struct sidtab *s)
>         return rc;
>  }
>
> -int sidtab_insert(struct sidtab *s, const char * ctx)
> +static struct sidtab_node *
> +sidtab_insert(struct sidtab *s, const char * ctx)
>  {
>         unsigned hvalue;
> -       int rc = 0;
>         struct sidtab_node *newnode;
>         char * newctx;
>
> -       if (s->nel >= UINT_MAX - 1) {
> -               rc = -1;
> -               goto out;
> -       }
> +       if (s->nel >= UINT_MAX - 1)
> +               return NULL;
>
>         newnode = (struct sidtab_node *)avc_malloc(sizeof(*newnode));
> -       if (!newnode) {
> -               rc = -1;
> -               goto out;
> -       }
> +       if (!newnode)
> +               return NULL;
>         newctx = strdup(ctx);
>         if (!newctx) {
> -               rc = -1;
>                 avc_free(newnode);
> -               goto out;
> +               return NULL;
>         }
>
>         hvalue = sidtab_hash(newctx);
> @@ -73,8 +68,25 @@ int sidtab_insert(struct sidtab *s, const char * ctx)
>         newnode->sid_s.ctx = newctx;
>         newnode->sid_s.id = ++s->nel;
>         s->htable[hvalue] = newnode;
> -      out:
> -       return rc;
> +       return newnode;
> +}
> +
> +const struct security_id *
> +sidtab_context_lookup(const struct sidtab *s, const char *ctx)
> +{
> +       unsigned hvalue;
> +       const struct sidtab_node *cur;
> +
> +       hvalue = sidtab_hash(ctx);
> +
> +       cur = s->htable[hvalue];
> +       while (cur != NULL && strcmp(cur->sid_s.ctx, ctx))
> +               cur = cur->next;
> +
> +       if (cur == NULL)
> +               return NULL;
> +
> +       return &cur->sid_s;
>  }
>
>  int
> @@ -82,27 +94,23 @@ sidtab_context_to_sid(struct sidtab *s,
>                       const char * ctx, security_id_t * sid)
>  {
>         unsigned hvalue;
> -       int rc = 0;
>         struct sidtab_node *cur;
>
>         *sid = NULL;
>         hvalue = sidtab_hash(ctx);
>
> -      loop:
>         cur = s->htable[hvalue];
>         while (cur != NULL && strcmp(cur->sid_s.ctx, ctx))
>                 cur = cur->next;
>
>         if (cur == NULL) {      /* need to make a new entry */
> -               rc = sidtab_insert(s, ctx);
> -               if (rc)
> -                       goto out;
> -               goto loop;      /* find the newly inserted node */
> +               cur = sidtab_insert(s, ctx);
> +               if (cur == NULL)
> +                       return -1;
>         }
>
>         *sid = &cur->sid_s;
> -      out:
> -       return rc;
> +       return 0;
>  }
>

This duplicates the sidtab_context_lookup() code above, so why not
just use that. If that returns NULL, then insert the context.

Thanks,
Jim


>  void sidtab_sid_stats(const struct sidtab *s, char *buf, size_t buflen)
> @@ -138,7 +146,7 @@ void sidtab_destroy(struct sidtab *s)
>         int i;
>         struct sidtab_node *cur, *temp;
>
> -       if (!s)
> +       if (!s || !s->htable)
>                 return;
>
>         for (i = 0; i < SIDTAB_SIZE; i++) {
> @@ -149,7 +157,6 @@ void sidtab_destroy(struct sidtab *s)
>                         freecon(temp->sid_s.ctx);
>                         avc_free(temp);
>                 }
> -               s->htable[i] = NULL;
>         }
>         avc_free(s->htable);
>         s->htable = NULL;
> diff --git a/libselinux/src/avc_sidtab.h b/libselinux/src/avc_sidtab.h
> index e823e3f3..f62fd353 100644
> --- a/libselinux/src/avc_sidtab.h
> +++ b/libselinux/src/avc_sidtab.h
> @@ -24,8 +24,8 @@ struct sidtab {
>  };
>
>  int sidtab_init(struct sidtab *s) ;
> -int sidtab_insert(struct sidtab *s, const char * ctx) ;
>
> +const struct security_id * sidtab_context_lookup(const struct sidtab *s, const char *ctx);
>  int sidtab_context_to_sid(struct sidtab *s,
>                           const char * ctx, security_id_t * sid) ;
>
> --
> 2.43.0
>
>





[Index of Archives]     [Selinux Refpolicy]     [Linux SGX]     [Fedora Users]     [Fedora Desktop]     [Yosemite Photos]     [Yosemite Camping]     [Yosemite Campsites]     [KDE Users]     [Gnome Users]

  Powered by Linux