On 01/30/2018 02:46 PM, Stephen Smalley wrote:
> On Fri, 2018-01-26 at 15:32 +0100, peter.enderb...@sony.com wrote:
>> From: Peter Enderborg <peter.enderb...@sony.com>
>>
>> To be able to use rcu locks we seed to address the policydb
>> though a pointer. This preparation removes the export of the
>> policydb and send pointers to it through parameter agruments.
> Just for reference, I have a patch series that does this not only for
> the policydb, sidtab, and class/perm mapping, but for all of the
> SELinux global state, see:
> https://github.com/stephensmalley/selinux-kernel/tree/selinuxns
> and in particular
> https://github.com/stephensmalley/selinux-kernel/commit/c10d90b43cd720c8f8aab51007e805bf7c4f10d2
> https://github.com/stephensmalley/selinux-kernel/commit/ec038a64173d56a331423b6d1564b801f0915afc
> https://github.com/stephensmalley/selinux-kernel/commit/97aa5d7a05e4458bc4562c47d8f7bc4f56fbfefd
>
> Those first three patches should have no effect on SELinux behavior.
> They need to be re-based to latest selinux next branch (some minor
> conflict resolution required) but I was waiting for that to advance to
> something 4.15-rcX based.  I could however re-base it now if desired.
I read that as that you want me to rebase the patches on that tree? Seems to
be partly prepared but lot of changes.  Is it a moving target?

>> Signed-off-by: Peter Enderborg <peter.enderb...@sony.com>
>> ---
>>  security/selinux/ss/mls.c      | 69 ++++++++++++++++----------------
>>  security/selinux/ss/mls.h      | 37 +++++++++--------
>>  security/selinux/ss/services.c | 90 +++++++++++++++++++++++++++-----
>> ----------
>>  security/selinux/ss/services.h |  3 --
>>  4 files changed, 114 insertions(+), 85 deletions(-)
>>
>> diff --git a/security/selinux/ss/mls.c b/security/selinux/ss/mls.c
>> index ad982ce..b1f35d3 100644
>> --- a/security/selinux/ss/mls.c
>> +++ b/security/selinux/ss/mls.c
>> @@ -33,20 +33,20 @@
>>   * Return the length in bytes for the MLS fields of the
>>   * security context string representation of `context'.
>>   */
>> -int mls_compute_context_len(struct context *context)
>> +int mls_compute_context_len(struct policydb *p, struct context
>> *context)
>>  {
>>      int i, l, len, head, prev;
>>      char *nm;
>>      struct ebitmap *e;
>>      struct ebitmap_node *node;
>>  
>> -    if (!policydb.mls_enabled)
>> +    if (!p->mls_enabled)
>>              return 0;
>>  
>>      len = 1; /* for the beginning ":" */
>>      for (l = 0; l < 2; l++) {
>>              int index_sens = context->range.level[l].sens;
>> -            len += strlen(sym_name(&policydb, SYM_LEVELS,
>> index_sens - 1));
>> +            len += strlen(sym_name(p, SYM_LEVELS, index_sens -
>> 1));
>>  
>>              /* categories */
>>              head = -2;
>> @@ -56,17 +56,17 @@ int mls_compute_context_len(struct context
>> *context)
>>                      if (i - prev > 1) {
>>                              /* one or more negative bits are
>> skipped */
>>                              if (head != prev) {
>> -                                    nm = sym_name(&policydb,
>> SYM_CATS, prev);
>> +                                    nm = sym_name(p, SYM_CATS,
>> prev);
>>                                      len += strlen(nm) + 1;
>>                              }
>> -                            nm = sym_name(&policydb, SYM_CATS,
>> i);
>> +                            nm = sym_name(p, SYM_CATS, i);
>>                              len += strlen(nm) + 1;
>>                              head = i;
>>                      }
>>                      prev = i;
>>              }
>>              if (prev != head) {
>> -                    nm = sym_name(&policydb, SYM_CATS, prev);
>> +                    nm = sym_name(p, SYM_CATS, prev);
>>                      len += strlen(nm) + 1;
>>              }
>>              if (l == 0) {
>> @@ -86,7 +86,7 @@ int mls_compute_context_len(struct context
>> *context)
>>   * the MLS fields of `context' into the string `*scontext'.
>>   * Update `*scontext' to point to the end of the MLS fields.
>>   */
>> -void mls_sid_to_context(struct context *context,
>> +void mls_sid_to_context(struct policydb *p, struct context *context,
>>                      char **scontext)
>>  {
>>      char *scontextp, *nm;
>> @@ -94,7 +94,7 @@ void mls_sid_to_context(struct context *context,
>>      struct ebitmap *e;
>>      struct ebitmap_node *node;
>>  
>> -    if (!policydb.mls_enabled)
>> +    if (!p->mls_enabled)
>>              return;
>>  
>>      scontextp = *scontext;
>> @@ -103,7 +103,7 @@ void mls_sid_to_context(struct context *context,
>>      scontextp++;
>>  
>>      for (l = 0; l < 2; l++) {
>> -            strcpy(scontextp, sym_name(&policydb, SYM_LEVELS,
>> +            strcpy(scontextp, sym_name(p, SYM_LEVELS,
>>                                         context-
>>> range.level[l].sens - 1));
>>              scontextp += strlen(scontextp);
>>  
>> @@ -119,7 +119,7 @@ void mls_sid_to_context(struct context *context,
>>                                              *scontextp++ = '.';
>>                                      else
>>                                              *scontextp++ = ',';
>> -                                    nm = sym_name(&policydb,
>> SYM_CATS, prev);
>> +                                    nm = sym_name(p, SYM_CATS,
>> prev);
>>                                      strcpy(scontextp, nm);
>>                                      scontextp += strlen(nm);
>>                              }
>> @@ -127,7 +127,7 @@ void mls_sid_to_context(struct context *context,
>>                                      *scontextp++ = ':';
>>                              else
>>                                      *scontextp++ = ',';
>> -                            nm = sym_name(&policydb, SYM_CATS,
>> i);
>> +                            nm = sym_name(p, SYM_CATS, i);
>>                              strcpy(scontextp, nm);
>>                              scontextp += strlen(nm);
>>                              head = i;
>> @@ -140,7 +140,7 @@ void mls_sid_to_context(struct context *context,
>>                              *scontextp++ = '.';
>>                      else
>>                              *scontextp++ = ',';
>> -                    nm = sym_name(&policydb, SYM_CATS, prev);
>> +                    nm = sym_name(p, SYM_CATS, prev);
>>                      strcpy(scontextp, nm);
>>                      scontextp += strlen(nm);
>>              }
>> @@ -375,12 +375,13 @@ int mls_context_to_sid(struct policydb *pol,
>>   * the string `str'.  This function will allocate temporary memory
>> with the
>>   * given constraints of gfp_mask.
>>   */
>> -int mls_from_string(char *str, struct context *context, gfp_t
>> gfp_mask)
>> +int mls_from_string(struct policydb *p, char *str, struct context
>> *context,
>> +                gfp_t gfp_mask)
>>  {
>>      char *tmpstr, *freestr;
>>      int rc;
>>  
>> -    if (!policydb.mls_enabled)
>> +    if (!p->mls_enabled)
>>              return -EINVAL;
>>  
>>      /* we need freestr because mls_context_to_sid will change
>> @@ -389,7 +390,7 @@ int mls_from_string(char *str, struct context
>> *context, gfp_t gfp_mask)
>>      if (!tmpstr) {
>>              rc = -ENOMEM;
>>      } else {
>> -            rc = mls_context_to_sid(&policydb, ':', &tmpstr,
>> context,
>> +            rc = mls_context_to_sid(p, ':', &tmpstr, context,
>>                                      NULL, SECSID_NULL);
>>              kfree(freestr);
>>      }
>> @@ -417,10 +418,10 @@ int mls_range_set(struct context *context,
>>      return rc;
>>  }
>>  
>> -int mls_setup_user_range(struct context *fromcon, struct user_datum
>> *user,
>> -                     struct context *usercon)
>> +int mls_setup_user_range(struct policydb *p, struct context
>> *fromcon,
>> +                     struct user_datum *user, struct context
>> *usercon)
>>  {
>> -    if (policydb.mls_enabled) {
>> +    if (p->mls_enabled) {
>>              struct mls_level *fromcon_sen = &(fromcon-
>>> range.level[0]);
>>              struct mls_level *fromcon_clr = &(fromcon-
>>> range.level[1]);
>>              struct mls_level *user_low = &(user-
>>> range.level[0]);
>> @@ -460,7 +461,7 @@ int mls_setup_user_range(struct context *fromcon,
>> struct user_datum *user,
>>   * structure `c' from the values specified in the
>>   * policy `oldp' to the values specified in the policy `newp'.
>>   */
>> -int mls_convert_context(struct policydb *oldp,
>> +int mls_convert_context(struct policydb *p, struct policydb *oldp,
>>                      struct policydb *newp,
>>                      struct context *c)
>>  {
>> @@ -470,7 +471,7 @@ int mls_convert_context(struct policydb *oldp,
>>      struct ebitmap_node *node;
>>      int l, i;
>>  
>> -    if (!policydb.mls_enabled)
>> +    if (!p->mls_enabled)
>>              return 0;
>>  
>>      for (l = 0; l < 2; l++) {
>> @@ -503,7 +504,7 @@ int mls_convert_context(struct policydb *oldp,
>>      return 0;
>>  }
>>  
>> -int mls_compute_sid(struct context *scontext,
>> +int mls_compute_sid(struct policydb *p, struct context *scontext,
>>                  struct context *tcontext,
>>                  u16 tclass,
>>                  u32 specified,
>> @@ -515,7 +516,7 @@ int mls_compute_sid(struct context *scontext,
>>      struct class_datum *cladatum;
>>      int default_range = 0;
>>  
>> -    if (!policydb.mls_enabled)
>> +    if (!p->mls_enabled)
>>              return 0;
>>  
>>      switch (specified) {
>> @@ -524,12 +525,12 @@ int mls_compute_sid(struct context *scontext,
>>              rtr.source_type = scontext->type;
>>              rtr.target_type = tcontext->type;
>>              rtr.target_class = tclass;
>> -            r = hashtab_search(policydb.range_tr, &rtr);
>> +            r = hashtab_search(p->range_tr, &rtr);
>>              if (r)
>>                      return mls_range_set(newcontext, r);
>>  
>> -            if (tclass && tclass <= policydb.p_classes.nprim) {
>> -                    cladatum =
>> policydb.class_val_to_struct[tclass - 1];
>> +            if (tclass && tclass <= p->p_classes.nprim) {
>> +                    cladatum = p->class_val_to_struct[tclass -
>> 1];
>>                      if (cladatum)
>>                              default_range = cladatum-
>>> default_range;
>>              }
>> @@ -551,7 +552,7 @@ int mls_compute_sid(struct context *scontext,
>>  
>>              /* Fallthrough */
>>      case AVTAB_CHANGE:
>> -            if ((tclass == policydb.process_class) || (sock ==
>> true))
>> +            if ((tclass == p->process_class) || (sock == true))
>>                      /* Use the process MLS attributes. */
>>                      return mls_context_cpy(newcontext,
>> scontext);
>>              else
>> @@ -577,10 +578,10 @@ int mls_compute_sid(struct context *scontext,
>>   * NetLabel MLS sensitivity level field.
>>   *
>>   */
>> -void mls_export_netlbl_lvl(struct context *context,
>> +void mls_export_netlbl_lvl(struct policydb *p, struct context
>> *context,
>>                         struct netlbl_lsm_secattr *secattr)
>>  {
>> -    if (!policydb.mls_enabled)
>> +    if (!p->mls_enabled)
>>              return;
>>  
>>      secattr->attr.mls.lvl = context->range.level[0].sens - 1;
>> @@ -597,10 +598,10 @@ void mls_export_netlbl_lvl(struct context
>> *context,
>>   * NetLabel MLS sensitivity level into the context.
>>   *
>>   */
>> -void mls_import_netlbl_lvl(struct context *context,
>> +void mls_import_netlbl_lvl(struct policydb *p, struct context
>> *context,
>>                         struct netlbl_lsm_secattr *secattr)
>>  {
>> -    if (!policydb.mls_enabled)
>> +    if (!p->mls_enabled)
>>              return;
>>  
>>      context->range.level[0].sens = secattr->attr.mls.lvl + 1;
>> @@ -617,12 +618,12 @@ void mls_import_netlbl_lvl(struct context
>> *context,
>>   * MLS category field.  Returns zero on success, negative values on
>> failure.
>>   *
>>   */
>> -int mls_export_netlbl_cat(struct context *context,
>> +int mls_export_netlbl_cat(struct policydb *p, struct context
>> *context,
>>                        struct netlbl_lsm_secattr *secattr)
>>  {
>>      int rc;
>>  
>> -    if (!policydb.mls_enabled)
>> +    if (!p->mls_enabled)
>>              return 0;
>>  
>>      rc = ebitmap_netlbl_export(&context->range.level[0].cat,
>> @@ -645,12 +646,12 @@ int mls_export_netlbl_cat(struct context
>> *context,
>>   * negative values on failure.
>>   *
>>   */
>> -int mls_import_netlbl_cat(struct context *context,
>> +int mls_import_netlbl_cat(struct policydb *p, struct context
>> *context,
>>                        struct netlbl_lsm_secattr *secattr)
>>  {
>>      int rc;
>>  
>> -    if (!policydb.mls_enabled)
>> +    if (!p->mls_enabled)
>>              return 0;
>>  
>>      rc = ebitmap_netlbl_import(&context->range.level[0].cat,
>> diff --git a/security/selinux/ss/mls.h b/security/selinux/ss/mls.h
>> index 131d762..cb039c0 100644
>> --- a/security/selinux/ss/mls.h
>> +++ b/security/selinux/ss/mls.h
>> @@ -25,8 +25,9 @@
>>  #include "context.h"
>>  #include "policydb.h"
>>  
>> -int mls_compute_context_len(struct context *context);
>> -void mls_sid_to_context(struct context *context, char **scontext);
>> +int mls_compute_context_len(struct policydb *p, struct context
>> *context);
>> +void mls_sid_to_context(struct policydb *p, struct context *context,
>> +                    char **scontext);
>>  int mls_context_isvalid(struct policydb *p, struct context *c);
>>  int mls_range_isvalid(struct policydb *p, struct mls_range *r);
>>  int mls_level_isvalid(struct policydb *p, struct mls_level *l);
>> @@ -38,50 +39,55 @@ int mls_context_to_sid(struct policydb *p,
>>                     struct sidtab *s,
>>                     u32 def_sid);
>>  
>> -int mls_from_string(char *str, struct context *context, gfp_t
>> gfp_mask);
>> +int mls_from_string(struct policydb *p, char *str, struct context
>> *context,
>> +                gfp_t gfp_mask);
>>  
>>  int mls_range_set(struct context *context, struct mls_range *range);
>>  
>> -int mls_convert_context(struct policydb *oldp,
>> +int mls_convert_context(struct policydb *p, struct policydb *oldp,
>>                      struct policydb *newp,
>>                      struct context *context);
>>  
>> -int mls_compute_sid(struct context *scontext,
>> +int mls_compute_sid(struct policydb *p, struct context *scontext,
>>                  struct context *tcontext,
>>                  u16 tclass,
>>                  u32 specified,
>>                  struct context *newcontext,
>>                  bool sock);
>>  
>> -int mls_setup_user_range(struct context *fromcon, struct user_datum
>> *user,
>> -                     struct context *usercon);
>> +int mls_setup_user_range(struct policydb *p, struct context
>> *fromcon,
>> +                     struct user_datum *user, struct context
>> *usercon);
>>  
>>  #ifdef CONFIG_NETLABEL
>> -void mls_export_netlbl_lvl(struct context *context,
>> +void mls_export_netlbl_lvl(struct policydb *p, struct context
>> *context,
>>                         struct netlbl_lsm_secattr *secattr);
>> -void mls_import_netlbl_lvl(struct context *context,
>> +void mls_import_netlbl_lvl(struct policydb *p, struct context
>> *context,
>>                         struct netlbl_lsm_secattr *secattr);
>> -int mls_export_netlbl_cat(struct context *context,
>> +int mls_export_netlbl_cat(struct policydb *p, struct context
>> *context,
>>                        struct netlbl_lsm_secattr *secattr);
>> -int mls_import_netlbl_cat(struct context *context,
>> +int mls_import_netlbl_cat(struct policydb *p, struct context
>> *context,
>>                        struct netlbl_lsm_secattr *secattr);
>>  #else
>> -static inline void mls_export_netlbl_lvl(struct context *context,
>> +static inline void mls_export_netlbl_lvl(struct policydb *p,
>> +                                     struct context *context,
>>                                       struct netlbl_lsm_secattr
>> *secattr)
>>  {
>>      return;
>>  }
>> -static inline void mls_import_netlbl_lvl(struct context *context,
>> +static inline void mls_import_netlbl_lvl(struct policydb *p,
>> +                                     struct context *context,
>>                                       struct netlbl_lsm_secattr
>> *secattr)
>>  {
>>      return;
>>  }
>> -static inline int mls_export_netlbl_cat(struct context *context,
>> +static inline int mls_export_netlbl_cat(struct policydb *p,
>> +                                    struct context *context,
>>                                      struct netlbl_lsm_secattr
>> *secattr)
>>  {
>>      return -ENOMEM;
>>  }
>> -static inline int mls_import_netlbl_cat(struct context *context,
>> +static inline int mls_import_netlbl_cat(struct policydb *p,
>> +                                    struct context *context,
>>                                      struct netlbl_lsm_secattr
>> *secattr)
>>  {
>>      return -ENOMEM;
>> @@ -89,4 +95,3 @@ static inline int mls_import_netlbl_cat(struct
>> context *context,
>>  #endif
>>  
>>  #endif      /* _SS_MLS_H */
>> -
>> diff --git a/security/selinux/ss/services.c
>> b/security/selinux/ss/services.c
>> index 33cfe5d..47d8030 100644
>> --- a/security/selinux/ss/services.c
>> +++ b/security/selinux/ss/services.c
>> @@ -90,7 +90,7 @@ int selinux_policycap_nnp_nosuid_transition;
>>  static DEFINE_RWLOCK(policy_rwlock);
>>  
>>  static struct sidtab sidtab;
>> -struct policydb policydb;
>> +static struct policydb policydb;
>>  int ss_initialized;
>>  
>>  /*
>> @@ -117,8 +117,12 @@ struct selinux_mapping {
>>      u32 perms[sizeof(u32) * 8];
>>  };
>>  
>> -static struct selinux_mapping *current_mapping;
>> -static u16 current_mapping_size;
>> +struct shared_current_mapping {
>> +    struct selinux_mapping *current_mapping;
>> +    u16 current_mapping_size;
>> +};
>> +
>> +static struct shared_current_mapping *crm;
>>  
>>  static int selinux_set_mapping(struct policydb *pol,
>>                             struct security_class_mapping *map,
>> @@ -208,8 +212,8 @@ static int selinux_set_mapping(struct policydb
>> *pol,
>>  
>>  static u16 unmap_class(u16 tclass)
>>  {
>> -    if (tclass < current_mapping_size)
>> -            return current_mapping[tclass].value;
>> +    if (tclass < crm->current_mapping_size)
>> +            return crm->current_mapping[tclass].value;
>>  
>>      return tclass;
>>  }
>> @@ -221,8 +225,8 @@ static u16 map_class(u16 pol_value)
>>  {
>>      u16 i;
>>  
>> -    for (i = 1; i < current_mapping_size; i++) {
>> -            if (current_mapping[i].value == pol_value)
>> +    for (i = 1; i < crm->current_mapping_size; i++) {
>> +            if (crm->current_mapping[i].value == pol_value)
>>                      return i;
>>      }
>>  
>> @@ -232,27 +236,32 @@ static u16 map_class(u16 pol_value)
>>  static void map_decision(u16 tclass, struct av_decision *avd,
>>                       int allow_unknown)
>>  {
>> -    if (tclass < current_mapping_size) {
>> -            unsigned i, n = current_mapping[tclass].num_perms;
>> +    if (tclass < crm->current_mapping_size) {
>> +            unsigned int i, n = crm-
>>> current_mapping[tclass].num_perms;
>>              u32 result;
>>  
>>              for (i = 0, result = 0; i < n; i++) {
>> -                    if (avd->allowed &
>> current_mapping[tclass].perms[i])
>> +                    if (avd->allowed &
>> +                        crm->current_mapping[tclass].perms[i])
>>                              result |= 1<<i;
>> -                    if (allow_unknown &&
>> !current_mapping[tclass].perms[i])
>> +                    if (allow_unknown &&
>> +                        !crm->current_mapping[tclass].perms[i])
>>                              result |= 1<<i;
>>              }
>>              avd->allowed = result;
>>  
>>              for (i = 0, result = 0; i < n; i++)
>> -                    if (avd->auditallow &
>> current_mapping[tclass].perms[i])
>> +                    if (avd->auditallow &
>> +                        crm->current_mapping[tclass].perms[i])
>>                              result |= 1<<i;
>>              avd->auditallow = result;
>>  
>>              for (i = 0, result = 0; i < n; i++) {
>> -                    if (avd->auditdeny &
>> current_mapping[tclass].perms[i])
>> +                    if (avd->auditdeny &
>> +                        crm->current_mapping[tclass].perms[i])
>>                              result |= 1<<i;
>> -                    if (!allow_unknown &&
>> !current_mapping[tclass].perms[i])
>> +                    if (!allow_unknown &&
>> +                        !crm->current_mapping[tclass].perms[i])
>>                              result |= 1<<i;
>>              }
>>              /*
>> @@ -1211,7 +1220,7 @@ static int context_struct_to_string(struct
>> context *context, char **scontext, u3
>>      *scontext_len += strlen(sym_name(&policydb, SYM_USERS,
>> context->user - 1)) + 1;
>>      *scontext_len += strlen(sym_name(&policydb, SYM_ROLES,
>> context->role - 1)) + 1;
>>      *scontext_len += strlen(sym_name(&policydb, SYM_TYPES,
>> context->type - 1)) + 1;
>> -    *scontext_len += mls_compute_context_len(context);
>> +    *scontext_len += mls_compute_context_len(&policydb,
>> context);
>>  
>>      if (!scontext)
>>              return 0;
>> @@ -1230,7 +1239,7 @@ static int context_struct_to_string(struct
>> context *context, char **scontext, u3
>>              sym_name(&policydb, SYM_ROLES, context->role - 1),
>>              sym_name(&policydb, SYM_TYPES, context->type - 1));
>>  
>> -    mls_sid_to_context(context, &scontextp);
>> +    mls_sid_to_context(&policydb, context, &scontextp);
>>  
>>      *scontextp = 0;
>>  
>> @@ -1721,7 +1730,7 @@ static int security_compute_sid(u32 ssid,
>>  
>>      /* Set the MLS attributes.
>>         This is done last because it may allocate memory. */
>> -    rc = mls_compute_sid(scontext, tcontext, tclass, specified,
>> +    rc = mls_compute_sid(&policydb, scontext, tcontext, tclass,
>> specified,
>>                           &newcontext, sock);
>>      if (rc)
>>              goto out_unlock;
>> @@ -1935,7 +1944,7 @@ static int convert_context(u32 key,
>>  
>>      /* Convert the MLS fields if dealing with MLS policies */
>>      if (args->oldp->mls_enabled && args->newp->mls_enabled) {
>> -            rc = mls_convert_context(args->oldp, args->newp, c);
>> +            rc = mls_convert_context(&policydb, args->oldp,
>> args->newp, c);
>>              if (rc)
>>                      goto bad;
>>      } else if (args->oldp->mls_enabled && !args->newp-
>>> mls_enabled) {
>> @@ -2043,8 +2052,9 @@ int security_load_policy(void *data, size_t
>> len)
>>  {
>>      struct policydb *oldpolicydb, *newpolicydb;
>>      struct sidtab oldsidtab, newsidtab;
>> -    struct selinux_mapping *oldmap, *map = NULL;
>> +    struct selinux_mapping *oldmap = NULL, *map = NULL;
>>      struct convert_context_args args;
>> +    struct shared_current_mapping *new_mapping;
>>      u32 seqno;
>>      u16 map_size;
>>      int rc = 0;
>> @@ -2055,9 +2065,22 @@ int security_load_policy(void *data, size_t
>> len)
>>              rc = -ENOMEM;
>>              goto out;
>>      }
>> +    new_mapping = kzalloc(sizeof(struct shared_current_mapping),
>> +                          GFP_KERNEL);
>> +    if (!new_mapping) {
>> +            rc = -ENOMEM;
>> +            goto out;
>> +    }
>>      newpolicydb = oldpolicydb + 1;
>>  
>>      if (!ss_initialized) {
>> +            crm = kzalloc(sizeof(struct shared_current_mapping),
>> +                          GFP_KERNEL);
>> +            if (!crm) {
>> +                    rc = -ENOMEM;
>> +                    goto out;
>> +            }
>> +
>>              avtab_cache_init();
>>              ebitmap_cache_init();
>>              hashtab_cache_init();
>> @@ -2071,8 +2094,8 @@ int security_load_policy(void *data, size_t
>> len)
>>  
>>              policydb.len = len;
>>              rc = selinux_set_mapping(&policydb, secclass_map,
>> -                                     &current_mapping,
>> -                                     &current_mapping_size);
>> +                                     &crm->current_mapping,
>> +                                     &crm-
>>> current_mapping_size);
>>              if (rc) {
>>                      policydb_destroy(&policydb);
>>                      avtab_cache_destroy();
>> @@ -2164,9 +2187,9 @@ int security_load_policy(void *data, size_t
>> len)
>>      memcpy(&policydb, newpolicydb, sizeof(policydb));
>>      sidtab_set(&sidtab, &newsidtab);
>>      security_load_policycaps();
>> -    oldmap = current_mapping;
>> -    current_mapping = map;
>> -    current_mapping_size = map_size;
>> +    oldmap = crm->current_mapping;
>> +    crm->current_mapping = map;
>> +    crm->current_mapping_size = map_size;
>>      seqno = ++latest_granting;
>>      write_unlock_irq(&policy_rwlock);
>>  
>> @@ -2516,7 +2539,8 @@ int security_get_user_sids(u32 fromsid,
>>              ebitmap_for_each_positive_bit(&role->types, tnode,
>> j) {
>>                      usercon.type = j + 1;
>>  
>> -                    if (mls_setup_user_range(fromcon, user,
>> &usercon))
>> +                    if (mls_setup_user_range(&policydb, fromcon,
>> +                                             user, &usercon))
>>                              continue;
>>  
>>                      rc = sidtab_context_to_sid(&sidtab,
>> &usercon, &sid);
>> @@ -2580,7 +2604,7 @@ int security_get_user_sids(u32 fromsid,
>>   * cannot support xattr or use a fixed labeling behavior like
>>   * transition SIDs or task SIDs.
>>   *
>> - * The caller must acquire the policy_rwlock before calling this
>> function.
>> + * The caller must hold rcu before calling this function.
>>   */
>>  static inline int __security_genfs_sid(const char *fstype,
>>                                     char *path,
>> @@ -2639,7 +2663,7 @@ static inline int __security_genfs_sid(const
>> char *fstype,
>>   * @sclass: file security class
>>   * @sid: SID for path
>>   *
>> - * Acquire policy_rwlock before calling __security_genfs_sid() and
>> release
>> + * Hold rcu before calling __security_genfs_sid() and release
>>   * it afterward.
>>   */
>>  int security_genfs_sid(const char *fstype,
>> @@ -3214,7 +3238,8 @@ int selinux_audit_rule_init(u32 field, u32 op,
>> char *rulestr, void **vrule)
>>      case AUDIT_SUBJ_CLR:
>>      case AUDIT_OBJ_LEV_LOW:
>>      case AUDIT_OBJ_LEV_HIGH:
>> -            rc = mls_from_string(rulestr, &tmprule->au_ctxt,
>> GFP_ATOMIC);
>> +            rc = mls_from_string(&policydb, rulestr, &tmprule-
>>> au_ctxt,
>> +                                 GFP_ATOMIC);
>>              if (rc)
>>                      goto out;
>>              break;
>> @@ -3464,9 +3489,10 @@ int security_netlbl_secattr_to_sid(struct
>> netlbl_lsm_secattr *secattr,
>>              ctx_new.user = ctx->user;
>>              ctx_new.role = ctx->role;
>>              ctx_new.type = ctx->type;
>> -            mls_import_netlbl_lvl(&ctx_new, secattr);
>> +            mls_import_netlbl_lvl(&policydb, &ctx_new, secattr);
>>              if (secattr->flags & NETLBL_SECATTR_MLS_CAT) {
>> -                    rc = mls_import_netlbl_cat(&ctx_new,
>> secattr);
>> +                    rc = mls_import_netlbl_cat(&policydb,
>> &ctx_new,
>> +                                               secattr);
>>                      if (rc)
>>                              goto out;
>>              }
>> @@ -3526,8 +3552,8 @@ int security_netlbl_sid_to_secattr(u32 sid,
>> struct netlbl_lsm_secattr *secattr)
>>  
>>      secattr->attr.secid = sid;
>>      secattr->flags |= NETLBL_SECATTR_DOMAIN_CPY |
>> NETLBL_SECATTR_SECID;
>> -    mls_export_netlbl_lvl(ctx, secattr);
>> -    rc = mls_export_netlbl_cat(ctx, secattr);
>> +    mls_export_netlbl_lvl(&policydb, ctx, secattr);
>> +    rc = mls_export_netlbl_cat(&policydb, ctx, secattr);
>>  out:
>>      read_unlock(&policy_rwlock);
>>      return rc;
>> diff --git a/security/selinux/ss/services.h
>> b/security/selinux/ss/services.h
>> index 356bdd3..50c7ceb 100644
>> --- a/security/selinux/ss/services.h
>> +++ b/security/selinux/ss/services.h
>> @@ -10,8 +10,6 @@
>>  #include "policydb.h"
>>  #include "sidtab.h"
>>  
>> -extern struct policydb policydb;
>> -
>>  void services_compute_xperms_drivers(struct extended_perms *xperms,
>>                              struct avtab_node *node);
>>  
>> @@ -19,4 +17,3 @@ void services_compute_xperms_decision(struct
>> extended_perms_decision *xpermd,
>>                                      struct avtab_node *node);
>>  
>>  #endif      /* _SS_SERVICES_H_ */
>> -




Reply via email to