Merge tag 'selinux-pr-20200621' of git://git.kernel.org/pub/scm/linux/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
This commit is contained in:
@@ -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];
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -2888,8 +2888,12 @@ err:
|
||||
if (*names) {
|
||||
for (i = 0; i < *len; i++)
|
||||
kfree((*names)[i]);
|
||||
kfree(*names);
|
||||
}
|
||||
kfree(*values);
|
||||
*len = 0;
|
||||
*names = NULL;
|
||||
*values = NULL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user