Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 19 Apr 2015 11:52:48 +0300
From:      Konstantin Belousov <kostikbel@gmail.com>
To:        Oliver Pinter <oliver.pinter@hardenedbsd.org>
Cc:        "freebsd-arch@freebsd.org" <arch@freebsd.org>, peter@freebsd.org
Subject:   setproctitle [was: Re: Removal of the 6.x kernel compat code from libc]
Message-ID:  <20150419085248.GB2390@kib.kiev.ua>
In-Reply-To: <CAPQ4ffsrMNLBChrUc5wBrY%2BnSwnfZhBqSp%2BhES0tpLUJi-bXow@mail.gmail.com>
References:  <20150417075942.GI2390@kib.kiev.ua> <CAPQ4ffsrMNLBChrUc5wBrY%2BnSwnfZhBqSp%2BhES0tpLUJi-bXow@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, Apr 17, 2015 at 01:39:04PM +0200, Oliver Pinter wrote:
> Is there any chanche to get ride of the very old (FreeBSD 2.x) compat
> hacks like these:
> https://github.com/freebsd/freebsd/blob/master/lib/libc/gen/setproctitle.c#L40 ?
> 

Below is the promised cleanup of the libc/gen/setproctitle.c.

I see a value in keeping the track of the historical interfaces. I
considered moving the explanation about old_ps_strings to sys/exec.h,
where the current ps_strings is defined and explained, but this would
make the safety checks in the setproctitle() code uncomprehensive.

diff --git a/lib/libc/gen/setproctitle.c b/lib/libc/gen/setproctitle.c
index cd705fb..9dff328 100644
--- a/lib/libc/gen/setproctitle.c
+++ b/lib/libc/gen/setproctitle.c
@@ -42,9 +42,10 @@ __FBSDID("$FreeBSD$");
  * 1: old_ps_strings at the very top of the stack.
  * 2: old_ps_strings at SPARE_USRSPACE below the top of the stack.
  * 3: ps_strings at the very top of the stack.
- * This attempts to support a kernel built in the #2 and #3 era.
- */
-
+ * We only support a kernel providing #3 style ps_strings.
+ *
+ * For historical purposes, a definition of the old ps_strings structure
+ * and location is preserved below:
 struct old_ps_strings {
 	char	*old_ps_argvstr;
 	int	old_ps_nargvstr;
@@ -53,6 +54,7 @@ struct old_ps_strings {
 };
 #define	OLD_PS_STRINGS ((struct old_ps_strings *) \
 	(USRSTACK - SPARE_USRSPACE - sizeof(struct old_ps_strings)))
+ */
 
 #include <stdarg.h>
 
@@ -136,41 +138,38 @@ setproctitle(const char *fmt, ...)
 		ps_strings = (struct ps_strings *)ul_ps_strings;
 	}
 
-	/* PS_STRINGS points to zeroed memory on a style #2 kernel */
-	if (ps_strings->ps_argvstr) {
-		/* style #3 */
-		if (oargc == -1) {
-			/* Record our original args */
-			oargc = ps_strings->ps_nargvstr;
-			oargv = ps_strings->ps_argvstr;
-			for (i = len = 0; i < oargc; i++) {
-				/*
-				 * The program may have scribbled into its
-				 * argv array, e.g., to remove some arguments.
-				 * If that has happened, break out before
-				 * trying to call strlen on a NULL pointer.
-				 */
-				if (oargv[i] == NULL) {
-					oargc = i;
-					break;
-				}
-				snprintf(obuf + len, SPT_BUFSIZE - len, "%s%s",
-				    len ? " " : "", oargv[i]);
-				if (len)
-					len++;
-				len += strlen(oargv[i]);
-				if (len >= SPT_BUFSIZE)
-					break;
+	/*
+	 * PS_STRINGS points to zeroed memory on a style #2 kernel.
+	 * Should not happen.
+	 */
+	if (ps_strings->ps_argvstr == NULL)
+		return;
+
+	/* style #3 */
+	if (oargc == -1) {
+		/* Record our original args */
+		oargc = ps_strings->ps_nargvstr;
+		oargv = ps_strings->ps_argvstr;
+		for (i = len = 0; i < oargc; i++) {
+			/*
+			 * The program may have scribbled into its
+			 * argv array, e.g., to remove some arguments.
+			 * If that has happened, break out before
+			 * trying to call strlen on a NULL pointer.
+			 */
+			if (oargv[i] == NULL) {
+				oargc = i;
+				break;
 			}
+			snprintf(obuf + len, SPT_BUFSIZE - len, "%s%s",
+			    len != 0 ? " " : "", oargv[i]);
+			if (len != 0)
+				len++;
+			len += strlen(oargv[i]);
+			if (len >= SPT_BUFSIZE)
+				break;
 		}
-		ps_strings->ps_nargvstr = nargc;
-		ps_strings->ps_argvstr = nargvp;
-	} else {
-		/* style #2 - we can only restore our first arg :-( */
-		if (*obuf == '\0')
-			strncpy(obuf, OLD_PS_STRINGS->old_ps_argvstr,
-			    SPT_BUFSIZE - 1);
-		OLD_PS_STRINGS->old_ps_nargvstr = 1;
-		OLD_PS_STRINGS->old_ps_argvstr = nargvp[0];
 	}
+	ps_strings->ps_nargvstr = nargc;
+	ps_strings->ps_argvstr = nargvp;
 }



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