From 7f1ec68362a36f1a63350295f2f9f7f420a55996 Mon Sep 17 00:00:00 2001 From: Jeff Vander Stoep Date: Mon, 27 Apr 2015 15:05:31 -0700 Subject: [PATCH] dispol: display operations as ranges Displays operations ranges more concisely. E.g. { 0x8901-0x8930 } instead of { 0x8901 0x8902 0x8903 0x8904 80x8905 0x0806 ... 0x8930 } Signed-off-by: Stephen Smalley --- checkpolicy/test/dispol.c | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/checkpolicy/test/dispol.c b/checkpolicy/test/dispol.c index 133759fa..157361a4 100644 --- a/checkpolicy/test/dispol.c +++ b/checkpolicy/test/dispol.c @@ -55,23 +55,50 @@ int render_access_mask(uint32_t mask, avtab_key_t * key, policydb_t * p, } #define operation_perm_test(x, p) (1 & (p[x >> 5] >> (x & 0x1f))) +#define next_bit_in_range(i, p) \ + ((i + 1 < sizeof(p)*8) && operation_perm_test((i + 1), p)) int render_operations(avtab_operations_t *ops, avtab_key_t * key, FILE * fp) { uint16_t value; - unsigned int bit = 0; + uint16_t low_bit; + uint16_t low_value; + unsigned int bit; + unsigned int in_range = 0; fprintf(fp, "{ "); for (bit = 0; bit < sizeof(ops->perms)*8; bit++) { if (!operation_perm_test(bit, ops->perms)) continue; + + if (in_range && next_bit_in_range(bit, ops->perms)) { + /* continue until high value found */ + continue; + } else if (next_bit_in_range(bit, ops->perms)) { + /* low value */ + low_bit = bit; + in_range = 1; + continue; + } + if (key->specified & AVTAB_OPNUM) { value = ops->type<<8 | bit; - fprintf(fp, "0x%hx ", value); + low_value = ops->type<<8 | low_bit; + if (in_range) + fprintf(fp, "0x%hx-0x%hx ", low_value, value); + else + fprintf(fp, "0x%hx ", value); } else if (key->specified & AVTAB_OPTYPE) { value = bit << 8; - fprintf(fp, "0x%hx-0x%hx ", value, value|0xff); + low_value = low_bit << 8; + if (in_range) + fprintf(fp, "0x%hx-0x%hx ", low_value, (uint16_t) (value|0xff)); + else + fprintf(fp, "0x%hx-0x%hx ", value, (uint16_t) (value|0xff)); + } + if (in_range) + in_range = 0; } fprintf(fp, "}"); return 0;