From 98a75959e13699e2ef35b0b011a88a6d224f227e Mon Sep 17 00:00:00 2001 From: Jaroslav Rohel <jrohel@redhat.com> Date: Tue, 11 Dec 2018 10:14:04 +0100 Subject: [PATCH] Fix: Memory leaks --- ext/repo_rpmdb.c | 16 ++++++++++++++++ ext/testcase.c | 4 ++++ tools/repo2solv.c | 1 + 3 files changed, 21 insertions(+) --- a/ext/repo_rpmdb.c +++ b/ext/repo_rpmdb.c @@ -1939,6 +1939,8 @@ repo_add_rpm(Repo *repo, const char *rpm if (fread(lead, 96 + 16, 1, fp) != 1 || getu32(lead) != 0xedabeedb) { pool_error(pool, -1, "%s: not a rpm", rpm); + solv_chksum_free(leadsigchksumh, NULL); + solv_chksum_free(chksumh, NULL); fclose(fp); return 0; } @@ -1951,12 +1953,16 @@ repo_add_rpm(Repo *repo, const char *rpm if (lead[78] != 0 || lead[79] != 5) { pool_error(pool, -1, "%s: not a rpm v5 header", rpm); + solv_chksum_free(leadsigchksumh, NULL); + solv_chksum_free(chksumh, NULL); fclose(fp); return 0; } if (getu32(lead + 96) != 0x8eade801) { pool_error(pool, -1, "%s: bad signature header", rpm); + solv_chksum_free(leadsigchksumh, NULL); + solv_chksum_free(chksumh, NULL); fclose(fp); return 0; } @@ -1965,6 +1971,8 @@ repo_add_rpm(Repo *repo, const char *rpm if (sigcnt >= MAX_SIG_CNT || sigdsize >= MAX_SIG_DSIZE) { pool_error(pool, -1, "%s: bad signature header", rpm); + solv_chksum_free(leadsigchksumh, NULL); + solv_chksum_free(chksumh, NULL); fclose(fp); return 0; } @@ -2014,6 +2024,8 @@ repo_add_rpm(Repo *repo, const char *rpm if (fread(lead, l, 1, fp) != 1) { pool_error(pool, -1, "%s: unexpected EOF", rpm); + solv_chksum_free(leadsigchksumh, NULL); + solv_chksum_free(chksumh, NULL); fclose(fp); return 0; } @@ -2034,6 +2046,7 @@ repo_add_rpm(Repo *repo, const char *rpm if (fread(lead, 16, 1, fp) != 1) { pool_error(pool, -1, "%s: unexpected EOF", rpm); + solv_chksum_free(chksumh, NULL); fclose(fp); return 0; } @@ -2042,6 +2055,7 @@ repo_add_rpm(Repo *repo, const char *rpm if (getu32(lead) != 0x8eade801) { pool_error(pool, -1, "%s: bad header", rpm); + solv_chksum_free(chksumh, NULL); fclose(fp); return 0; } @@ -2050,6 +2064,7 @@ repo_add_rpm(Repo *repo, const char *rpm if (sigcnt >= MAX_HDR_CNT || sigdsize >= MAX_HDR_DSIZE) { pool_error(pool, -1, "%s: bad header", rpm); + solv_chksum_free(chksumh, NULL); fclose(fp); return 0; } --- a/ext/testcase.c +++ b/ext/testcase.c @@ -2348,6 +2348,7 @@ testcase_write_mangled(Solver *solv, con if (fclose(fp)) { pool_error(solv->pool, 0, "testcase_write: write error"); + solv_free(result); strqueue_free(&sq); return 0; } @@ -2360,12 +2361,14 @@ testcase_write_mangled(Solver *solv, con if (!(fp = fopen(out, "w"))) { pool_error(solv->pool, 0, "testcase_write: could not open '%s' for writing", out); + solv_free(cmd); strqueue_free(&sq); return 0; } if (*cmd && fwrite(cmd, strlen(cmd), 1, fp) != 1) { pool_error(solv->pool, 0, "testcase_write: write error"); + solv_free(cmd); strqueue_free(&sq); fclose(fp); return 0; @@ -2373,6 +2376,7 @@ testcase_write_mangled(Solver *solv, con if (fclose(fp)) { pool_error(solv->pool, 0, "testcase_write: write error"); + solv_free(cmd); strqueue_free(&sq); return 0; }