On 11/16/2016 02:32 PM, William Roberts wrote: > sediff reports no delta between policies built on master and these 2 patches. Not possible. checkpolicy segfaults with these patches. Probably didn't rebuild it after rebuilding libsepol. Anyway, you can just use cmp to compare the policies here; they should be byte-for-byte identical. > > On Wed, Nov 16, 2016 at 11:12 AM, <william.c.roberts@xxxxxxxxx> wrote: >> From: William Roberts <william.c.roberts@xxxxxxxxx> >> >> General clean up for expand_avrule_helper: >> 1. Stop converting AVRULE specification to AVTAB specification, they are the >> same. >> 2. Clean up if/else logic, collapse with a switch. >> 3. Move xperms allocation and manipulation to its own helper. >> 4. Stop checking handle for NULL, handle must never be NULL. Previous code and >> current code use ERR(), which depends on handle. >> 5. Only write avkey for values that change. >> >> Signed-off-by: William Roberts <william.c.roberts@xxxxxxxxx> >> --- >> libsepol/src/expand.c | 124 ++++++++++++++++++++++++-------------------------- >> 1 file changed, 59 insertions(+), 65 deletions(-) >> >> diff --git a/libsepol/src/expand.c b/libsepol/src/expand.c >> index 3e16f58..81a827e 100644 >> --- a/libsepol/src/expand.c >> +++ b/libsepol/src/expand.c >> @@ -1781,6 +1781,41 @@ static int expand_terule_helper(sepol_handle_t * handle, >> return EXPAND_RULE_SUCCESS; >> } >> >> +/* 0 for success -1 indicates failure */ >> +static int allocate_xperms(sepol_handle_t * handle, avtab_datum_t * avdatump, >> + av_extended_perms_t * extended_perms) >> +{ >> + unsigned int i; >> + >> + avtab_extended_perms_t *xperms = avdatump->xperms; >> + if (!xperms) { >> + xperms = (avtab_extended_perms_t *) >> + calloc(1, sizeof(avtab_extended_perms_t)); >> + if (!xperms) { >> + ERR(handle, "Out of memory!"); >> + return -1; >> + } >> + avdatump->xperms = xperms; >> + } >> + >> + switch (extended_perms->specified) { >> + case AVRULE_XPERMS_IOCTLFUNCTION: >> + xperms->specified = AVTAB_XPERMS_IOCTLFUNCTION; >> + break; >> + case AVRULE_XPERMS_IOCTLDRIVER: >> + xperms->specified = AVTAB_XPERMS_IOCTLDRIVER; >> + break; >> + default: >> + return -1; >> + } >> + >> + xperms->driver = extended_perms->driver; >> + for (i = 0; i < ARRAY_SIZE(xperms->perms); i++) >> + xperms->perms[i] |= extended_perms->perms[i]; >> + >> + return 0; >> +} >> + >> static int expand_avrule_helper(sepol_handle_t * handle, >> uint32_t specified, >> cond_av_list_t ** cond, >> @@ -1790,44 +1825,20 @@ static int expand_avrule_helper(sepol_handle_t * handle, >> { >> avtab_key_t avkey; >> avtab_datum_t *avdatump; >> - avtab_extended_perms_t *xperms; >> avtab_ptr_t node; >> class_perm_node_t *cur; >> - uint32_t spec = 0; >> - unsigned int i; >> >> - if (specified & AVRULE_ALLOWED) { >> - spec = AVTAB_ALLOWED; >> - } else if (specified & AVRULE_AUDITALLOW) { >> - spec = AVTAB_AUDITALLOW; >> - } else if (specified & AVRULE_AUDITDENY) { >> - spec = AVTAB_AUDITDENY; >> - } else if (specified & AVRULE_DONTAUDIT) { >> - if (handle && handle->disable_dontaudit) >> - return EXPAND_RULE_SUCCESS; >> - spec = AVTAB_AUDITDENY; >> - } else if (specified & AVRULE_NEVERALLOW) { >> - spec = AVTAB_NEVERALLOW; >> - } else if (specified & AVRULE_XPERMS_ALLOWED) { >> - spec = AVTAB_XPERMS_ALLOWED; >> - } else if (specified & AVRULE_XPERMS_AUDITALLOW) { >> - spec = AVTAB_XPERMS_AUDITALLOW; >> - } else if (specified & AVRULE_XPERMS_DONTAUDIT) { >> - if (handle && handle->disable_dontaudit) >> + /* bail early if dontaudit's are disabled and it's a dontaudit rule */ >> + if ((specified & (AVRULE_DONTAUDIT|AVRULE_XPERMS_DONTAUDIT)) && handle->disable_dontaudit) >> return EXPAND_RULE_SUCCESS; >> - spec = AVTAB_XPERMS_DONTAUDIT; >> - } else if (specified & AVRULE_XPERMS_NEVERALLOW) { >> - spec = AVTAB_XPERMS_NEVERALLOW; >> - } else { >> - assert(0); /* unreachable */ >> - } >> + >> + avkey.source_type = stype + 1; >> + avkey.target_type = ttype + 1; >> + avkey.specified = specified; >> >> cur = perms; >> while (cur) { >> - avkey.source_type = stype + 1; >> - avkey.target_type = ttype + 1; >> avkey.target_class = cur->tclass; >> - avkey.specified = spec; >> >> node = find_avtab_node(handle, avtab, &avkey, cond, extended_perms); >> if (!node) >> @@ -1839,13 +1850,15 @@ static int expand_avrule_helper(sepol_handle_t * handle, >> } >> >> avdatump = &node->datum; >> - if (specified & AVRULE_ALLOWED) { >> - avdatump->data |= cur->data; >> - } else if (specified & AVRULE_AUDITALLOW) { >> + switch (specified) { >> + case AVRULE_ALLOWED: >> + case AVRULE_AUDITALLOW: >> + case AVRULE_NEVERALLOW: >> avdatump->data |= cur->data; >> - } else if (specified & AVRULE_NEVERALLOW) { >> - avdatump->data |= cur->data; >> - } else if (specified & AVRULE_AUDITDENY) { >> + break; >> + case AVRULE_DONTAUDIT: >> + cur->data = ~cur->data; >> + case AVRULE_AUDITDENY: >> /* Since a '0' in an auditdeny mask represents >> * a permission we do NOT want to audit >> * (dontaudit), we use the '&' operand to >> @@ -1854,35 +1867,16 @@ static int expand_avrule_helper(sepol_handle_t * handle, >> * auditallow cases). >> */ >> avdatump->data &= cur->data; >> - } else if (specified & AVRULE_DONTAUDIT) { >> - avdatump->data &= ~cur->data; >> - } else if (specified & AVRULE_XPERMS) { >> - xperms = avdatump->xperms; >> - if (!xperms) { >> - xperms = (avtab_extended_perms_t *) >> - calloc(1, sizeof(avtab_extended_perms_t)); >> - if (!xperms) { >> - ERR(handle, "Out of memory!"); >> - return -1; >> - } >> - avdatump->xperms = xperms; >> - } >> - >> - switch (extended_perms->specified) { >> - case AVRULE_XPERMS_IOCTLFUNCTION: >> - xperms->specified = AVTAB_XPERMS_IOCTLFUNCTION; >> - break; >> - case AVRULE_XPERMS_IOCTLDRIVER: >> - xperms->specified = AVTAB_XPERMS_IOCTLDRIVER; >> - break; >> - default: >> - return -1; >> - } >> - >> - xperms->driver = extended_perms->driver; >> - for (i = 0; i < ARRAY_SIZE(xperms->perms); i++) >> - xperms->perms[i] |= extended_perms->perms[i]; >> - } else { >> + break; >> + case AVRULE_XPERMS_ALLOWED: >> + case AVRULE_XPERMS_AUDITALLOW: >> + case AVRULE_XPERMS_DONTAUDIT: >> + case AVRULE_XPERMS_NEVERALLOW: >> + if (allocate_xperms(handle, avdatump, extended_perms)) >> + return EXPAND_RULE_ERROR; >> + break; >> + default: >> + ERR(handle, "Unkown specification: %x\n", specified); >> assert(0); /* should never occur */ >> } >> >> -- >> 2.7.4 >> >> _______________________________________________ >> Selinux mailing list >> Selinux@xxxxxxxxxxxxx >> To unsubscribe, send email to Selinux-leave@xxxxxxxxxxxxx. >> To get help, send an email containing "help" to Selinux-request@xxxxxxxxxxxxx. > > > _______________________________________________ Selinux mailing list Selinux@xxxxxxxxxxxxx To unsubscribe, send email to Selinux-leave@xxxxxxxxxxxxx. To get help, send an email containing "help" to Selinux-request@xxxxxxxxxxxxx.