summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoralbert <>2007-05-28 03:18:52 +0000
committeralbert <>2007-05-28 03:18:52 +0000
commitc0f3df30ca9283f8ec9d1a75c5cd502f3b867137 (patch)
tree5b71d2c7c9080a373a30b786082cad8a897ab842
parent7ed102fd76ed1cdf0f99e6e46eb966fc838bc891 (diff)
downloadprocps-ng-c0f3df30ca9283f8ec9d1a75c5cd502f3b867137.tar.gz
watch: tolerate umlauts
-rw-r--r--NEWS1
-rw-r--r--TODO2
-rw-r--r--top.c12
-rw-r--r--watch.c4
4 files changed, 14 insertions, 5 deletions
diff --git a/NEWS b/NEWS
index 12c945a..9de1b95 100644
--- a/NEWS
+++ b/NEWS
@@ -6,6 +6,7 @@ top: normal exit code should be 0 #341272 #354255
pgrep: usage error should exit with 2 #413383
vmstat: use EXIT_FAILURE -- thanks Yoshio Nakamura #425492
sysctl: fix crash -- thanks Steinar Gunderson #423704
+watch: tolerate umlauts #207103
procps-3.2.6 --> procps-3.2.7
diff --git a/TODO b/TODO
index 3a61258..a342926 100644
--- a/TODO
+++ b/TODO
@@ -45,6 +45,8 @@ Tolerate color, bold, underline, etc. #129334
Tolerate stderr. #420377 #155227 #225549
+Tolerate VT100 line-drawing characters. Maybe translate them.
+
---------------------- w --------------------------
The LOGIN@ column sometimes has a space in it. This makes correct
diff --git a/top.c b/top.c
index 19ddb0a..6902527 100644
--- a/top.c
+++ b/top.c
@@ -654,9 +654,12 @@ static void show_special (int interact, const char *glob)
while ((lin_end = strchr(glob, '\n'))) {
/* create a local copy we can extend and otherwise abuse */
- memcpy(lin, glob, (unsigned)(lin_end - glob)); FIXME -- buffer overflow
+ size_t amt = lin_end - glob;
+ if(amt > sizeof lin - 1)
+ amt = sizeof lin - 1; // shit happens
+ memcpy(lin, glob, amt);
/* zero terminate this part and prepare to parse substrings */
- lin[lin_end - glob] = '\0';
+ lin[amt] = '\0';
room = Screen_cols;
sub_beg = sub_end = lin;
*(rp = row) = '\0';
@@ -669,6 +672,9 @@ static void show_special (int interact, const char *glob)
cap = Curwin->captab[(int)*sub_end];
*sub_end = '\0';
snprintf(tmp, sizeof(tmp), "%s%.*s%s", cap, room, sub_beg, Caps_off);
+ amt = strlen(tmp);
+ if(rp - tmp + amt + 1 > sizeof tmp)
+ goto overflow; // shit happens
rp = scat(rp, tmp);
room -= (sub_end - sub_beg);
sub_beg = ++sub_end;
@@ -678,7 +684,7 @@ static void show_special (int interact, const char *glob)
}
if (unlikely(0 >= room)) break; /* skip substrings that won't fit */
}
-
+overflow:
if (interact) PUTT("%s%s\n", row, Cap_clr_eol);
else PUFF("%s%s\n", row, Cap_clr_eol);
glob = ++lin_end; /* point to next line (maybe) */
diff --git a/watch.c b/watch.c
index 7d7be93..5841168 100644
--- a/watch.c
+++ b/watch.c
@@ -296,10 +296,10 @@ main(int argc, char *argv[])
}
move(y, x);
if (option_differences) {
- int oldch = inch();
+ chtype oldch = inch();
char oldc = oldch & A_CHARTEXT;
attr = !first_screen
- && (c != oldc
+ && ((char)c != oldc
||
(option_differences_cumulative
&& (oldch & A_ATTRIBUTES)));