Skip to content

Commit

Permalink
mcstrans: fix memory leaks reported by clang's static analyzer
Browse files Browse the repository at this point in the history
There are many memory leaks in mcstrans. Clean them up in order to
reduce the noise in clang's static analyzer report. Some are remaining,
because they are more complex to fix.

Signed-off-by: Nicolas Iooss <nicolas.iooss@m4x.org>
  • Loading branch information
fishilico committed Jul 4, 2018
1 parent f9a56ed commit d0ca433
Showing 1 changed file with 56 additions and 12 deletions.
68 changes: 56 additions & 12 deletions mcstrans/src/mcstrans.c
Expand Up @@ -708,6 +708,7 @@ append(affix_t **affixes, const char *val) {

err:
log_error("allocation error %s", strerror(errno));
free(affix);
return -1;
}

Expand Down Expand Up @@ -1517,21 +1518,26 @@ trans_context(const security_context_t incon, security_context_t *rcon) {
} else {
trans = compute_trans_from_raw(range, domain);
if (trans)
if (add_cache(domain, range, trans) < 0)
if (add_cache(domain, range, trans) < 0) {
free(range);
return -1;
}
}

if (lrange && urange) {
ltrans = find_in_hashtable(lrange, domain, domain->raw_to_trans);
if (! ltrans) {
ltrans = compute_trans_from_raw(lrange, domain);
if (ltrans) {
if (add_cache(domain, lrange, ltrans) < 0)
if (add_cache(domain, lrange, ltrans) < 0) {
free(range);
return -1;
}
} else {
ltrans = strdup(lrange);
if (! ltrans) {
log_error("strdup failed %s", strerror(errno));
free(range);
return -1;
}
}
Expand All @@ -1541,25 +1547,36 @@ trans_context(const security_context_t incon, security_context_t *rcon) {
if (! utrans) {
utrans = compute_trans_from_raw(urange, domain);
if (utrans) {
if (add_cache(domain, urange, utrans) < 0)
if (add_cache(domain, urange, utrans) < 0) {
free(ltrans);
free(range);
return -1;
}
} else {
utrans = strdup(urange);
if (! utrans) {
log_error("strdup failed %s", strerror(errno));
return -1;
}
}
free(ltrans);
free(range);
return -1;
}
}
}

if (strcmp(ltrans, utrans) == 0) {
if (asprintf(&trans, "%s", ltrans) < 0) {
log_error("asprintf failed %s", strerror(errno));
free(utrans);
free(ltrans);
free(range);
return -1;
}
} else {
if (asprintf(&trans, "%s-%s", ltrans, utrans) < 0) {
log_error("asprintf failed %s", strerror(errno));
free(utrans);
free(ltrans);
free(range);
return -1;
}
}
Expand Down Expand Up @@ -1629,13 +1646,17 @@ untrans_context(const security_context_t incon, security_context_t *rcon) {
if (!canonical) {
canonical = compute_trans_from_raw(raw, domain);
if (canonical && strcmp(canonical, range))
if (add_cache(domain, raw, canonical) < 0)
if (add_cache(domain, raw, canonical) < 0) {
free(range);
return -1;
}
}
if (canonical)
free(canonical);
if (add_cache(domain, raw, range) < 0)
if (add_cache(domain, raw, range) < 0) {
free(range);
return -1;
}
} else {
log_debug("untrans_context unable to compute raw context %s\n", range);
}
Expand All @@ -1650,17 +1671,24 @@ untrans_context(const security_context_t incon, security_context_t *rcon) {
if (!canonical) {
canonical = compute_trans_from_raw(lraw, domain);
if (canonical)
if (add_cache(domain, lraw, canonical) < 0)
if (add_cache(domain, lraw, canonical) < 0) {
free(lraw);
free(range);
return -1;
}
}
if (canonical)
free(canonical);
if (add_cache(domain, lraw, lrange) < 0)
if (add_cache(domain, lraw, lrange) < 0) {
free(lraw);
free(range);
return -1;
}
} else {
lraw = strdup(lrange);
if (! lraw) {
log_error("strdup failed %s", strerror(errno));
free(range);
return -1;
}
}
Expand All @@ -1674,17 +1702,27 @@ untrans_context(const security_context_t incon, security_context_t *rcon) {
if (!canonical) {
canonical = compute_trans_from_raw(uraw, domain);
if (canonical)
if (add_cache(domain, uraw, canonical) < 0)
if (add_cache(domain, uraw, canonical) < 0) {
free(uraw);
free(lraw);
free(range);
return -1;
}
}
if (canonical)
free(canonical);
if (add_cache(domain, uraw, urange) < 0)
if (add_cache(domain, uraw, urange) < 0) {
free(uraw);
free(lraw);
free(range);
return -1;
}
} else {
uraw = strdup(urange);
if (! uraw) {
log_error("strdup failed %s", strerror(errno));
free(lraw);
free(range);
return -1;
}
}
Expand All @@ -1694,11 +1732,17 @@ untrans_context(const security_context_t incon, security_context_t *rcon) {
if (strcmp(lraw, uraw) == 0) {
if (asprintf(&raw, "%s", lraw) < 0) {
log_error("asprintf failed %s", strerror(errno));
free(uraw);
free(lraw);
free(range);
return -1;
}
} else {
if (asprintf(&raw, "%s-%s", lraw, uraw) < 0) {
log_error("asprintf failed %s", strerror(errno));
free(uraw);
free(lraw);
free(range);
return -1;
}
}
Expand Down

0 comments on commit d0ca433

Please sign in to comment.