Skip to content

Commit 9bcd61d

Browse files
committed
sepolgen: Support named xperms
The `allowxperm` et. al. directives take a magical integer for one of the fields, which hinders readability. This commit adds support for basic names for a number or group of numbers. Notably, this does not support recursive definition of names, as that would require a larger grammar re-write to avoid parsing conflicts. Signed-off-by: Chris Lindee <[email protected]>
1 parent 5798cf4 commit 9bcd61d

File tree

2 files changed

+34
-2
lines changed

2 files changed

+34
-2
lines changed

python/sepolgen/src/sepolgen/refparser.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,7 @@ def p_statement(p):
349349
'''statement : interface
350350
| template
351351
| obj_perm_set
352+
| obj_xperm_set
352353
| policy
353354
| policy_module_stmt
354355
| module_stmt
@@ -502,7 +503,15 @@ def p_obj_perm_set(p):
502503
s = refpolicy.ObjPermSet(p[4])
503504
s.perms = p[8]
504505
p[0] = s
505-
506+
507+
def p_obj_xperm_set(p):
508+
'obj_xperm_set : DEFINE OPAREN TICK IDENTIFIER SQUOTE COMMA TICK xperm_set_base SQUOTE CPAREN'
509+
ids = refpolicy.XpermIdentifierDict()
510+
ids.set(p[4], p[8])
511+
512+
p[0] = refpolicy.ObjPermSet(p[4])
513+
p[0].perms = set(p[8])
514+
506515
#
507516
# Basic SELinux policy language
508517
#
@@ -1049,8 +1058,13 @@ def p_nested_xperm_list(p):
10491058
def p_nested_xperm_element(p):
10501059
'''nested_xperm_element : xperm_set_base
10511060
| nested_xperm_set
1061+
| IDENTIFIER
10521062
'''
1053-
p[0] = p[1]
1063+
if isinstance(p[1], refpolicy.XpermSet()):
1064+
p[0] = p[1]
1065+
else:
1066+
ids = refpolicy.XpermIdentifierDict()
1067+
p[0] = ids.get(p[1])
10541068

10551069
def p_xperm_set_base(p):
10561070
'''xperm_set_base : xperm_number

python/sepolgen/src/sepolgen/refpolicy.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,24 @@ def to_string(self):
413413

414414
return "%s{ %s }" % (compl, " ".join(vals))
415415

416+
class XpermIdentifierDict(dict):
417+
"""Extended permission set identifier mapping.
418+
419+
This singleton class holds the mappings between named
420+
extended permission and their numberic value.
421+
"""
422+
def __new__(cls):
423+
if not hasattr(cls, 'instance'):
424+
cls.instance = super(XpermIdentifierDict, cls).__new__(cls)
425+
return cls.instance
426+
427+
def set(self, key, value):
428+
# TODO: warn about redefiniition
429+
self[key] = value
430+
431+
def get(self, key):
432+
return self[key]
433+
416434
# Basic statements
417435

418436
class TypeAttribute(Leaf):

0 commit comments

Comments
 (0)