Issues with pstree

Alexander E. Patrakov patrakov at ums.usu.ru
Sat Jun 4 22:35:54 PDT 2005


Hello,

psmisc-21.6 has several issues in the pstree program:

1) In non-ISO-8859-1 8-bit locales on Linux console, pstree sends the
\033(0 escape sequence to the terminal. This means "Use ISO-8859-1 
translation table" and therefore breaks the display of all national 
characters after running pstree. (echo -e '\033(K' is the fix).

2) 
http://sourceforge.net/tracker/index.php?func=detail&aid=1195650&group_id=15273&
atid=115273

Issue (1) is critical, since it makes pstree completely unusable on 
Linux console in all non-ISO-8859-1 8-bit locales. Issue (2) is also 
important, since it can turn the terminal session into garbage in any 
locale (but, as opposed to (1), it is triggered rarely).

I have not noticed (1) for a long time because I always start KDM and 
almost never work in the linux console. My fault.

One possible solution is to put a warning in the description of pstree 
in the LFS book, i.e. "don't use this program on linux console in 
non-ISO-8859-1 locales - it will break the display of national characters".

Another solution is to patch pstree.

I have attached two patches to psmisc, please choose one of them or 
both. The -1a patch just disables the use of VT100 line drawing 
characters by default and thus avoids these two bugs and some others. 
The -1b patch attempts to fix those two bugs, but I cannot call the fix 
100% correct for xterm (it relies upon the undocumented fact that xterm 
ignores the "\033(K" sequence). The -1a patch is IMHO a safer solution.

Please choose which of the solutions should go into LFS-6.1.

-- 
Alexander E. Patrakov
-------------- next part --------------
Submitted by: Alexander E. Patrakov
Date: 2005-06-05
Initial Package Version: 21.6
Upstream Status: Not Submitted - Hack
Origin: Alexander E. Patrakov
Description: This patch disables the use of VT100 line drwaing characters
by default in pstree. They are still accessible by runnung pstree -G.

Rationale: Use of VT100 line drawing characters is the origin of at least two
important bugs:

1) In non-ISO-8859-1 8-bit locales on Linux console, pstree sends the
\033(0 escape sequence to the terminal. This means "Use ISO-8859-1 translation
table" and therefore breaks the display of all national characters after
running pstree. (echo -e '\033(K' is the fix).

2) pstree may break line without turning off ACS mode. If this happens in the
last line of output, the subsequent bash prompt and everything else is turned
into meaningless line-drawing characters. Example:

http://sourceforge.net/tracker/index.php?func=detail&aid=1195650&group_id=15273&atid=115273

There are other bugs, e. g. misaligning of line-drawing characters in Konsole
and cutting the line at less than 80 columns, that are also avoided by default
due to non-use of VT100 line drawing characters.

--- psmisc-21.6/src/pstree.c	2005-06-05 10:43:16.000000000 +0600
+++ psmisc-21.6/src/pstree.c	2005-06-05 10:49:07.000000000 +0600
@@ -757,7 +757,6 @@
   const struct passwd *pw;
   pid_t pid, highlight;
   char termcap_area[1024];
-  char *termname;
   int c;
   char *tmpstr;
 
@@ -788,15 +787,6 @@
   if (!strcmp(nl_langinfo(CODESET), "UTF-8")) {
     /* Use UTF-8 symbols if the locale's character set is UTF-8. */
     sym = &sym_utf;
-  } else if ((termname = getenv ("TERM")) && \
-             (strlen (termname) > 0) && \
-             (setupterm (NULL, 1 /* stdout */, NULL) == OK) && \
-             (tigetstr ("acsc") > 0)) {
-    /*
-     * Failing that, if TERM is defined, a non-null value, and the terminal
-     * has the VT100 graphics charset, use it.
-     */
-    sym = &sym_vt100;
   } else {
     /* Otherwise, fall back to ASCII. */
     sym = &sym_ascii;
-------------- next part --------------
Submitted by: Alexander E. Patrakov
Date: 2005-06-05
Initial Package Version: 21.6
Upstream Status: Not Submitted - Test version
Origin: Alexander E. Patrakov
Description: This patch fixes some (but not all) bugs resulting from improper
use of VT100 line drawing characters by pstree.

Detalils: Use of VT100 line drawing characters is the origin of at least two
important bugs:

1) In non-ISO-8859-1 8-bit locales on Linux console, pstree sends the
\033(0 escape sequence to the terminal. This means "Use ISO-8859-1 translation
table" and therefore breaks the display of all national characters after
running pstree. (echo -e '\033(K' is the fix).

2) pstree may break line without turning off ACS mode. If this happens in the
last line of output, the subsequent bash prompt and everything else is turned
into meaningless line-drawing characters. Example:

http://sourceforge.net/tracker/index.php?func=detail&aid=1195650&group_id=15273&atid=115273

These two bugs are fixed, but the fix is not 100% correct: VT_END contains two
escape sequences, one for linux console and one for xterm. The patch relies
upon the fact that each of those two terminals ignores the escape sequence for
the other terminal type.

There are other, unfixed bugs, e. g. misaligning of line-drawing characters
in Konsole and cutting the line at less than 80 columns.

--- psmisc-21.6/src/pstree.c.orig	2005-06-05 10:43:16.000000000 +0600
+++ psmisc-21.6/src/pstree.c	2005-06-05 11:11:15.000000000 +0600
@@ -43,7 +43,7 @@
 #define UTF_HD	"\342\224\254"	/* U+252C, Horizontal and down */
 
 #define VT_BEG	"\033(0\017"	/* use graphic chars */
-#define VT_END	"\033(B"	/* back to normal char set */
+#define VT_END	"\033(B\033(K"	/* back to normal char set */
 #define VT_V	"x"		/* see UTF definitions above */
 #define VT_VR	"t"
 #define VT_H	"q"
@@ -82,10 +82,11 @@
   const char *last_2;		/* `- */
   const char *single_3;		/* --- */
   const char *first_3;		/* -+- */
+  const char *new_line;
 }
 sym_ascii =
 {
-"  ", "|-", "| ", "`-", "---", "-+-"}
+"  ", "|-", "| ", "`-", "---", "-+-", "\n"}
 
 , sym_utf =
 {
@@ -93,13 +94,13 @@
     UTF_VR UTF_H,
 
     UTF_V " ",
-    UTF_UR UTF_H, UTF_H UTF_H UTF_H, UTF_H UTF_HD UTF_H}, sym_vt100 =
+    UTF_UR UTF_H, UTF_H UTF_H UTF_H, UTF_H UTF_HD UTF_H, "\n"}, sym_vt100 =
 {
   "  ",
     VT_BEG VT_VR VT_H VT_END,
     VT_BEG VT_V VT_END " ",
     VT_BEG VT_UR VT_H VT_END,
-    VT_BEG VT_H VT_H VT_H VT_END, VT_BEG VT_H VT_HD VT_H VT_END}
+    VT_BEG VT_H VT_H VT_H VT_END, VT_BEG VT_H VT_HD VT_H VT_END, "\n" VT_END}
 
 , *sym = &sym_ascii;
 
@@ -199,7 +200,7 @@
   if (last_char && cur_x == output_width)
     putchar (last_char);
   last_char = 0;
-  putchar ('\n');
+  out_string(sym->new_line);
   cur_x = 1;
 }
 


More information about the patches mailing list