]> granicus.if.org Git - procps-ng/commitdiff
top: correct an insidious occasional truncation buglet
authorJim Warner <james.warner@comcast.net>
Mon, 2 Oct 2017 04:59:59 +0000 (23:59 -0500)
committerCraig Small <csmall@enc.com.au>
Mon, 2 Oct 2017 11:20:58 +0000 (22:20 +1100)
With the help of our Swedish translator, hopefully the
final buglet has now been vanquished in the multi-byte
translation support. This one was a real nasty bugger.

Although it didn't occur with every terminal emulator,
occasionally random text lines were being chopped off.

As it turns out, those terminals were blameless. There
were two separate places in top's show_special routine
where potential multi-byte sequences were inadequately
addressed. Solution: exploit existing utf-8 functions.

[ it also became apparent that the translation hints ]
[ in the top_nls module were deficient. so a special ]
[ caution was added regarding the final line of txt. ]

Reference(s):
https://gitlab.com/procps-ng/procps/issues/68

Signed-off-by: Jim Warner <james.warner@comcast.net>
top/top.c
top/top.h
top/top_nls.c

index aef95ead43bab423a2a4f2bf0cd540df9ff0d1c5..bf52150add7504d519b94496c2f7049fa1de4cce 100644 (file)
--- a/top/top.c
+++ b/top/top.c
@@ -932,7 +932,7 @@ static void show_special (int interact, const char *glob) {
             case 5: case 6: case 7: case 8:
                *sub_end = '\0';
                snprintf(tmp, sizeof(tmp), "%s%.*s%s"
-                  , Curwin->captab[ch], room, sub_beg, Caps_off);
+                  , Curwin->captab[ch], utf8_embody(sub_beg, room), sub_beg, Caps_off);
                rp = scat(rp, tmp);
                room -= (sub_end - sub_beg);
                room += utf8_delta(sub_beg);
@@ -955,7 +955,7 @@ static void show_special (int interact, const char *glob) {
       it probably means caller wants to retain cursor position on this final
       line.  That, in turn, means we're interactive and so we'll just do our
       'fit-to-screen' thingy while also leaving room for the cursor... */
-   if (*glob) PUTT("%.*s", Screen_cols -1, glob);
+   if (*glob) PUTT("%.*s", utf8_embody(glob, Screen_cols - 1), glob);
 } // end: show_special
 
 
index 81c1a9866b08e60d8ba0bf453eefc6c8bf03186d..813a957b65149e3df7348be3c993b2034aaf5733 100644 (file)
--- a/top/top.h
+++ b/top/top.h
@@ -86,6 +86,9 @@
         /* For the impetus and NUMA/Node prototype design, thanks to:
               Lance Shelton <LShelton@fusionio.com> - April, 2013 */
 
+        /* For prompting & helping with top's utf-8 support, thanks to:
+              Göran Uddeborg <goeran@uddeborg.se> - September, 2017 */
+
 #ifdef PRETEND2_5_X
 #define linux_version_code LINUX_VERSION(2,5,43)
 #endif
index 8b2e2f3ffaff835d23b46cbdc029369177ed9b00..d60c5817e5d59d13601040d9f58da553835acd0a 100644 (file)
@@ -520,6 +520,17 @@ static void build_uniq_nlstab (void) {
    .  If you would like additional information regarding these strings,
    .  please see the prologue to the show_special function in the top.c
    .  source file.
+   .
+   .  Caution:
+   .    The next three items represent pages for interacting with a user.
+   .    In all cases, the last lines of text must be treated with care.
+   .
+   .    They must not end with a newline character so that at runtime the
+   .    cursor will remain on that final text line.
+   .
+   .    Also, the special sequences (tilde+number) must not appear on the
+   .    last line (the one without the newline). So please avoid any line
+   .    wraps that could place them there.
    . */
 
    Uniq_nlstab[KEYS_helpbas_fmt] = _(""