From 801a9807944cf5912f45ae0961639c7d90ffb6a7 Mon Sep 17 00:00:00 2001 From: z00557007 Date: Mon, 7 Nov 2022 10:57:34 +0800 Subject: [PATCH] eliminate a potential abend when exiting 'A' mode --- ...-potential-abend-when-exiting-A-mode.patch | 207 ++++++++++++++++++ procps-ng.spec | 6 +- 2 files changed, 212 insertions(+), 1 deletion(-) create mode 100644 0003-top-eliminate-a-potential-abend-when-exiting-A-mode.patch diff --git a/0003-top-eliminate-a-potential-abend-when-exiting-A-mode.patch b/0003-top-eliminate-a-potential-abend-when-exiting-A-mode.patch new file mode 100644 index 0000000..f4adcaf --- /dev/null +++ b/0003-top-eliminate-a-potential-abend-when-exiting-A-mode.patch @@ -0,0 +1,207 @@ +From ad4429ade07abe2133dd53341fa91639625f09a0 Mon Sep 17 00:00:00 2001 +From: Jim Warner +Date: Wed, 27 Jul 2022 00:00:00 -0500 +Subject: [PATCH] top: eliminate a potential abend when exiting 'A' mode <=== + port of newlib 80e2a7a6 + +______________________________ original newlib message +----------------------------------- ( minus git hash ) + +In that issue cited below, Tyson Nottingham identified +a potential abend which was associated with 'alternate +display mode' plus that troublesome 'mkVIZrow1' macro. +He also offered a perfectly adequate fix for that bug. + +I refer to that macro as troublesome since it's now so +widely used and sometimes (by design) causes 'begtask' +to go negative (invalid). And now I found yet one more +place where it should have been used but wasn't ('f'). + +It's also troublesome as evidenced by some git history +listed below. Heck, there was even a commit addressing +the same symptoms (alternate display mode abend) which +Tyson suffered. Clearly, the current design is flawed. + +So, with those two issues in mind, I've refactored the +approach to maintaining a visible task in the 1st row. +Henceforth, a 'mkVIZrow1' macro will be issued in only +two places: once at startup and after most keystrokes. + +Such an approach likely results in additional calls to +the 'window_hlp' routine that aren't really necessary. +But, it provides a cleaner design less prone to errors +in the future. Besides, such additional overhead would +only be incurred when interacting with the user. Thus, +new costs are of no concern and will never be noticed. + +Reference(s): +. Tyson Nottingham reported problem +https://gitlab.com/procps-ng/procps/-/issues/245 +. Jun, 2018 - visible row 1 tasks first addressed +commit ........................................ +. Jun, 2018 - adressed edge case, new bugs created +commit ........................................ +. Sep, 2018 - additional edge case addressed +commit ........................................ +. May, 2021 - some abends fixed, new error created +commit ........................................ +. Jun, 2021 - try to prorect against future errors +commit ........................................ +. Sep, 2021 - integrate mkVIZ & 'focused' tasks +commit ........................................ + +Discovered by: Tyson Nottingham +Signed-off-by: Jim Warner +--- + top/top.c | 44 +++++++++++++++++++------------------------- + top/top.h | 3 ++- + 2 files changed, 21 insertions(+), 26 deletions(-) + +diff --git a/top/top.c b/top/top.c +index 51bf563..204e66a 100644 +--- a/top/top.c ++++ b/top/top.c +@@ -4329,10 +4329,11 @@ static void win_names (WIN_t *q, const char *name) { + static void win_reset (WIN_t *q) { + SETw(q, Show_IDLEPS | Show_TASKON); + #ifndef SCROLLVAR_NO +- q->rc.maxtasks = q->usrseltyp = q->begpflg = q->begtask = q->begnext = q->varcolbeg = q->focus_pid = 0; ++ q->rc.maxtasks = q->usrseltyp = q->begpflg = q->begtask = q->varcolbeg = q->focus_pid = 0; + #else +- q->rc.maxtasks = q->usrseltyp = q->begpflg = q->begtask = q->begnext = q->focus_pid = 0; ++ q->rc.maxtasks = q->usrseltyp = q->begpflg = q->begtask = q->focus_pid = 0; + #endif ++ mkVIZoff(q) + // these next two are global, not really windows based + Monpidsidx = 0; + Rc.tics_scaled = 0; +@@ -5116,7 +5117,6 @@ static void keys_global (int ch) { + case '?': + case 'h': + help_view(); +- mkVIZrow1 + break; + case 'B': + TOGw(w, View_NOBOLD); +@@ -5143,7 +5143,6 @@ static void keys_global (int ch) { + break; + case 'g': + win_select(0); +- mkVIZrow1 + break; + case 'H': + Thread_mode = !Thread_mode; +@@ -5224,7 +5223,6 @@ static void keys_global (int ch) { + break; + case 'Z': + wins_colors(); +- mkVIZrow1 + break; + case '0': + Rc.zero_suppress = !Rc.zero_suppress; +@@ -5446,10 +5444,7 @@ static void keys_task (int ch) { + case 'O': + case 'o': + case kbd_CtrlO: +- if (VIZCHKw(w)) { +- other_filters(ch); +- mkVIZrow1 +- } ++ if (VIZCHKw(w)) other_filters(ch); + break; + case 'U': + case 'u': +@@ -5458,7 +5453,6 @@ static void keys_task (int ch) { + if (*str != kbd_ESC + && (errmsg = user_certify(w, str, ch))) + show_msg(errmsg); +- mkVIZrow1 + } + break; + case 'V': +@@ -5565,10 +5559,7 @@ static void keys_window (int ch) { + break; + case 'a': + case 'w': +- if (ALTCHKw) { +- win_select(ch); +- mkVIZrow1 +- } ++ if (ALTCHKw) win_select(ch); + break; + case 'G': + if (ALTCHKw) { +@@ -5665,10 +5656,8 @@ static void keys_window (int ch) { + case kbd_HOME: + #ifndef SCROLLVAR_NO + if (VIZCHKw(w)) if (CHKw(w, Show_IDLEPS)) w->begtask = w->begpflg = w->varcolbeg = 0; +- mkVIZrow1 + #else + if (VIZCHKw(w)) if (CHKw(w, Show_IDLEPS)) w->begtask = w->begpflg = 0; +- mkVIZrow1 + #endif + break; + case kbd_END: +@@ -6109,6 +6098,14 @@ static void do_key (int ch) { + if (strchr(key_tab[i].keys, ch)) { + key_tab[i].func(ch); + Frames_signal = BREAK_kbd; ++ /* due to the proliferation of the need for 'mkVIZrow1', | ++ aside from 'wins_stage_2' use, we'll now issue it one | ++ time here. there will remain several places where the | ++ companion 'mkVIZrowX' macro is issued, thus the check | ++ for a value already in 'begnext' in this conditional. | */ ++ if (CHKw(Curwin, Show_TASKON) && !mkVIZyes) ++ mkVIZrow1 ++ + goto all_done; + } + }; +@@ -6493,14 +6490,11 @@ static const char *task_show (const WIN_t *q, int idx) { + + + /* +- * A window_show *Helper* function ensuring that Curwin's 'begtask' +- * represents a visible process (not any hidden/filtered-out task). +- * In reality, this function is called: +- * 1) exclusively for the 'current' window +- * 2) immediately after interacting with the user +- * 3) who struck: up, down, pgup, pgdn, home, end, 'o/O' or 'u/U' +- * 4) or upon the user switching from one window to another window +- * ( note: it's entirely possible there are NO visible tasks to show ) */ ++ * A window_show *Helper* function ensuring that a window 'begtask' | ++ * represents a visible process (not any hidden/filtered-out task). | ++ * In reality this function is called exclusively for the 'current' | ++ * window and only after available user keystroke(s) are processed. | ++ * Note: it's entirely possible there are NO visible tasks to show! | */ + static void window_hlp (void) { + WIN_t *w = Curwin; // avoid gcc bloat with a local copy + int i, reversed; +@@ -6548,7 +6542,7 @@ fwd_redux: + } + + wrap_up: +- w->begnext = 0; ++ mkVIZoff(w) + OFFw(w, NOPRINT_xxx); + } // end: window_hlp + +diff --git a/top/top.h b/top/top.h +index 40fe0ec..9d44669 100644 +--- a/top/top.h ++++ b/top/top.h +@@ -427,9 +427,10 @@ typedef struct WIN_t { + + // Support for a proper (visible) row #1 whenever Curwin changes + // ( or a key which might affect vertical scrolling was struck ) +-#define mkVIZyes Curwin->begnext != 0 ++#define mkVIZyes ( Curwin->begnext != 0 ) + #define mkVIZrow1 { Curwin->begnext = +1; Curwin->begtask -= 1; } + #define mkVIZrowX(n) { Curwin->begnext = (n); } ++#define mkVIZoff(w) { w->begnext = 0; } + + /* Special Section: end ------------------------------------------ */ + /* /////////////////////////////////////////////////////////////// */ +-- +2.33.0 + diff --git a/procps-ng.spec b/procps-ng.spec index c30979e..6940e93 100644 --- a/procps-ng.spec +++ b/procps-ng.spec @@ -1,6 +1,6 @@ Name: procps-ng Version: 4.0.0 -Release: 1 +Release: 2 Summary: Utilities that provide system information. License: GPL+ and GPLv2 and GPLv2+ and GPLv3+ and LGPLv2+ URL: https://sourceforge.net/projects/procps-ng/ @@ -11,6 +11,7 @@ Source2: README.top Patch1: 0001-add-M-and-N-options-for-top.patch Patch2: 0002-top-exit-with-error-when-pid-overflow.patch +Patch3: 0003-top-eliminate-a-potential-abend-when-exiting-A-mode.patch BuildRequires: ncurses-devel libtool autoconf automake gcc gettext-devel systemd-devel @@ -90,6 +91,9 @@ ln -s %{_bindir}/pidof %{buildroot}%{_sbindir}/pidof %{_mandir}/man* %changelog +* Mon Nov 7 2022 zhoujie - 4.0.0-2 +- top eliminate a potential abend when exiting A mode + * Fri Nov 4 2022 zhoujie - 4.0.0-1 - update the release to 4.0.0-1 -- Gitee