diff options
author | Jan Kara <jack@suse.cz> | 2019-05-24 12:25:15 +0200 |
---|---|---|
committer | Jan Kara <jack@suse.cz> | 2019-05-24 12:25:15 +0200 |
commit | 7942290a0a6230fcc56eae42bf436e6eeca88777 (patch) | |
tree | b874373910332801deb3b2a8794c6d9beed80090 | |
parent | e6decbfe6c44935584954ab01c8be2f5d02acf1b (diff) | |
download | linuxquota-7942290a0a6230fcc56eae42bf436e6eeca88777.tar.gz |
quotaops: Do not leak dquot structures on failure
Some error paths in getprivs() were not properly freeing already fetched
structures. Free them properly in case of error.
Signed-off-by: Jan Kara <jack@suse.cz>
-rw-r--r-- | quotaops.c | 9 |
1 files changed, 5 insertions, 4 deletions
@@ -80,7 +80,7 @@ struct dquot *getprivs(qid_t id, struct quota_handle **handles, int ignore_noquo if (euid != id && euid != 0) { uid2user(id, name); errstr(_("%s (uid %d): Permission denied\n"), name, id); - return (struct dquot *)NULL; + goto out_err; } break; case GRPQUOTA: @@ -92,7 +92,7 @@ struct dquot *getprivs(qid_t id, struct quota_handle **handles, int ignore_noquo if (!gidsetp) { gid2group(id, name); errstr(_("%s (gid %d): gid set allocation (%d): %s\n"), name, id, ngroups, strerror(errno)); - return (struct dquot *)NULL; + goto out_err; } } else @@ -103,7 +103,7 @@ struct dquot *getprivs(qid_t id, struct quota_handle **handles, int ignore_noquo free(gidsetp); gid2group(id, name); errstr(_("%s (gid %d): error while trying getgroups(): %s\n"), name, id, strerror(errno)); - return (struct dquot *)NULL; + goto out_err; } for (j = 0; j < ngroups; j++) @@ -115,7 +115,7 @@ struct dquot *getprivs(qid_t id, struct quota_handle **handles, int ignore_noquo gid2group(id, name); errstr(_("%s (gid %d): Permission denied\n"), name, id); - return (struct dquot *)NULL; + goto out_err; } break; default: @@ -134,6 +134,7 @@ struct dquot *getprivs(qid_t id, struct quota_handle **handles, int ignore_noquo id2name(id, handles[i]->qh_type, name); errstr(_("error while getting quota from %s for %s (id %u): %s\n"), handles[i]->qh_quotadev, name, id, strerror(olderrno)); +out_err: freeprivs(qhead); return NULL; } |