diff options
author | albert <> | 2007-05-28 03:18:52 +0000 |
---|---|---|
committer | albert <> | 2007-05-28 03:18:52 +0000 |
commit | c0f3df30ca9283f8ec9d1a75c5cd502f3b867137 (patch) | |
tree | 5b71d2c7c9080a373a30b786082cad8a897ab842 | |
parent | 7ed102fd76ed1cdf0f99e6e46eb966fc838bc891 (diff) | |
download | procps-ng-c0f3df30ca9283f8ec9d1a75c5cd502f3b867137.tar.gz |
watch: tolerate umlauts
-rw-r--r-- | NEWS | 1 | ||||
-rw-r--r-- | TODO | 2 | ||||
-rw-r--r-- | top.c | 12 | ||||
-rw-r--r-- | watch.c | 4 |
4 files changed, 14 insertions, 5 deletions
@@ -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 @@ -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 @@ -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) */ @@ -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))); |