Skip to content

Commit

Permalink
Merge tag 'selinux-pr-20200621' of git://git.kernel.org/pub/scm/linux…
Browse files Browse the repository at this point in the history
…/kernel/git/pcmoore/selinux

Pull SELinux fixes from Paul Moore:
 "Three small patches to fix problems in the SELinux code, all found via
  clang.

  Two patches fix potential double-free conditions and one fixes an
  undefined return value"

* tag 'selinux-pr-20200621' of git://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/selinux:
  selinux: fix undefined return of cond_evaluate_expr
  selinux: fix a double free in cond_read_node()/cond_read_list()
  selinux: fix double free
  • Loading branch information
torvalds committed Jun 21, 2020
2 parents 16f4aa9 + 8231b0b commit 817d914
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 13 deletions.
21 changes: 8 additions & 13 deletions security/selinux/ss/conditional.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@ static int cond_evaluate_expr(struct policydb *p, struct cond_expr *expr)
int s[COND_EXPR_MAXDEPTH];
int sp = -1;

if (expr->len == 0)
return -1;

for (i = 0; i < expr->len; i++) {
struct cond_expr_node *node = &expr->nodes[i];

Expand Down Expand Up @@ -392,27 +395,19 @@ static int cond_read_node(struct policydb *p, struct cond_node *node, void *fp)

rc = next_entry(buf, fp, sizeof(u32) * 2);
if (rc)
goto err;
return rc;

expr->expr_type = le32_to_cpu(buf[0]);
expr->bool = le32_to_cpu(buf[1]);

if (!expr_node_isvalid(p, expr)) {
rc = -EINVAL;
goto err;
}
if (!expr_node_isvalid(p, expr))
return -EINVAL;
}

rc = cond_read_av_list(p, fp, &node->true_list, NULL);
if (rc)
goto err;
rc = cond_read_av_list(p, fp, &node->false_list, &node->true_list);
if (rc)
goto err;
return 0;
err:
cond_node_destroy(node);
return rc;
return rc;
return cond_read_av_list(p, fp, &node->false_list, &node->true_list);
}

int cond_read_list(struct policydb *p, void *fp)
Expand Down
4 changes: 4 additions & 0 deletions security/selinux/ss/services.c
Original file line number Diff line number Diff line change
Expand Up @@ -2888,8 +2888,12 @@ int security_get_bools(struct selinux_state *state,
if (*names) {
for (i = 0; i < *len; i++)
kfree((*names)[i]);
kfree(*names);
}
kfree(*values);
*len = 0;
*names = NULL;
*values = NULL;
goto out;
}

Expand Down

0 comments on commit 817d914

Please sign in to comment.