Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 25 May 2016 05:12:56 +0000 (UTC)
From:      Don Lewis <truckman@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r300648 - head/bin/ps
Message-ID:  <201605250512.u4P5CuvH084602@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: truckman
Date: Wed May 25 05:12:56 2016
New Revision: 300648
URL: https://svnweb.freebsd.org/changeset/base/300648

Log:
  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
  MFC after:	1 week

Modified:
  head/bin/ps/ps.c
  head/bin/ps/ps.h

Modified: head/bin/ps/ps.c
==============================================================================
--- head/bin/ps/ps.c	Wed May 25 05:06:15 2016	(r300647)
+++ head/bin/ps/ps.c	Wed May 25 05:12:56 2016	(r300648)
@@ -1235,6 +1235,7 @@ fmt(char **(*fn)(kvm_t *, const struct k
 static void
 saveuser(KINFO *ki)
 {
+	char *argsp;
 
 	if (ki->ki_p->ki_flag & P_INMEM) {
 		/*
@@ -1253,10 +1254,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)
 			xo_errx(1, "malloc failed");
 	} else {
@@ -1264,8 +1267,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)

Modified: head/bin/ps/ps.h
==============================================================================
--- head/bin/ps/ps.h	Wed May 25 05:06:15 2016	(r300647)
+++ head/bin/ps/ps.h	Wed May 25 05:12:56 2016	(r300648)
@@ -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() */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201605250512.u4P5CuvH084602>