From 14403c33674d9cecd4f4d92ff22abd480b35f73c Mon Sep 17 00:00:00 2001 From: truckman Date: Wed, 1 Jun 2016 17:33:02 +0000 Subject: [PATCH] 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 git-svn-id: svn://svn.freebsd.org/base/stable/10@301148 ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f --- bin/ps/ps.c | 15 +++++++++------ bin/ps/ps.h | 4 ++-- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/bin/ps/ps.c b/bin/ps/ps.c index 9d14a72c9..163816007 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(""); 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 86aaeb0fe..d422335ae 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() */ -- 2.42.0