From c490d06c70d1420777616954658c0284ebd1ea4d Mon Sep 17 00:00:00 2001 From: Jaromir Capik Date: Aug 10 2015 15:46:52 +0000 Subject: - Fixing crashes in 'top' when a deep forking appears (#1153642) --- diff --git a/procps-ng-3.3.10-top-fix-deep-forking-forest-crash.patch b/procps-ng-3.3.10-top-fix-deep-forking-forest-crash.patch new file mode 100644 index 0000000..8a23053 --- /dev/null +++ b/procps-ng-3.3.10-top-fix-deep-forking-forest-crash.patch @@ -0,0 +1,115 @@ +diff --git a/top/top.c b/top/top.c +index 39c8545..ce63508 100644 +--- a/top/top.c ++++ b/top/top.c +@@ -3524,8 +3524,9 @@ static void configs_read (void) { + case 'g': // from 3.3.4 thru 3.3.8 + scat(w->rc.fieldscur, RCF_PLUS_H); + case 'h': // this is release 3.3.9 +- /* w->rc.graph_cpus = 0; */// for documentation only, since +- /* w->rc.graph_mems = 0; */// DEF_RCFILE zeroes them for us ++ w->rc.graph_cpus = w->rc.graph_mems = 0; ++ // these next 2 are really global, but best documented here ++ Rc.summ_mscale = Rc.task_mscale = SK_Kb; + case 'i': // actual RCF_VERSION_ID + default: // and a future version? + if (strlen(w->rc.fieldscur) != sizeof(DEF_FIELDS) - 1) +@@ -4894,27 +4895,36 @@ static void keys_xtra (int ch) { + * ( plus, maintain alphabetical order with carefully chosen ) + * ( function names: forest_a, forest_b, forest_c & forest_d ) + * ( each with exactly one letter more than its predecessor! ) */ +-static proc_t **Seed_ppt; // temporary window ppt ptr +-static proc_t **Tree_ppt; // resized by forest_create +-static int Tree_idx; // frame_make initializes ++static proc_t **Seed_ppt; // temporary win ppt pointer ++static proc_t **Tree_ppt; // forest_create will resize ++static int Tree_idx; // frame_make resets to zero + + /* + * This little recursive guy is the real forest view workhorse. + * He fills in the Tree_ppt array and also sets the child indent + * level which is stored in an unused proc_t padding byte. */ +-static void forest_adds (const int self, const int level) { ++static void forest_adds (const int self, int level) { + int i; + +- Tree_ppt[Tree_idx] = Seed_ppt[self]; // add this as root or child +- Tree_ppt[Tree_idx++]->pad_3 = level; // borrow 1 byte, 127 levels +- for (i = self + 1; i < Frame_maxtask; i++) { +- if (Seed_ppt[self]->tid == Seed_ppt[i]->tgid +- || (Seed_ppt[self]->tid == Seed_ppt[i]->ppid && Seed_ppt[i]->tid == Seed_ppt[i]->tgid)) +- forest_adds(i, level + 1); // got one child any others? ++ if (Tree_idx < Frame_maxtask) { // immunize against insanity ++ if (level > 100) level = 101; // our arbitrary nests limit ++ Tree_ppt[Tree_idx] = Seed_ppt[self]; // add this as root or child ++ Tree_ppt[Tree_idx++]->pad_3 = level; // borrow 1 byte, 127 levels ++#ifdef TREE_SCANALL ++ for (i = 0; i < Frame_maxtask; i++) { ++ if (i == self) continue; ++#else ++ for (i = self + 1; i < Frame_maxtask; i++) { ++#endif ++ if (Seed_ppt[self]->tid == Seed_ppt[i]->tgid ++ || (Seed_ppt[self]->tid == Seed_ppt[i]->ppid && Seed_ppt[i]->tid == Seed_ppt[i]->tgid)) ++ forest_adds(i, level + 1); // got one child any others? ++ } + } + } // end: forest_adds + + ++#ifndef TREE_SCANALL + /* + * Our qsort callback to order a ppt by the non-display start_time + * which will make us immune from any pid, ppid or tgid anomalies +@@ -4924,6 +4934,7 @@ static int forest_based (const proc_t **x, const proc_t **y) { + if ( (*x)->start_time < (*y)->start_time ) return -1; + return 0; + } // end: forest_based ++#endif + + + /* +@@ -4941,7 +4952,9 @@ static void forest_create (WIN_t *q) { + hwmsav = Frame_maxtask; + Tree_ppt = alloc_r(Tree_ppt, sizeof(proc_t*) * hwmsav); + } ++#ifndef TREE_SCANALL + qsort(Seed_ppt, Frame_maxtask, sizeof(proc_t*), (QFP_t)forest_based); ++#endif + for (i = 0; i < Frame_maxtask; i++) // avoid any hidepid distortions + if (!Seed_ppt[i]->pad_3) // identify real or pretend trees + forest_adds(i, 1); // add as parent plus its children +@@ -4962,7 +4975,8 @@ static inline const char *forest_display (const WIN_t *q, const proc_t *p) { + const char *which = (CHKw(q, Show_CMDLIN)) ? *p->cmdline : p->cmd; + + if (!CHKw(q, Show_FOREST) || 1 == p->pad_3) return which; +- snprintf(buf, sizeof(buf), "%*s%s", 4 * (p->pad_3 - 1), " `- ", which); ++ if (p->pad_3 > 100) snprintf(buf, sizeof(buf), "%400s%s", " + ", which); ++ else snprintf(buf, sizeof(buf), "%*s%s", 4 * (p->pad_3 - 1), " `- ", which); + return buf; + } // end: forest_display + +diff --git a/top/top.h b/top/top.h +index 8f61d82..1b1b1a1 100644 +--- a/top/top.h ++++ b/top/top.h +@@ -59,6 +59,7 @@ + //#define STRINGCASENO /* case insenstive compare/locate versions */ + //#define TERMIOS_ONLY /* just limp along with native input only */ + //#define TREE_NORESET /* sort keys do NOT force forest view OFF */ ++//#define TREE_SCANALL /* rescan array w/ forest view, avoid sort */ + //#define USE_X_COLHDR /* emphasize header vs. whole col, for 'x' */ + //#define VALIDATE_NLS /* validate the integrity of all nls tbls */ + +@@ -780,8 +781,10 @@ typedef struct WIN_t { + //atic void keys_window (int ch); + //atic void keys_xtra (int ch); + /*------ Forest View support -------------------------------------------*/ +-//atic void forest_adds (const int self, const int level); ++//atic void forest_adds (const int self, int level); ++#ifndef TREE_SCANALL + //atic int forest_based (const proc_t **x, const proc_t **y); ++#endif + //atic void forest_create (WIN_t *q); + //atic inline const char *forest_display (const WIN_t *q, const proc_t *p); + /*------ Main Screen routines ------------------------------------------*/ diff --git a/procps-ng.spec b/procps-ng.spec index 04aa61f..ee69407 100644 --- a/procps-ng.spec +++ b/procps-ng.spec @@ -4,13 +4,15 @@ Summary: System and process monitoring utilities Name: procps-ng Version: 3.3.10 -Release: 7%{?dist} +Release: 8%{?dist} License: GPL+ and GPLv2 and GPLv2+ and GPLv3+ and LGPLv2+ Group: Applications/System URL: https://sourceforge.net/projects/procps-ng/ Source0: http://downloads.sourceforge.net/%{name}/%{name}-%{version}.tar.xz +Patch0: procps-ng-3.3.10-top-fix-deep-forking-forest-crash.patch + Requires(post): /sbin/ldconfig Requires(postun): /sbin/ldconfig @@ -84,6 +86,8 @@ Internationalization pack for procps-ng %prep %setup -q -n %{name}-%{version} +%patch0 -p1 + %build # The following stuff is needed for git archives only #echo "%{version}" > .tarball-version @@ -166,6 +170,9 @@ ln -s %{_bindir}/pidof %{buildroot}%{_sbindir}/pidof %files i18n -f %{name}.lang %changelog +* Mon Aug 10 2015 Jaromir Capik - 3.3.10-8 +- Fixing crashes in 'top' when a deep forking appears (#1153642) + * Thu Jun 18 2015 Fedora Release Engineering - 3.3.10-7 - Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild