/* *ReturnthelengthinbytesfortheMLSfieldsofthe *securitycontextstringrepresentationof`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 (!p->mls_enabled) return0;
len = 1; /* for the beginning ":" */ for (l = 0; l < 2; l++) {
u32 index_sens = context->range.level[l].sens;
len += strlen(sym_name(p, SYM_LEVELS, index_sens - 1));
/* categories */
head = -2;
prev = -2;
e = &context->range.level[l].cat;
ebitmap_for_each_positive_bit(e, node, i)
{ if (i - prev > 1) { /* one or more negative bits are skipped */ if (head != prev) {
nm = sym_name(p, SYM_CATS, prev);
len += strlen(nm) + 1;
}
nm = sym_name(p, SYM_CATS, i);
len += strlen(nm) + 1;
head = i;
}
prev = i;
} if (prev != head) {
nm = sym_name(p, SYM_CATS, prev);
len += strlen(nm) + 1;
} if (l == 0) { if (mls_level_eq(&context->range.level[0],
&context->range.level[1])) break; else
len++;
}
}
/* *UsermustbeauthorizedfortheMLSrange.
*/ if (!c->user || c->user > p->p_users.nprim) return0;
usrdatum = p->user_val_to_struct[c->user - 1]; if (!mls_range_contains(usrdatum->range, c->range)) return0; /* user may not be associated with range */
/* For each part of the range: */ for (l = 0; l < 2; l++) { /* Split sensitivity and category set. */
sensitivity = rangep[l]; if (sensitivity == NULL) break;
next_cat = strchr(sensitivity, ':'); if (next_cat)
*(next_cat++) = '\0';
/* If range, set all categories in range */ if (rngptr == NULL) continue;
rngdatum = symtab_search(&pol->p_cats, rngptr); if (!rngdatum) return -EINVAL;
if (catdatum->value >= rngdatum->value) return -EINVAL;
for (i = catdatum->value; i < rngdatum->value; i++) {
rc = ebitmap_set_bit(
&context->range.level[l].cat, i, 1); if (rc) return rc;
}
}
}
/* If we didn't see a '-', the range start is also the range end. */ if (rangep[1] == NULL) {
context->range.level[1].sens = context->range.level[0].sens;
rc = ebitmap_cpy(&context->range.level[1].cat,
&context->range.level[0].cat); if (rc) return rc;
}
/* *CopiestheMLSrange`range'into`context'.
*/ int mls_range_set(struct context *context, struct mls_range *range)
{ int l, rc = 0;
/* Copy the MLS range into the context */ for (l = 0; l < 2; l++) {
context->range.level[l].sens = range->level[l].sens;
rc = ebitmap_cpy(&context->range.level[l].cat,
&range->level[l].cat); if (rc) break;
}
switch (specified) { case AVTAB_TRANSITION: /* Look for a range transition rule. */
rtr.source_type = scontext->type;
rtr.target_type = tcontext->type;
rtr.target_class = tclass;
r = policydb_rangetr_search(p, &rtr); if (r) return mls_range_set(newcontext, r);
if (tclass && tclass <= p->p_classes.nprim) {
cladatum = p->class_val_to_struct[tclass - 1]; if (cladatum)
default_range = cladatum->default_range;
}
switch (default_range) { case DEFAULT_SOURCE_LOW: return mls_context_cpy_low(newcontext, scontext); case DEFAULT_SOURCE_HIGH: return mls_context_cpy_high(newcontext, scontext); case DEFAULT_SOURCE_LOW_HIGH: return mls_context_cpy(newcontext, scontext); case DEFAULT_TARGET_LOW: return mls_context_cpy_low(newcontext, tcontext); case DEFAULT_TARGET_HIGH: return mls_context_cpy_high(newcontext, tcontext); case DEFAULT_TARGET_LOW_HIGH: return mls_context_cpy(newcontext, tcontext); case DEFAULT_GLBLUB: return mls_context_glblub(newcontext, scontext,
tcontext);
}
fallthrough; case AVTAB_CHANGE: if ((tclass == p->process_class) || sock) /* Use the process MLS attributes. */ return mls_context_cpy(newcontext, scontext); else /* Use the process effective MLS attributes. */ return mls_context_cpy_low(newcontext, scontext); case AVTAB_MEMBER: /* Use the process effective MLS attributes. */ return mls_context_cpy_low(newcontext, scontext);
} return -EINVAL;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.