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

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

 



On Thu, 7 Mar 2024 at 21:53, James Carter <jwcart2@xxxxxxxxx> wrote:
>
> 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

True; applied in wip-v3:
https://github.com/SELinuxProject/selinux/pull/406/commits/445cc5fc903fb6da7cefa059e29e6a7ed91302e9

> >  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