- Fixing crashes in 'top' when a deep forking appears (#1153642)
This commit is contained in:
parent
66214f1002
commit
c490d06c70
115
procps-ng-3.3.10-top-fix-deep-forking-forest-crash.patch
Normal file
115
procps-ng-3.3.10-top-fix-deep-forking-forest-crash.patch
Normal file
@ -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 ------------------------------------------*/
|
@ -4,13 +4,15 @@
|
|||||||
Summary: System and process monitoring utilities
|
Summary: System and process monitoring utilities
|
||||||
Name: procps-ng
|
Name: procps-ng
|
||||||
Version: 3.3.10
|
Version: 3.3.10
|
||||||
Release: 7%{?dist}
|
Release: 8%{?dist}
|
||||||
License: GPL+ and GPLv2 and GPLv2+ and GPLv3+ and LGPLv2+
|
License: GPL+ and GPLv2 and GPLv2+ and GPLv3+ and LGPLv2+
|
||||||
Group: Applications/System
|
Group: Applications/System
|
||||||
URL: https://sourceforge.net/projects/procps-ng/
|
URL: https://sourceforge.net/projects/procps-ng/
|
||||||
|
|
||||||
Source0: http://downloads.sourceforge.net/%{name}/%{name}-%{version}.tar.xz
|
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(post): /sbin/ldconfig
|
||||||
Requires(postun): /sbin/ldconfig
|
Requires(postun): /sbin/ldconfig
|
||||||
|
|
||||||
@ -84,6 +86,8 @@ Internationalization pack for procps-ng
|
|||||||
%prep
|
%prep
|
||||||
%setup -q -n %{name}-%{version}
|
%setup -q -n %{name}-%{version}
|
||||||
|
|
||||||
|
%patch0 -p1
|
||||||
|
|
||||||
%build
|
%build
|
||||||
# The following stuff is needed for git archives only
|
# The following stuff is needed for git archives only
|
||||||
#echo "%{version}" > .tarball-version
|
#echo "%{version}" > .tarball-version
|
||||||
@ -166,6 +170,9 @@ ln -s %{_bindir}/pidof %{buildroot}%{_sbindir}/pidof
|
|||||||
%files i18n -f %{name}.lang
|
%files i18n -f %{name}.lang
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Mon Aug 10 2015 Jaromir Capik <jcapik@redhat.com> - 3.3.10-8
|
||||||
|
- Fixing crashes in 'top' when a deep forking appears (#1153642)
|
||||||
|
|
||||||
* Thu Jun 18 2015 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 3.3.10-7
|
* Thu Jun 18 2015 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 3.3.10-7
|
||||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user