mirror of
https://github.com/SELinuxProject/selinux
synced 2025-01-23 22:02:45 +00:00
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 <sds@tycho.nsa.gov>
This commit is contained in:
parent
994db9d390
commit
7f1ec68362
@ -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 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)
|
int render_operations(avtab_operations_t *ops, avtab_key_t * key, FILE * fp)
|
||||||
{
|
{
|
||||||
uint16_t value;
|
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, "{ ");
|
fprintf(fp, "{ ");
|
||||||
for (bit = 0; bit < sizeof(ops->perms)*8; bit++) {
|
for (bit = 0; bit < sizeof(ops->perms)*8; bit++) {
|
||||||
if (!operation_perm_test(bit, ops->perms))
|
if (!operation_perm_test(bit, ops->perms))
|
||||||
continue;
|
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) {
|
if (key->specified & AVTAB_OPNUM) {
|
||||||
value = ops->type<<8 | bit;
|
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) {
|
} else if (key->specified & AVTAB_OPTYPE) {
|
||||||
value = bit << 8;
|
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, "}");
|
fprintf(fp, "}");
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user