Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 23 Mar 2012 20:25:21 -0400 (EDT)
From:      "J.R. Oldroyd" <fbsd@opal.com>
To:        FreeBSD-gnats-submit@FreeBSD.org
Subject:   bin/166364: make ps(1) display 8-bit characters as such
Message-ID:  <201203240025.q2O0PLVN006600@shibato.opal.com>
Resent-Message-ID: <201203240100.q2O10Gxl061710@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         166364
>Category:       bin
>Synopsis:       make ps(1) display 8-bit characters as such
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sat Mar 24 01:00:15 UTC 2012
>Closed-Date:
>Last-Modified:
>Originator:     J.R. Oldroyd
>Release:        FreeBSD 8.2-RELEASE amd64
>Organization:
>Environment:
System: FreeBSD xx.opal.com 8.2-RELEASE FreeBSD 8.2-RELEASE #0: Thu Feb 17 02:41:51 UTC 2011 root@mason.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC amd64
>Description:
Currently, ps(1) uses strvis(3) to pretty-up all commands and arguments before they
are displayed.  This has the detrimental effect of converting 8-bit characters in
command names and argument lists to sequences such as "\M-C\M-)" for a simple
"é" (e-acute), etc, thereby making ps' output very awkward for those of us that work
in languages that use 8-bit characters.  These sequences are not human-readable, nor
is it possible to cut and paste such words back to the command line.

It is unclear why strvis() is used here, but it exists in the ps(1) source from the
earliest version in svn.  If strvis() is no longer needed here, it should be removed,
or at the least replaced with code that removes "dangerous" characters (whatever they
may be) but which leaves 8-bit alphabetics alone.

The attached diff removes the four strvis() calls and replaces them with strcpy().
A cleaner solution would rework the associated code to no longer need the copy at
all, by using the "src" variable in place of the "dst" one in the code following
and so eliminating the need for the "dst" variable.

For comparison, procstat(1) does not do any pretty-printing of command names or
arguments in this way.
>How-To-Repeat:
1. Run any command that has any 8-bit character in its name or any argument.
2. Run "ps ax" while that command is running and examine the ps output.
>Fix:
--- fmt.oc	2011-02-22 12:25:38.000000000 -0500
+++ fmt.c	2012-03-23 20:07:23.000000000 -0400
@@ -47,7 +47,6 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
-#include <vis.h>
 
 #include "ps.h"
 
@@ -82,8 +81,7 @@
 		if (*src == '\0')
 			continue;
 		len = (buf_size - 1 - (dst - buf)) / 4;
-		strvisx(dst, src, strlen(src) < len ? strlen(src) : len,
-		    VIS_NL | VIS_CSTYLE);
+		strcpy(dst, src);
 		while (*dst != '\0')
 			dst++;
 		if ((buf_size - 1 - (dst - buf)) / 4 > 0)
--- print.oc	2011-02-22 12:25:38.000000000 -0500
+++ print.c	2012-03-23 20:07:57.000000000 -0400
@@ -58,7 +58,6 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
-#include <vis.h>
 
 #include "ps.h"
 
@@ -101,7 +100,7 @@
 	v = ve->var;
 	if ((vis_args = malloc(strlen(k->ki_args) * 4 + 1)) == NULL)
 		errx(1, "malloc failed");
-	strvis(vis_args, k->ki_args, VIS_TAB | VIS_NL | VIS_NOSLASH);
+	strcpy(vis_args, k->ki_args);
 	if (STAILQ_NEXT(ve, next_ve) == NULL) {
 		/* last field */
 		if (termwidth == UNLIMITED) {
@@ -141,7 +140,7 @@
 	}
 	if ((vis_args = malloc(strlen(k->ki_args) * 4 + 1)) == NULL)
 		errx(1, "malloc failed");
-	strvis(vis_args, k->ki_args, VIS_TAB | VIS_NL | VIS_NOSLASH);
+	strcpy(vis_args, k->ki_args);
 
 	if (STAILQ_NEXT(ve, next_ve) == NULL) {
 		/* last field */
@@ -150,8 +149,7 @@
 			if ((vis_env = malloc(strlen(k->ki_env) * 4 + 1))
 			    == NULL)
 				errx(1, "malloc failed");
-			strvis(vis_env, k->ki_env,
-			    VIS_TAB | VIS_NL | VIS_NOSLASH);
+			strcpy(vis_env, k->ki_env);
 		} else
 			vis_env = NULL;
 
>Release-Note:
>Audit-Trail:
>Unformatted:



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