summaryrefslogtreecommitdiffstats
path: root/usr.bin/rctl
diff options
context:
space:
mode:
authortrasz <trasz@FreeBSD.org>2015-11-29 12:21:02 +0000
committertrasz <trasz@FreeBSD.org>2015-11-29 12:21:02 +0000
commit4a87f3823905b5d692035b026715ee8ee888489c (patch)
treefb8fe62a646a89821b4baa71bfe681b488069983 /usr.bin/rctl
parent89e4a8e57f1b213c0c1a0fbc1edbaa31bbe60a20 (diff)
downloadFreeBSD-src-4a87f3823905b5d692035b026715ee8ee888489c.zip
FreeBSD-src-4a87f3823905b5d692035b026715ee8ee888489c.tar.gz
Fix some memory management problems.
MFC after: 1 month Sponsored by: The FreeBSD Foundation
Diffstat (limited to 'usr.bin/rctl')
-rw-r--r--usr.bin/rctl/rctl.c30
1 files changed, 17 insertions, 13 deletions
diff --git a/usr.bin/rctl/rctl.c b/usr.bin/rctl/rctl.c
index 377046b..cf69e0b 100644
--- a/usr.bin/rctl/rctl.c
+++ b/usr.bin/rctl/rctl.c
@@ -111,10 +111,10 @@ expand_amount(char *rule)
{
uint64_t num;
const char *subject, *subject_id, *resource, *action, *amount, *per;
- char *copy, *expanded;
+ char *copy, *expanded, *tofree;
int ret;
- copy = strdup(rule);
+ tofree = copy = strdup(rule);
if (copy == NULL) {
warn("strdup");
return (NULL);
@@ -128,7 +128,7 @@ expand_amount(char *rule)
per = copy;
if (amount == NULL || strlen(amount) == 0) {
- free(copy);
+ free(tofree);
return (rule);
}
@@ -139,7 +139,7 @@ expand_amount(char *rule)
if (expand_number(amount, &num)) {
warnx("invalid numeric value '%s'", amount);
- free(copy);
+ free(tofree);
return (NULL);
}
@@ -153,10 +153,11 @@ expand_amount(char *rule)
if (ret <= 0) {
warn("asprintf");
- free(copy);
+ free(tofree);
return (NULL);
}
+ free(tofree);
return (expanded);
}
@@ -280,10 +281,10 @@ humanize_amount(char *rule)
{
int64_t num;
const char *subject, *subject_id, *resource, *action, *amount, *per;
- char *copy, *humanized, buf[6];
+ char *copy, *humanized, buf[6], *tofree;
int ret;
- copy = strdup(rule);
+ tofree = copy = strdup(rule);
if (copy == NULL)
err(1, "strdup");
@@ -296,7 +297,7 @@ humanize_amount(char *rule)
if (amount == NULL || strlen(amount) == 0 ||
str2int64(amount, &num) != 0) {
- free(copy);
+ free(tofree);
return (rule);
}
@@ -320,6 +321,7 @@ humanize_amount(char *rule)
if (ret <= 0)
err(1, "asprintf");
+ free(tofree);
return (humanized);
}
@@ -426,10 +428,10 @@ humanize_usage_amount(char *usage)
{
int64_t num;
const char *resource, *amount;
- char *copy, *humanized, buf[6];
+ char *copy, *humanized, buf[6], *tofree;
int ret;
- copy = strdup(usage);
+ tofree = copy = strdup(usage);
if (copy == NULL)
err(1, "strdup");
@@ -442,7 +444,7 @@ humanize_usage_amount(char *usage)
if (str2int64(amount, &num) != 0 ||
humanize_number(buf, sizeof(buf), num, "", HN_AUTOSCALE,
HN_DECIMAL | HN_NOSPACE) == -1) {
- free(copy);
+ free(tofree);
return (usage);
}
@@ -450,6 +452,7 @@ humanize_usage_amount(char *usage)
if (ret <= 0)
err(1, "asprintf");
+ free(tofree);
return (humanized);
}
@@ -460,7 +463,7 @@ static int
show_usage(const char *filter, int hflag)
{
int error;
- char *outbuf = NULL, *tmp;
+ char *copy, *outbuf = NULL, *tmp;
size_t outbuflen = RCTL_DEFAULT_BUFSIZE / 4;
do {
@@ -478,7 +481,8 @@ show_usage(const char *filter, int hflag)
}
} while (error && errno == ERANGE);
- while ((tmp = strsep(&outbuf, ",")) != NULL) {
+ copy = outbuf;
+ while ((tmp = strsep(&copy, ",")) != NULL) {
if (tmp[0] == '\0')
break; /* XXX */
OpenPOWER on IntegriCloud