Commit 253050f5 authored by Ondrej Mosnacek's avatar Ondrej Mosnacek Committed by Paul Moore

selinux: factor out loop body from filename_trans_read()

It simplifies cleanup in the error path. This will be extra useful in
later patch.
Signed-off-by: default avatarOndrej Mosnacek <omosnace@redhat.com>
Acked-by: default avatarStephen Smalley <sds@tycho.nsa.gov>
Signed-off-by: default avatarPaul Moore <paul@paul-moore.com>
parent 4ca54d3d
...@@ -1880,88 +1880,92 @@ static int range_read(struct policydb *p, void *fp) ...@@ -1880,88 +1880,92 @@ static int range_read(struct policydb *p, void *fp)
return rc; return rc;
} }
static int filename_trans_read(struct policydb *p, void *fp) static int filename_trans_read_one(struct policydb *p, void *fp)
{ {
struct filename_trans *ft; struct filename_trans *ft;
struct filename_trans_datum *otype; struct filename_trans_datum *otype = NULL;
char *name; char *name = NULL;
u32 nel, len; u32 len;
__le32 buf[4]; __le32 buf[4];
int rc, i; int rc;
if (p->policyvers < POLICYDB_VERSION_FILENAME_TRANS) ft = kzalloc(sizeof(*ft), GFP_KERNEL);
return 0; if (!ft)
return -ENOMEM;
rc = -ENOMEM;
otype = kmalloc(sizeof(*otype), GFP_KERNEL);
if (!otype)
goto out;
/* length of the path component string */
rc = next_entry(buf, fp, sizeof(u32)); rc = next_entry(buf, fp, sizeof(u32));
if (rc) if (rc)
return rc; goto out;
nel = le32_to_cpu(buf[0]); len = le32_to_cpu(buf[0]);
for (i = 0; i < nel; i++) {
otype = NULL;
name = NULL;
rc = -ENOMEM;
ft = kzalloc(sizeof(*ft), GFP_KERNEL);
if (!ft)
goto out;
rc = -ENOMEM;
otype = kmalloc(sizeof(*otype), GFP_KERNEL);
if (!otype)
goto out;
/* length of the path component string */
rc = next_entry(buf, fp, sizeof(u32));
if (rc)
goto out;
len = le32_to_cpu(buf[0]);
/* path component string */ /* path component string */
rc = str_read(&name, GFP_KERNEL, fp, len); rc = str_read(&name, GFP_KERNEL, fp, len);
if (rc) if (rc)
goto out; goto out;
ft->name = name; ft->name = name;
rc = next_entry(buf, fp, sizeof(u32) * 4); rc = next_entry(buf, fp, sizeof(u32) * 4);
if (rc) if (rc)
goto out; goto out;
ft->stype = le32_to_cpu(buf[0]); ft->stype = le32_to_cpu(buf[0]);
ft->ttype = le32_to_cpu(buf[1]); ft->ttype = le32_to_cpu(buf[1]);
ft->tclass = le32_to_cpu(buf[2]); ft->tclass = le32_to_cpu(buf[2]);
otype->otype = le32_to_cpu(buf[3]); otype->otype = le32_to_cpu(buf[3]);
rc = ebitmap_set_bit(&p->filename_trans_ttypes, ft->ttype, 1); rc = ebitmap_set_bit(&p->filename_trans_ttypes, ft->ttype, 1);
if (rc) if (rc)
goto out; goto out;
rc = hashtab_insert(p->filename_trans, ft, otype); rc = hashtab_insert(p->filename_trans, ft, otype);
if (rc) { if (rc) {
/* /*
* Do not return -EEXIST to the caller, or the system * Do not return -EEXIST to the caller, or the system
* will not boot. * will not boot.
*/ */
if (rc != -EEXIST) if (rc == -EEXIST)
goto out; rc = 0;
/* But free memory to avoid memory leak. */ goto out;
kfree(ft);
kfree(name);
kfree(otype);
}
} }
hash_eval(p->filename_trans, "filenametr");
return 0; return 0;
out: out:
kfree(ft); kfree(ft);
kfree(name); kfree(name);
kfree(otype); kfree(otype);
return rc; return rc;
} }
static int filename_trans_read(struct policydb *p, void *fp)
{
u32 nel;
__le32 buf[1];
int rc, i;
if (p->policyvers < POLICYDB_VERSION_FILENAME_TRANS)
return 0;
rc = next_entry(buf, fp, sizeof(u32));
if (rc)
return rc;
nel = le32_to_cpu(buf[0]);
for (i = 0; i < nel; i++) {
rc = filename_trans_read_one(p, fp);
if (rc)
return rc;
}
hash_eval(p->filename_trans, "filenametr");
return 0;
}
static int genfs_read(struct policydb *p, void *fp) static int genfs_read(struct policydb *p, void *fp)
{ {
int i, j, rc; int i, j, rc;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment