[PATCH 3/6 v7] libsepol/cil: Add overflow checks for circular reference checks
James Carter <[email protected]>
| Newsgroups | org.kernel.vger.selinux |
|---|---|
| Message-ID | <[email protected]> |
When resolving aliases a check is made for circular references. Similar checks for circular references are made for user, role, and type bounds and for class permissions (class mappings and class permission sets make circular references possible). These checks use the common idiom of using "limit *= 2", but there is no check for overflow. Use the __builtin_mul_overflow() family of functions that will do the multiplication while checking for overflow. Acked-by: Stephen Smalley <[email protected]> Signed-off-by: James Carter <[email protected]> --- v7: No changes libsepol/cil/src/cil_resolve_ast.c | 5 ++++- libsepol/cil/src/cil_verify.c | 20 ++++++++++++++++---- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/libsepol/cil/src/cil_resolve_ast.c b/libsepol/cil/src/cil_resolve_ast.c index bdbb871a..a805ca17 100644 --- a/libsepol/cil/src/cil_resolve_ast.c +++ b/libsepol/cil/src/cil_resolve_ast.c @@ -652,8 +652,11 @@ static int cil_resolve_alias_to_actual(struct cil_tree_node *current, } if (steps == limit) { + if (__builtin_smul_overflow(limit, 2, &limit)) { + cil_tree_log(current, CIL_ERR, "Overflow"); + return SEPOL_ERR; + } steps = 0; - limit *= 2; a2 = a1; } } diff --git a/libsepol/cil/src/cil_verify.c b/libsepol/cil/src/cil_verify.c index eb732e44..699cdccf 100644 --- a/libsepol/cil/src/cil_verify.c +++ b/libsepol/cil/src/cil_verify.c @@ -975,8 +975,11 @@ static int __cil_verify_user_pre_eval(struct cil_tree_node *node) } if (steps == limit) { + if (__builtin_smul_overflow(limit, 2, &limit)) { + cil_log(CIL_ERR, "Overflow\n"); + goto exit; + } steps = 0; - limit *= 2; u1 = u2; } @@ -1028,8 +1031,11 @@ static int __cil_verify_role(struct cil_tree_node *node) } if (steps == limit) { + if (__builtin_smul_overflow(limit, 2, &limit)) { + cil_log(CIL_ERR, "Overflow\n"); + goto exit; + } steps = 0; - limit *= 2; r1 = r2; } @@ -1060,8 +1066,11 @@ static int __cil_verify_type(struct cil_tree_node *node) } if (steps == limit) { + if (__builtin_smul_overflow(limit, 2, &limit)) { + cil_log(CIL_ERR, "Overflow\n"); + goto exit; + } steps = 0; - limit *= 2; t1 = t2; } @@ -2112,8 +2121,11 @@ static int __cil_verify_classperms(struct cil_list *classperms, } else { steps++; if (steps > limit) { + if (__builtin_umul_overflow(limit, 2, &limit)) { + cil_log(CIL_ERR, "Overflow\n"); + goto exit; + } steps = 1; - limit *= 2; orig = cur; } } -- 2.55.0