summaryrefslogtreecommitdiffstats
path: root/bin/ps
diff options
context:
space:
mode:
authortruckman <truckman@FreeBSD.org>2016-06-01 17:33:02 +0000
committertruckman <truckman@FreeBSD.org>2016-06-01 17:33:02 +0000
commitefd2996ff9ab633d8be09fa755ee1b021937fede (patch)
treeadf034f071dd2c950f03231446f2c4dcb742f696 /bin/ps
parented265b2890fdcb1fa5b9bbdaddfd54fb5e3cf2ed (diff)
downloadFreeBSD-src-efd2996ff9ab633d8be09fa755ee1b021937fede.zip
FreeBSD-src-efd2996ff9ab633d8be09fa755ee1b021937fede.tar.gz
MFC r300648
Fix CID 1011370 (Resource leak) in ps. There is no need to to call strdup() on the value returned by fmt(). The latter calls fmt_argv() which always returns a dynamically allocated string, and calling strdup() on that leaks the memory allocated by fmt_argv(). Wave some const magic on ki_args and ki_env to make the direct assignment happy. This requires a tweak to the asprintf() case to avoid a const vs. non-const mismatch. Reported by: Coverity CID: 1011370
Diffstat (limited to 'bin/ps')
-rw-r--r--bin/ps/ps.c15
-rw-r--r--bin/ps/ps.h4
2 files changed, 11 insertions, 8 deletions
diff --git a/bin/ps/ps.c b/bin/ps/ps.c
index 9d14a72c..1638160 100644
--- a/bin/ps/ps.c
+++ b/bin/ps/ps.c
@@ -1217,6 +1217,7 @@ fmt(char **(*fn)(kvm_t *, const struct kinfo_proc *, int), KINFO *ki,
static void
saveuser(KINFO *ki)
{
+ char *argsp;
if (ki->ki_p->ki_flag & P_INMEM) {
/*
@@ -1235,10 +1236,12 @@ saveuser(KINFO *ki)
if (ki->ki_p->ki_stat == SZOMB)
ki->ki_args = strdup("<defunct>");
else if (UREADOK(ki) || (ki->ki_p->ki_args != NULL))
- ki->ki_args = strdup(fmt(kvm_getargv, ki,
- ki->ki_p->ki_comm, ki->ki_p->ki_tdname, MAXCOMLEN));
- else
- asprintf(&ki->ki_args, "(%s)", ki->ki_p->ki_comm);
+ ki->ki_args = fmt(kvm_getargv, ki,
+ ki->ki_p->ki_comm, ki->ki_p->ki_tdname, MAXCOMLEN);
+ else {
+ asprintf(&argsp, "(%s)", ki->ki_p->ki_comm);
+ ki->ki_args = argsp;
+ }
if (ki->ki_args == NULL)
errx(1, "malloc failed");
} else {
@@ -1246,8 +1249,8 @@ saveuser(KINFO *ki)
}
if (needenv) {
if (UREADOK(ki))
- ki->ki_env = strdup(fmt(kvm_getenvv, ki,
- (char *)NULL, (char *)NULL, 0));
+ ki->ki_env = fmt(kvm_getenvv, ki,
+ (char *)NULL, (char *)NULL, 0);
else
ki->ki_env = strdup("()");
if (ki->ki_env == NULL)
diff --git a/bin/ps/ps.h b/bin/ps/ps.h
index 86aaeb0..d422335 100644
--- a/bin/ps/ps.h
+++ b/bin/ps/ps.h
@@ -42,8 +42,8 @@ typedef struct kinfo_str {
typedef struct kinfo {
struct kinfo_proc *ki_p; /* kinfo_proc structure */
- char *ki_args; /* exec args */
- char *ki_env; /* environment */
+ const char *ki_args; /* exec args */
+ const char *ki_env; /* environment */
int ki_valid; /* 1 => uarea stuff valid */
double ki_pcpu; /* calculated in main() */
segsz_t ki_memsize; /* calculated in main() */
OpenPOWER on IntegriCloud