basebuilder_pel7x64builder0
6 years ago
20 changed files with 1614 additions and 0 deletions
@ -0,0 +1,337 @@
@@ -0,0 +1,337 @@
|
||||
From 9d2ec74b76d220f5343e548fcb7058d723293a22 Mon Sep 17 00:00:00 2001 |
||||
From: Qualys Security Advisory <qsa@qualys.com> |
||||
Date: Thu, 1 Jan 1970 00:00:00 +0000 |
||||
Subject: [PATCH 1/3] proc/alloc.*: Use size_t, not unsigned int. |
||||
|
||||
Otherwise this can truncate sizes on 64-bit platforms, and is one of the |
||||
reasons the integer overflows in file2strvec() are exploitable at all. |
||||
Also: catch potential integer overflow in xstrdup() (should never |
||||
happen, but better safe than sorry), and use memcpy() instead of |
||||
strcpy() (faster). |
||||
|
||||
Warnings: |
||||
|
||||
- in glibc, realloc(ptr, 0) is equivalent to free(ptr), but not here, |
||||
because of the ++size; |
||||
|
||||
- here, xstrdup() can return NULL (if str is NULL), which goes against |
||||
the idea of the xalloc wrappers. |
||||
|
||||
We were tempted to call exit() or xerrx() in those cases, but decided |
||||
against it, because it might break things in unexpected places; TODO? |
||||
--- |
||||
proc/alloc.c | 20 ++++++++++++-------- |
||||
proc/alloc.h | 4 ++-- |
||||
2 files changed, 14 insertions(+), 10 deletions(-) |
||||
|
||||
diff --git a/proc/alloc.c b/proc/alloc.c |
||||
index 94af47f..1768d73 100644 |
||||
--- a/proc/alloc.c |
||||
+++ b/proc/alloc.c |
||||
@@ -37,14 +37,14 @@ static void xdefault_error(const char *restrict fmts, ...) { |
||||
message_fn xalloc_err_handler = xdefault_error; |
||||
|
||||
|
||||
-void *xcalloc(unsigned int size) { |
||||
+void *xcalloc(size_t size) { |
||||
void * p; |
||||
|
||||
if (size == 0) |
||||
++size; |
||||
p = calloc(1, size); |
||||
if (!p) { |
||||
- xalloc_err_handler("%s failed to allocate %u bytes of memory", __func__, size); |
||||
+ xalloc_err_handler("%s failed to allocate %zu bytes of memory", __func__, size); |
||||
exit(EXIT_FAILURE); |
||||
} |
||||
return p; |
||||
@@ -57,20 +57,20 @@ void *xmalloc(size_t size) { |
||||
++size; |
||||
p = malloc(size); |
||||
if (!p) { |
||||
- xalloc_err_handler("%s failed to allocate %zu bytes of memory", __func__, size); |
||||
+ xalloc_err_handler("%s failed to allocate %zu bytes of memory", __func__, size); |
||||
exit(EXIT_FAILURE); |
||||
} |
||||
return(p); |
||||
} |
||||
|
||||
-void *xrealloc(void *oldp, unsigned int size) { |
||||
+void *xrealloc(void *oldp, size_t size) { |
||||
void *p; |
||||
|
||||
if (size == 0) |
||||
++size; |
||||
p = realloc(oldp, size); |
||||
if (!p) { |
||||
- xalloc_err_handler("%s failed to allocate %u bytes of memory", __func__, size); |
||||
+ xalloc_err_handler("%s failed to allocate %zu bytes of memory", __func__, size); |
||||
exit(EXIT_FAILURE); |
||||
} |
||||
return(p); |
||||
@@ -80,13 +80,17 @@ char *xstrdup(const char *str) { |
||||
char *p = NULL; |
||||
|
||||
if (str) { |
||||
- unsigned int size = strlen(str) + 1; |
||||
+ size_t size = strlen(str) + 1; |
||||
+ if (size < 1) { |
||||
+ xalloc_err_handler("%s refused to allocate %zu bytes of memory", __func__, size); |
||||
+ exit(EXIT_FAILURE); |
||||
+ } |
||||
p = malloc(size); |
||||
if (!p) { |
||||
- xalloc_err_handler("%s failed to allocate %u bytes of memory", __func__, size); |
||||
+ xalloc_err_handler("%s failed to allocate %zu bytes of memory", __func__, size); |
||||
exit(EXIT_FAILURE); |
||||
} |
||||
- strcpy(p, str); |
||||
+ memcpy(p, str, size); |
||||
} |
||||
return(p); |
||||
} |
||||
diff --git a/proc/alloc.h b/proc/alloc.h |
||||
index 19c91d7..6787a72 100644 |
||||
--- a/proc/alloc.h |
||||
+++ b/proc/alloc.h |
||||
@@ -8,9 +8,9 @@ EXTERN_C_BEGIN |
||||
/* change xalloc_err_handler to override the default fprintf(stderr... */ |
||||
extern message_fn xalloc_err_handler; |
||||
|
||||
-extern void *xcalloc(unsigned int size) MALLOC; |
||||
+extern void *xcalloc(size_t size) MALLOC; |
||||
extern void *xmalloc(size_t size) MALLOC; |
||||
-extern void *xrealloc(void *oldp, unsigned int size) MALLOC; |
||||
+extern void *xrealloc(void *oldp, size_t size) MALLOC; |
||||
extern char *xstrdup(const char *str) MALLOC; |
||||
|
||||
EXTERN_C_END |
||||
-- |
||||
2.14.3 |
||||
|
||||
|
||||
From de660b14b80188d9b323c4999d1b91a9456ed687 Mon Sep 17 00:00:00 2001 |
||||
From: Qualys Security Advisory <qsa@qualys.com> |
||||
Date: Thu, 1 Jan 1970 00:00:00 +0000 |
||||
Subject: [PATCH 2/3] proc/readproc.c: Harden file2str(). |
||||
|
||||
1/ Replace sprintf() with snprintf() (and check for truncation). |
||||
|
||||
2/ Prevent an integer overflow of ub->siz. The "tot_read--" is needed to |
||||
avoid an off-by-one overflow in "ub->buf[tot_read] = '\0'". It is safe |
||||
to decrement tot_read here, because we know that tot_read is equal to |
||||
ub->siz (and ub->siz is very large). |
||||
|
||||
We believe that truncation is a better option than failure (implementing |
||||
failure instead should be as easy as replacing the "tot_read--" with |
||||
"tot_read = 0"). |
||||
--- |
||||
proc/readproc.c | 10 ++++++++-- |
||||
1 file changed, 8 insertions(+), 2 deletions(-) |
||||
|
||||
diff --git a/proc/readproc.c b/proc/readproc.c |
||||
index 9e3afc9..39235c7 100644 |
||||
--- a/proc/readproc.c |
||||
+++ b/proc/readproc.c |
||||
@@ -35,6 +35,7 @@ |
||||
#include <signal.h> |
||||
#include <fcntl.h> |
||||
#include <dirent.h> |
||||
+#include <limits.h> |
||||
#include <sys/types.h> |
||||
#include <sys/stat.h> |
||||
#ifdef WITH_SYSTEMD |
||||
@@ -622,7 +623,7 @@ static void statm2proc(const char* s, proc_t *restrict P) { |
||||
static int file2str(const char *directory, const char *what, struct utlbuf_s *ub) { |
||||
#define buffGRW 1024 |
||||
char path[PROCPATHLEN]; |
||||
- int fd, num, tot_read = 0; |
||||
+ int fd, num, tot_read = 0, len; |
||||
|
||||
/* on first use we preallocate a buffer of minimum size to emulate |
||||
former 'local static' behavior -- even if this read fails, that |
||||
@@ -630,11 +631,16 @@ static int file2str(const char *directory, const char *what, struct utlbuf_s *ub |
||||
( besides, with this xcalloc we will never need to use memcpy ) */ |
||||
if (ub->buf) ub->buf[0] = '\0'; |
||||
else ub->buf = xcalloc((ub->siz = buffGRW)); |
||||
- sprintf(path, "%s/%s", directory, what); |
||||
+ len = snprintf(path, sizeof path, "%s/%s", directory, what); |
||||
+ if (len <= 0 || (size_t)len >= sizeof path) return -1; |
||||
if (-1 == (fd = open(path, O_RDONLY, 0))) return -1; |
||||
while (0 < (num = read(fd, ub->buf + tot_read, ub->siz - tot_read))) { |
||||
tot_read += num; |
||||
if (tot_read < ub->siz) break; |
||||
+ if (ub->siz >= INT_MAX - buffGRW) { |
||||
+ tot_read--; |
||||
+ break; |
||||
+ } |
||||
ub->buf = xrealloc(ub->buf, (ub->siz += buffGRW)); |
||||
}; |
||||
ub->buf[tot_read] = '\0'; |
||||
-- |
||||
2.14.3 |
||||
|
||||
|
||||
From 44a4b658f45bc3fbd7170662a52038a7b35c83de Mon Sep 17 00:00:00 2001 |
||||
From: Qualys Security Advisory <qsa@qualys.com> |
||||
Date: Thu, 1 Jan 1970 00:00:00 +0000 |
||||
Subject: [PATCH 3/3] proc/readproc.c: Fix bugs and overflows in file2strvec(). |
||||
|
||||
Note: this is by far the most important and complex patch of the whole |
||||
series, please review it carefully; thank you very much! |
||||
|
||||
For this patch, we decided to keep the original function's design and |
||||
skeleton, to avoid regressions and behavior changes, while fixing the |
||||
various bugs and overflows. And like the "Harden file2str()" patch, this |
||||
patch does not fail when about to overflow, but truncates instead: there |
||||
is information available about this process, so return it to the caller; |
||||
also, we used INT_MAX as a limit, but a lower limit could be used. |
||||
|
||||
The easy changes: |
||||
|
||||
- Replace sprintf() with snprintf() (and check for truncation). |
||||
|
||||
- Replace "if (n == 0 && rbuf == 0)" with "if (n <= 0 && tot <= 0)" and |
||||
do break instead of return: it simplifies the code (only one place to |
||||
handle errors), and also guarantees that in the while loop either n or |
||||
tot is > 0 (or both), even if n is reset to 0 when about to overflow. |
||||
|
||||
- Remove the "if (n < 0)" block in the while loop: it is (and was) dead |
||||
code, since we enter the while loop only if n >= 0. |
||||
|
||||
- Rewrite the missing-null-terminator detection: in the original |
||||
function, if the size of the file is a multiple of 2047, a null- |
||||
terminator is appended even if the file is already null-terminated. |
||||
|
||||
- Replace "if (n <= 0 && !end_of_file)" with "if (n < 0 || tot <= 0)": |
||||
originally, it was equivalent to "if (n < 0)", but we added "tot <= 0" |
||||
to handle the first break of the while loop, and to guarantee that in |
||||
the rest of the function tot is > 0. |
||||
|
||||
- Double-force ("belt and suspenders") the null-termination of rbuf: |
||||
this is (and was) essential to the correctness of the function. |
||||
|
||||
- Replace the final "while" loop with a "for" loop that behaves just |
||||
like the preceding "for" loop: in the original function, this would |
||||
lead to unexpected results (for example, if rbuf is |\0|A|\0|, this |
||||
would return the array {"",NULL} but should return {"","A",NULL}; and |
||||
if rbuf is |A|\0|B| (should never happen because rbuf should be null- |
||||
terminated), this would make room for two pointers in ret, but would |
||||
write three pointers to ret). |
||||
|
||||
The hard changes: |
||||
|
||||
- Prevent the integer overflow of tot in the while loop, but unlike |
||||
file2str(), file2strvec() cannot let tot grow until it almost reaches |
||||
INT_MAX, because it needs more space for the pointers: this is why we |
||||
introduced ARG_LEN, which also guarantees that we can add "align" and |
||||
a few sizeof(char*)s to tot without overflowing. |
||||
|
||||
- Prevent the integer overflow of "tot + c + align": when INT_MAX is |
||||
(almost) reached, we write the maximal safe amount of pointers to ret |
||||
(ARG_LEN guarantees that there is always space for *ret = rbuf and the |
||||
NULL terminator). |
||||
--- |
||||
proc/readproc.c | 53 ++++++++++++++++++++++++++++++++--------------------- |
||||
1 file changed, 32 insertions(+), 21 deletions(-) |
||||
|
||||
diff --git a/proc/readproc.c b/proc/readproc.c |
||||
index 39235c7..94ca4e9 100644 |
||||
--- a/proc/readproc.c |
||||
+++ b/proc/readproc.c |
||||
@@ -652,11 +652,12 @@ static int file2str(const char *directory, const char *what, struct utlbuf_s *ub |
||||
|
||||
static char** file2strvec(const char* directory, const char* what) { |
||||
char buf[2048]; /* read buf bytes at a time */ |
||||
- char *p, *rbuf = 0, *endbuf, **q, **ret; |
||||
+ char *p, *rbuf = 0, *endbuf, **q, **ret, *strp; |
||||
int fd, tot = 0, n, c, end_of_file = 0; |
||||
int align; |
||||
|
||||
- sprintf(buf, "%s/%s", directory, what); |
||||
+ const int len = snprintf(buf, sizeof buf, "%s/%s", directory, what); |
||||
+ if(len <= 0 || (size_t)len >= sizeof buf) return NULL; |
||||
fd = open(buf, O_RDONLY, 0); |
||||
if(fd==-1) return NULL; |
||||
|
||||
@@ -664,18 +665,23 @@ static char** file2strvec(const char* directory, const char* what) { |
||||
while ((n = read(fd, buf, sizeof buf - 1)) >= 0) { |
||||
if (n < (int)(sizeof buf - 1)) |
||||
end_of_file = 1; |
||||
- if (n == 0 && rbuf == 0) { |
||||
- close(fd); |
||||
- return NULL; /* process died between our open and read */ |
||||
+ if (n <= 0 && tot <= 0) { /* nothing read now, nothing read before */ |
||||
+ break; /* process died between our open and read */ |
||||
} |
||||
- if (n < 0) { |
||||
- if (rbuf) |
||||
- free(rbuf); |
||||
- close(fd); |
||||
- return NULL; /* read error */ |
||||
+ /* ARG_LEN is our guesstimated median length of a command-line argument |
||||
+ or environment variable (the minimum is 1, the maximum is 131072) */ |
||||
+ #define ARG_LEN 64 |
||||
+ if (tot >= INT_MAX / (ARG_LEN + (int)sizeof(char*)) * ARG_LEN - n) { |
||||
+ end_of_file = 1; /* integer overflow: null-terminate and break */ |
||||
+ n = 0; /* but tot > 0 */ |
||||
} |
||||
- if (end_of_file && (n == 0 || buf[n-1]))/* last read char not null */ |
||||
+ #undef ARG_LEN |
||||
+ if (end_of_file && |
||||
+ ((n > 0 && buf[n-1] != '\0') || /* last read char not null */ |
||||
+ (n <= 0 && rbuf[tot-1] != '\0'))) /* last read char not null */ |
||||
buf[n++] = '\0'; /* so append null-terminator */ |
||||
+ |
||||
+ if (n <= 0) break; /* unneeded (end_of_file = 1) but avoid realloc */ |
||||
rbuf = xrealloc(rbuf, tot + n); /* allocate more memory */ |
||||
memcpy(rbuf + tot, buf, n); /* copy buffer into it */ |
||||
tot += n; /* increment total byte ctr */ |
||||
@@ -683,29 +689,34 @@ static char** file2strvec(const char* directory, const char* what) { |
||||
break; |
||||
} |
||||
close(fd); |
||||
- if (n <= 0 && !end_of_file) { |
||||
+ if (n < 0 || tot <= 0) { /* error, or nothing read */ |
||||
if (rbuf) free(rbuf); |
||||
return NULL; /* read error */ |
||||
} |
||||
+ rbuf[tot-1] = '\0'; /* belt and suspenders (the while loop did it, too) */ |
||||
endbuf = rbuf + tot; /* count space for pointers */ |
||||
align = (sizeof(char*)-1) - ((tot + sizeof(char*)-1) & (sizeof(char*)-1)); |
||||
- for (c = 0, p = rbuf; p < endbuf; p++) { |
||||
- if (!*p || *p == '\n') |
||||
+ c = sizeof(char*); /* one extra for NULL term */ |
||||
+ for (p = rbuf; p < endbuf; p++) { |
||||
+ if (!*p || *p == '\n') { |
||||
+ if (c >= INT_MAX - (tot + (int)sizeof(char*) + align)) break; |
||||
c += sizeof(char*); |
||||
+ } |
||||
if (*p == '\n') |
||||
*p = 0; |
||||
} |
||||
- c += sizeof(char*); /* one extra for NULL term */ |
||||
|
||||
rbuf = xrealloc(rbuf, tot + c + align); /* make room for ptrs AT END */ |
||||
endbuf = rbuf + tot; /* addr just past data buf */ |
||||
q = ret = (char**) (endbuf+align); /* ==> free(*ret) to dealloc */ |
||||
- *q++ = p = rbuf; /* point ptrs to the strings */ |
||||
- endbuf--; /* do not traverse final NUL */ |
||||
- while (++p < endbuf) |
||||
- if (!*p) /* NUL char implies that */ |
||||
- *q++ = p+1; /* next string -> next char */ |
||||
- |
||||
+ for (strp = p = rbuf; p < endbuf; p++) { |
||||
+ if (!*p) { /* NUL char implies that */ |
||||
+ if (c < 2 * (int)sizeof(char*)) break; |
||||
+ c -= sizeof(char*); |
||||
+ *q++ = strp; /* point ptrs to the strings */ |
||||
+ strp = p+1; /* next string -> next char */ |
||||
+ } |
||||
+ } |
||||
*q = 0; /* null ptr list terminator */ |
||||
return ret; |
||||
} |
||||
-- |
||||
2.14.3 |
||||
|
@ -0,0 +1,89 @@
@@ -0,0 +1,89 @@
|
||||
diff --git a/proc/sysinfo.c b/proc/sysinfo.c |
||||
index 1435de1..1d2b8e2 100644 |
||||
--- a/proc/sysinfo.c |
||||
+++ b/proc/sysinfo.c |
||||
@@ -36,6 +36,9 @@ |
||||
#include <netinet/in.h> /* htons */ |
||||
#endif |
||||
|
||||
+#include <link.h> |
||||
+#include <elf.h> |
||||
+ |
||||
long smp_num_cpus; /* number of CPUs */ |
||||
long page_bytes; /* this architecture's page size */ |
||||
|
||||
@@ -249,15 +252,67 @@ static void old_Hertz_hack(void){ |
||||
|
||||
extern char** environ; |
||||
|
||||
-/* for ELF executables, notes are pushed before environment and args */ |
||||
-static unsigned long find_elf_note(unsigned long findme){ |
||||
+static unsigned long find_elf_note(unsigned long type) |
||||
+{ |
||||
+ ElfW(auxv_t) auxv_struct; |
||||
+ ElfW(auxv_t) *auxv_temp; |
||||
+ FILE *fd; |
||||
+ int i; |
||||
+ static ElfW(auxv_t) *auxv = NULL; |
||||
unsigned long *ep = (unsigned long *)environ; |
||||
- while(*ep++); |
||||
- while(*ep){ |
||||
- if(ep[0]==findme) return ep[1]; |
||||
- ep+=2; |
||||
+ unsigned long ret_val = NOTE_NOT_FOUND; |
||||
+ |
||||
+ |
||||
+ if(!auxv) { |
||||
+ |
||||
+ fd = fopen("/proc/self/auxv", "rb"); |
||||
+ |
||||
+ if(!fd) { // can't open auxv? that could be caused by euid change |
||||
+ // ... and we need to fall back to the old and unsafe |
||||
+ // ... method that doesn't work when calling library |
||||
+ // ... functions with dlopen -> FIXME :( |
||||
+ |
||||
+ while(*ep++); // for ELF executables, notes are pushed |
||||
+ while(*ep){ // ... before environment and args |
||||
+ if(ep[0]==type) return ep[1]; |
||||
+ ep+=2; |
||||
+ } |
||||
+ return NOTE_NOT_FOUND; |
||||
+ } |
||||
+ |
||||
+ auxv = (ElfW(auxv_t) *) malloc(getpagesize()); |
||||
+ if (!auxv) { |
||||
+ perror("malloc"); |
||||
+ exit(EXIT_FAILURE); |
||||
+ } |
||||
+ |
||||
+ i = 0; |
||||
+ do { |
||||
+ fread(&auxv_struct, sizeof(ElfW(auxv_t)), 1, fd); |
||||
+ auxv[i] = auxv_struct; |
||||
+ i++; |
||||
+ } while (auxv_struct.a_type != AT_NULL); |
||||
+ |
||||
+ fclose(fd); |
||||
+ |
||||
+ } |
||||
+ |
||||
+ auxv_temp = auxv; |
||||
+ i = 0; |
||||
+ do { |
||||
+ if(auxv_temp[i].a_type == type) { |
||||
+ ret_val = (unsigned long)auxv_temp[i].a_un.a_val; |
||||
+ break; |
||||
+ } |
||||
+ i++; |
||||
+ } while (auxv_temp[i].a_type != AT_NULL); |
||||
+ |
||||
+ if (auxv){ |
||||
+ auxv_temp = NULL; |
||||
+ free(auxv); |
||||
+ auxv = NULL; |
||||
} |
||||
- return NOTE_NOT_FOUND; |
||||
+ return ret_val; |
||||
} |
||||
|
||||
int have_privs; |
@ -0,0 +1,97 @@
@@ -0,0 +1,97 @@
|
||||
diff -up ./free.1.orig ./free.1 |
||||
--- ./free.1.orig 2018-01-16 16:11:35.609874589 +0100 |
||||
+++ ./free.1 2018-01-17 14:33:04.625716399 +0100 |
||||
@@ -62,6 +62,9 @@ Display the amount of memory in gigabyte |
||||
\fB\-\-tera\fR |
||||
Display the amount of memory in terabytes. |
||||
.TP |
||||
+\fB\-\-peta\fR |
||||
+Display the amount of memory in petabytes. |
||||
+.TP |
||||
\fB\-h\fR, \fB\-\-human\fP |
||||
Show all output fields automatically scaled to shortest three digit unit and |
||||
display the units of print out. Following units are used. |
||||
@@ -72,9 +75,10 @@ display the units of print out. Followi |
||||
M = megas |
||||
G = gigas |
||||
T = teras |
||||
+ P = petas |
||||
.fi |
||||
.sp |
||||
-If unit is missing, and you have petabyte of RAM or swap, the number is in |
||||
+If unit is missing, and you have exabyte of RAM or swap, the number is in |
||||
terabytes and columns might not be aligned with header. |
||||
.TP |
||||
\fB\-w\fR, \fB\-\-wide\fR |
||||
diff -up ./free.c.orig ./free.c |
||||
--- ./free.c.orig 2018-01-16 16:10:27.058158964 +0100 |
||||
+++ ./free.c 2018-01-17 14:58:06.723658091 +0100 |
||||
@@ -78,6 +78,7 @@ static void __attribute__ ((__noreturn__ |
||||
fputs(_(" -m, --mega show output in megabytes\n"), out); |
||||
fputs(_(" -g, --giga show output in gigabytes\n"), out); |
||||
fputs(_(" --tera show output in terabytes\n"), out); |
||||
+ fputs(_(" --peta show output in petabytes\n"), out); |
||||
fputs(_(" -h, --human show human-readable output\n"), out); |
||||
fputs(_(" --si use powers of 1000 not 1024\n"), out); |
||||
fputs(_(" -l, --lohi show detailed low and high memory statistics\n"), out); |
||||
@@ -101,7 +102,7 @@ double power(unsigned int base, unsigned |
||||
/* idea of this function is copied from top size scaling */ |
||||
static const char *scale_size(unsigned long size, int flags, struct commandline_arguments args) |
||||
{ |
||||
- static char nextup[] = { 'B', 'K', 'M', 'G', 'T', 0 }; |
||||
+ static char nextup[] = { 'B', 'K', 'M', 'G', 'T', 'P', 0 }; |
||||
static char buf[BUFSIZ]; |
||||
int i; |
||||
char *up; |
||||
@@ -163,6 +164,7 @@ static const char *scale_size(unsigned l |
||||
case 3: |
||||
case 4: |
||||
case 5: |
||||
+ case 6: |
||||
if (4 >= |
||||
snprintf(buf, sizeof(buf), "%.1f%c", |
||||
(float)(size / power(base, i - 2)), *up)) |
||||
@@ -172,14 +174,14 @@ static const char *scale_size(unsigned l |
||||
(long)(size / power(base, i - 2)), *up)) |
||||
return buf; |
||||
break; |
||||
- case 6: |
||||
+ case 7: |
||||
break; |
||||
} |
||||
} |
||||
/* |
||||
- * On system where there is more than petabyte of memory or swap the |
||||
+ * On system where there is more than exbibyte of memory or swap the |
||||
* output does not fit to column. For incoming few years this should |
||||
- * not be a big problem (wrote at Apr, 2011). |
||||
+ * not be a big problem (wrote at Apr, 2015). |
||||
*/ |
||||
return buf; |
||||
} |
||||
@@ -197,6 +199,7 @@ int main(int argc, char **argv) |
||||
enum { |
||||
SI_OPTION = CHAR_MAX + 1, |
||||
TERA_OPTION, |
||||
+ PETA_OPTION, |
||||
HELP_OPTION |
||||
}; |
||||
|
||||
@@ -206,6 +209,7 @@ int main(int argc, char **argv) |
||||
{ "mega", no_argument, NULL, 'm' }, |
||||
{ "giga", no_argument, NULL, 'g' }, |
||||
{ "tera", no_argument, NULL, TERA_OPTION }, |
||||
+ { "peta", no_argument, NULL, PETA_OPTION }, |
||||
{ "human", no_argument, NULL, 'h' }, |
||||
{ "si", no_argument, NULL, SI_OPTION }, |
||||
{ "lohi", no_argument, NULL, 'l' }, |
||||
@@ -248,6 +252,9 @@ int main(int argc, char **argv) |
||||
case TERA_OPTION: |
||||
args.exponent = 5; |
||||
break; |
||||
+ case PETA_OPTION: |
||||
+ args.exponent = 6; |
||||
+ break; |
||||
case 'h': |
||||
flags |= FREE_HUMANREADABLE; |
||||
break; |
@ -0,0 +1,11 @@
@@ -0,0 +1,11 @@
|
||||
diff -Naur procps-ng-3.3.10.orig/free.c procps-ng-3.3.10/free.c |
||||
--- procps-ng-3.3.10.orig/free.c 2015-12-01 17:23:26.702968686 +0100 |
||||
+++ procps-ng-3.3.10/free.c 2015-12-01 17:22:34.590529390 +0100 |
||||
@@ -262,6 +262,7 @@ |
||||
break; |
||||
case 's': |
||||
flags |= FREE_REPEAT; |
||||
+ errno = 0; |
||||
args.repeat_interval = (1000000 * strtof(optarg, &endptr)); |
||||
if (errno || optarg == endptr || (endptr && *endptr)) |
||||
xerrx(EXIT_FAILURE, _("seconds argument `%s' failed"), optarg); |
@ -0,0 +1,12 @@
@@ -0,0 +1,12 @@
|
||||
diff -up procps-ng-3.3.10/pmap.c.ori procps-ng-3.3.10/pmap.c |
||||
--- procps-ng-3.3.10/pmap.c.ori 2017-02-20 10:47:08.292453148 +0100 |
||||
+++ procps-ng-3.3.10/pmap.c 2017-02-20 10:49:05.078924572 +0100 |
||||
@@ -615,7 +615,7 @@ static int one_proc(proc_t * p) |
||||
total_private_dirty += smap_value; |
||||
continue; |
||||
} |
||||
- if (strncmp("Swap", smap_key, 4) == 0) { |
||||
+ if ((strncmp("Swap", smap_key, 4) == 0) && (strlen(smap_key)==4)) { |
||||
/*doesn't matter as long as last */ |
||||
printf("%0*" KLF "x %*lu %*llu %*llu %*s %s\n", |
||||
maxw1, start, |
@ -0,0 +1,15 @@
@@ -0,0 +1,15 @@
|
||||
diff -Naur procps-ng-3.3.10.orig/pmap.c procps-ng-3.3.10/pmap.c |
||||
--- procps-ng-3.3.10.orig/pmap.c 2014-09-23 13:40:36.000000000 +0200 |
||||
+++ procps-ng-3.3.10/pmap.c 2015-11-24 10:47:24.764107976 +0100 |
||||
@@ -629,9 +629,9 @@ |
||||
diff = 0; |
||||
continue; |
||||
} |
||||
- /* Other keys */ |
||||
- continue; |
||||
} |
||||
+ /* Anything else starting with A-Z? -> skip it (rhbz#1262864) */ |
||||
+ continue; |
||||
} |
||||
sscanf(mapbuf, "%" KLF "x-%" KLF "x %31s %llx %x:%x %llu", &start, |
||||
&end, perms, &file_offset, &dev_major, &dev_minor, |
@ -0,0 +1,29 @@
@@ -0,0 +1,29 @@
|
||||
diff -up ./proc/ksym.c.ori ./proc/ksym.c |
||||
--- ./proc/ksym.c.ori 2006-06-25 08:57:18.000000000 +0200 |
||||
+++ ./proc/ksym.c 2016-11-16 13:34:31.902836748 +0100 |
||||
@@ -567,11 +567,7 @@ static const char * read_wchan_file(unsi |
||||
|
||||
// lame ppc64 has a '.' in front of every name |
||||
if(*ret=='.') ret++; |
||||
- switch(*ret){ |
||||
- case 's': if(!strncmp(ret, "sys_", 4)) ret += 4; break; |
||||
- case 'd': if(!strncmp(ret, "do_", 3)) ret += 3; break; |
||||
- case '_': while(*ret=='_') ret++; break; |
||||
- } |
||||
+ while(*ret=='_') ret++; |
||||
return ret; |
||||
} |
||||
|
||||
@@ -616,11 +612,7 @@ const char * lookup_wchan(unsigned KLONG |
||||
ret = good_symb->name; |
||||
// lame ppc64 has a '.' in front of every name |
||||
if(*ret=='.') ret++; |
||||
- switch(*ret){ |
||||
- case 's': if(!strncmp(ret, "sys_", 4)) ret += 4; break; |
||||
- case 'd': if(!strncmp(ret, "do_", 3)) ret += 3; break; |
||||
- case '_': while(*ret=='_') ret++; break; |
||||
- } |
||||
+ while(*ret=='_') ret++; |
||||
/* if(!*ret) ret = fail.name; */ /* not likely (name was "sys_", etc.) */ |
||||
|
||||
/* cache name after abbreviation */ |
@ -0,0 +1,61 @@
@@ -0,0 +1,61 @@
|
||||
diff -up ./ps/output.c.ori ./ps/output.c |
||||
--- ./ps/output.c.ori 2018-04-19 15:18:36.510737173 +0200 |
||||
+++ ./ps/output.c 2018-04-19 15:18:07.850849743 +0200 |
||||
@@ -1087,6 +1087,34 @@ static int pr_fuid(char *restrict const |
||||
return snprintf(outbuf, COLWID, "%d", pp->fuid); |
||||
} |
||||
|
||||
+/* LoginID implementation */ |
||||
+static int pr_luid(char *restrict const outbuf, const proc_t *restrict const pp){ |
||||
+ char filename[48]; |
||||
+ ssize_t num_read; |
||||
+ int fd; |
||||
+ u_int32_t luid; |
||||
+ |
||||
+ snprintf(filename, sizeof filename, "/proc/%d/loginuid", pp->tgid); |
||||
+ |
||||
+ if ((fd = open(filename, O_RDONLY, 0)) != -1) { |
||||
+ num_read = read(fd, outbuf, OUTBUF_SIZE - 1); |
||||
+ close(fd); |
||||
+ if (num_read > 0) { |
||||
+ outbuf[num_read] = '\0'; |
||||
+ |
||||
+ // processes born before audit have no LoginID set |
||||
+ luid = (u_int32_t) atoi(outbuf); |
||||
+ if (luid != -1) |
||||
+ return num_read; |
||||
+ } |
||||
+ } |
||||
+ outbuf[0] = '-'; |
||||
+ outbuf[1] = '\0'; |
||||
+ num_read = 1; |
||||
+ return num_read; |
||||
+} |
||||
+ |
||||
+ |
||||
// The Open Group Base Specifications Issue 6 (IEEE Std 1003.1, 2004 Edition) |
||||
// requires that user and group names print as decimal numbers if there is |
||||
// not enough room in the column. However, we will now truncate such names |
||||
@@ -1531,7 +1559,7 @@ static const format_struct format_array[ |
||||
{"lsession", "SESSION", pr_sd_session, sr_nop, 11, SD, LNX, ET|LEFT}, |
||||
#endif |
||||
{"lstart", "STARTED", pr_lstart, sr_nop, 24, 0, XXX, ET|RIGHT}, |
||||
-{"luid", "LUID", pr_nop, sr_nop, 5, 0, LNX, ET|RIGHT}, /* login ID */ |
||||
+{"luid", "LUID", pr_luid, sr_nop, 5, 0, LNX, ET|RIGHT}, /* login ID */ |
||||
{"luser", "LUSER", pr_nop, sr_nop, 8, USR, LNX, ET|USER}, /* login USER */ |
||||
{"lwp", "LWP", pr_tasks, sr_tasks, 5, 0, SUN, TO|PIDMAX|RIGHT}, |
||||
{"m_drs", "DRS", pr_drs, sr_drs, 5, MEM, LNx, PO|RIGHT}, |
||||
diff -up ./ps/ps.1.ori ./ps/ps.1 |
||||
--- ./ps/ps.1.ori 2018-04-19 15:18:36.510737173 +0200 |
||||
+++ ./ps/ps.1 2018-04-19 15:18:25.175781694 +0200 |
||||
@@ -1353,6 +1353,10 @@ displays the login session identifier of |
||||
if systemd support has been included. |
||||
T} |
||||
|
||||
+luid LUID T{ |
||||
+displays Login ID associated with a process. |
||||
+T} |
||||
+ |
||||
lwp LWP T{ |
||||
light weight process (thread) ID of the dispatchable entity (alias |
||||
.BR spid , \ tid ). |
@ -0,0 +1,69 @@
@@ -0,0 +1,69 @@
|
||||
diff --git a/ps/output.c b/ps/output.c |
||||
index 501e29a..5f011b1 100644 |
||||
--- a/ps/output.c |
||||
+++ b/ps/output.c |
||||
@@ -1343,6 +1343,41 @@ |
||||
return snprintf(outbuf, COLWID, "%s", vals[lines_to_next_header%4u]); |
||||
} |
||||
|
||||
+static int pr_thcgr(char *restrict const outbuf, const proc_t *restrict const pp){ |
||||
+ char filename[48]; |
||||
+ FILE *fd; |
||||
+ int counter = 0; |
||||
+ int c; |
||||
+ int is_cgroup = 0; |
||||
+ |
||||
+ outbuf[0]='\0'; |
||||
+ snprintf(filename, sizeof filename, "/proc/%d/task/%d/cgroup", pp->tgid, pp->tid); |
||||
+ fd = fopen(filename, "r"); |
||||
+ if (likely(fd == NULL)) goto fail; |
||||
+ while (( (c = fgetc(fd)) != EOF) && (counter<665)) { |
||||
+ if (is_cgroup == 0) { |
||||
+ if (c == ':') { |
||||
+ is_cgroup = 1; |
||||
+ if (counter>0) |
||||
+ outbuf[counter++]=';'; |
||||
+ } |
||||
+ }else |
||||
+ if ((c == '\n') || (c == '\0')) |
||||
+ is_cgroup = 0; |
||||
+ else |
||||
+ outbuf[counter++]=c; |
||||
+ } |
||||
+ outbuf[counter]='\0'; |
||||
+ fclose(fd); |
||||
+ if (counter>0) |
||||
+ return counter; |
||||
+fail: |
||||
+ outbuf[0] = '-'; |
||||
+ outbuf[1] = '\0'; |
||||
+ return 1; |
||||
+} |
||||
+ |
||||
+ |
||||
/***************************************************************************/ |
||||
/*************************** other stuff ***********************************/ |
||||
|
||||
@@ -1623,6 +1658,7 @@ |
||||
{"taskid", "TASKID", pr_nop, sr_nop, 5, 0, SUN, TO|PIDMAX|RIGHT}, // is this a thread ID? |
||||
{"tdev", "TDEV", pr_nop, sr_nop, 4, 0, XXX, AN|RIGHT}, |
||||
{"tgid", "TGID", pr_procs, sr_procs, 5, 0, LNX, PO|PIDMAX|RIGHT}, |
||||
+{"thcgr", "THCGR", pr_thcgr, sr_nop, 35, 0, LNX, PO|LEFT}, /* thread cgroups */ |
||||
{"thcount", "THCNT", pr_nlwp, sr_nlwp, 5, 0, AIX, PO|RIGHT}, |
||||
{"tid", "TID", pr_tasks, sr_tasks, 5, 0, AIX, TO|PIDMAX|RIGHT}, |
||||
{"time", "TIME", pr_time, sr_time, 8, 0, U98, ET|RIGHT}, /*cputime*/ /* was 6 wide */ |
||||
diff --git a/ps/ps.1 b/ps/ps.1 |
||||
index b90adc8..b8d6c81 100644 |
||||
--- a/ps/ps.1 |
||||
+++ b/ps/ps.1 |
||||
@@ -1713,6 +1713,10 @@ |
||||
It is the process ID of the thread group leader. |
||||
T} |
||||
|
||||
+thcgr THCGR T{ |
||||
+display control groups to which the thread belongs. |
||||
+T} |
||||
+ |
||||
thcount THCNT T{ |
||||
see |
||||
.BR nlwp . |
@ -0,0 +1,13 @@
@@ -0,0 +1,13 @@
|
||||
diff -aur procps-ng-3.3.10/ps/output.c ../procps-ng-3.3.10/ps/output.c |
||||
--- procps-ng-3.3.10/ps/output.c 2014-09-23 13:40:36.000000000 +0200 |
||||
+++ ../procps-ng-3.3.10/ps/output.c 2016-06-06 18:58:36.267123736 +0200 |
||||
@@ -1622,8 +1622,8 @@ |
||||
{"sz", "SZ", pr_sz, sr_nop, 5, 0, HPU, PO|RIGHT}, |
||||
{"taskid", "TASKID", pr_nop, sr_nop, 5, 0, SUN, TO|PIDMAX|RIGHT}, // is this a thread ID? |
||||
{"tdev", "TDEV", pr_nop, sr_nop, 4, 0, XXX, AN|RIGHT}, |
||||
-{"thcount", "THCNT", pr_nlwp, sr_nlwp, 5, 0, AIX, PO|RIGHT}, |
||||
{"tgid", "TGID", pr_procs, sr_procs, 5, 0, LNX, PO|PIDMAX|RIGHT}, |
||||
+{"thcount", "THCNT", pr_nlwp, sr_nlwp, 5, 0, AIX, PO|RIGHT}, |
||||
{"tid", "TID", pr_tasks, sr_tasks, 5, 0, AIX, TO|PIDMAX|RIGHT}, |
||||
{"time", "TIME", pr_time, sr_time, 8, 0, U98, ET|RIGHT}, /*cputime*/ /* was 6 wide */ |
||||
{"timeout", "TMOUT", pr_nop, sr_nop, 5, 0, LNX, AN|RIGHT}, // 2.0.xx era |
@ -0,0 +1,21 @@
@@ -0,0 +1,21 @@
|
||||
diff -up ./proc/slab.c.ori ./proc/slab.c |
||||
--- ./proc/slab.c.ori 2017-03-13 17:14:22.684744976 +0100 |
||||
+++ ./proc/slab.c 2017-03-13 17:14:28.836719945 +0100 |
||||
@@ -179,7 +179,7 @@ static int parse_slabinfo20(struct slab_ |
||||
curr->cache_size = (unsigned long)curr->nr_slabs * curr->pages_per_slab * page_size; |
||||
|
||||
if (curr->nr_objs) { |
||||
- curr->use = 100 * curr->nr_active_objs / curr->nr_objs; |
||||
+ curr->use = 100 * (float)curr->nr_active_objs / curr->nr_objs; |
||||
stats->nr_active_caches++; |
||||
} else |
||||
curr->use = 0; |
||||
@@ -258,7 +258,7 @@ static int parse_slabinfo11(struct slab_ |
||||
curr->cache_size = (unsigned long)curr->nr_slabs * curr->pages_per_slab * page_size; |
||||
|
||||
if (curr->nr_objs) { |
||||
- curr->use = 100 * curr->nr_active_objs / curr->nr_objs; |
||||
+ curr->use = 100 * (float)curr->nr_active_objs / curr->nr_objs; |
||||
stats->nr_active_caches++; |
||||
} else |
||||
curr->use = 0; |
@ -0,0 +1,19 @@
@@ -0,0 +1,19 @@
|
||||
diff -up ./sysctl.conf.5.ori ./sysctl.conf.5 |
||||
--- ./sysctl.conf.5.ori 2017-04-06 18:59:51.718644400 +0200 |
||||
+++ ./sysctl.conf.5 2017-04-06 19:00:01.872604143 +0200 |
||||
@@ -28,6 +28,15 @@ token = value |
||||
Note that blank lines are ignored, and whitespace before and after a token or |
||||
value is ignored, although a value can contain whitespace within. Lines which |
||||
begin with a # or ; are considered comments and ignored. |
||||
+.SH NOTES |
||||
+As the |
||||
+.BR /etc/sysctl.conf |
||||
+file is used to override default kernel parameter values, only a small number of parameters is predefined in the file. |
||||
+Use |
||||
+.IR /sbin/sysctl\ \-a |
||||
+or follow |
||||
+.BR sysctl (8) |
||||
+to list all possible parameters. The description of individual parameters can be found in the kernel documentation. |
||||
.SH EXAMPLE |
||||
.RS |
||||
.sp |
@ -0,0 +1,12 @@
@@ -0,0 +1,12 @@
|
||||
diff -up ./sysctl.c.ori ./sysctl.c |
||||
--- ./sysctl.c.ori 2018-01-04 16:56:26.705925767 +0100 |
||||
+++ ./sysctl.c 2018-01-04 16:56:40.365877248 +0100 |
||||
@@ -379,7 +379,7 @@ static int WriteSetting(const char *sett |
||||
/* point to the value in name=value */ |
||||
value = equals + 1; |
||||
|
||||
- if (!*name || !*value || name == equals) { |
||||
+ if (!*name || name == equals) { |
||||
xwarnx(_("malformed setting \"%s\""), setting); |
||||
return -2; |
||||
} |
@ -0,0 +1,12 @@
@@ -0,0 +1,12 @@
|
||||
diff -up ./sysctl.8.ori ./sysctl.8 |
||||
--- ./sysctl.8.ori 2014-09-23 13:40:36.000000000 +0200 |
||||
+++ ./sysctl.8 2017-05-31 14:43:08.323364474 +0200 |
||||
@@ -78,7 +78,7 @@ values listing. |
||||
Print value without new line. |
||||
.TP |
||||
\fB\-\-system\fR |
||||
-Load settings from all system configuration files. |
||||
+Load settings from all system configuration files. Files are read from directories in the following list in given order from top to bottom. Once a file of a given filename is loaded, any file of the same name in subsequent directories is ignored. |
||||
.br |
||||
/run/sysctl.d/*.conf |
||||
.br |
@ -0,0 +1,166 @@
@@ -0,0 +1,166 @@
|
||||
diff -up ./top/top.c.ori ./top/top.c |
||||
--- ./top/top.c.ori 2017-04-07 18:36:05.953611338 +0200 |
||||
+++ ./top/top.c 2017-04-07 18:37:14.037321741 +0200 |
||||
@@ -91,6 +91,7 @@ static int Rc_questions; |
||||
static unsigned Pg2K_shft = 0; |
||||
|
||||
/* SMP, Irix/Solaris mode, Linux 2.5.xx support */ |
||||
+static CPU_t *Cpu_tics; |
||||
static int Cpu_faux_tot; |
||||
static float Cpu_pmax; |
||||
static const char *Cpu_States_fmts; |
||||
@@ -2356,10 +2357,10 @@ static void zap_fieldstab (void) { |
||||
* This guy's modeled on libproc's 'eight_cpu_numbers' function except |
||||
* we preserve all cpu data in our CPU_t array which is organized |
||||
* as follows: |
||||
- * cpus[0] thru cpus[n] == tics for each separate cpu |
||||
- * cpus[sumSLOT] == tics from the 1st /proc/stat line |
||||
- * [ and beyond sumSLOT == tics for each cpu NUMA node ] */ |
||||
-static CPU_t *cpus_refresh (CPU_t *cpus) { |
||||
+ * Cpu_tics[0] thru Cpu_tics[n] == tics for each separate cpu |
||||
+ * Cpu_tics[sumSLOT] == tics from /proc/stat line #1 |
||||
+ * [ and beyond sumSLOT == tics for each cpu NUMA node ] */ |
||||
+static void cpus_refresh (void) { |
||||
#define sumSLOT ( smp_num_cpus ) |
||||
#define totSLOT ( 1 + smp_num_cpus + Numa_node_tot) |
||||
static FILE *fp = NULL; |
||||
@@ -2377,7 +2378,7 @@ static CPU_t *cpus_refresh (CPU_t *cpus) |
||||
sav_slot = sumSLOT; |
||||
zap_fieldstab(); |
||||
if (fp) { fclose(fp); fp = NULL; } |
||||
- if (cpus) { free(cpus); cpus = NULL; } |
||||
+ if (Cpu_tics) free(Cpu_tics); |
||||
} |
||||
|
||||
/* by opening this file once, we'll avoid the hit on minor page faults |
||||
@@ -2387,7 +2388,7 @@ static CPU_t *cpus_refresh (CPU_t *cpus) |
||||
error_exit(fmtmk(N_fmt(FAIL_statopn_fmt), strerror(errno))); |
||||
/* note: we allocate one more CPU_t via totSLOT than 'cpus' so that a |
||||
slot can hold tics representing the /proc/stat cpu summary */ |
||||
- cpus = alloc_c(totSLOT * sizeof(CPU_t)); |
||||
+ Cpu_tics = alloc_c(totSLOT * sizeof(CPU_t)); |
||||
} |
||||
rewind(fp); |
||||
fflush(fp); |
||||
@@ -2410,7 +2411,7 @@ static CPU_t *cpus_refresh (CPU_t *cpus) |
||||
#undef buffGRW |
||||
|
||||
// remember from last time around |
||||
- sum_ptr = &cpus[sumSLOT]; |
||||
+ sum_ptr = &Cpu_tics[sumSLOT]; |
||||
memcpy(&sum_ptr->sav, &sum_ptr->cur, sizeof(CT_t)); |
||||
// then value the last slot with the cpu summary line |
||||
if (4 > sscanf(bp, "cpu %Lu %Lu %Lu %Lu %Lu %Lu %Lu %Lu" |
||||
@@ -2437,7 +2438,7 @@ static CPU_t *cpus_refresh (CPU_t *cpus) |
||||
|
||||
// now value each separate cpu's tics... |
||||
for (i = 0; i < sumSLOT; i++) { |
||||
- CPU_t *cpu_ptr = &cpus[i]; // avoid gcc subscript bloat |
||||
+ CPU_t *cpu_ptr = &Cpu_tics[i]; // avoid gcc subscript bloat |
||||
#ifdef PRETEND8CPUS |
||||
bp = buf; |
||||
#endif |
||||
@@ -2448,7 +2449,6 @@ static CPU_t *cpus_refresh (CPU_t *cpus) |
||||
, &cpu_ptr->cur.u, &cpu_ptr->cur.n, &cpu_ptr->cur.s |
||||
, &cpu_ptr->cur.i, &cpu_ptr->cur.w, &cpu_ptr->cur.x |
||||
, &cpu_ptr->cur.y, &cpu_ptr->cur.z)) { |
||||
- memmove(cpu_ptr, sum_ptr, sizeof(CPU_t)); |
||||
break; // tolerate cpus taken offline |
||||
} |
||||
|
||||
@@ -2488,8 +2488,6 @@ static CPU_t *cpus_refresh (CPU_t *cpus) |
||||
} // end: for each cpu |
||||
|
||||
Cpu_faux_tot = i; // tolerate cpus taken offline |
||||
- |
||||
- return cpus; |
||||
#undef sumSLOT |
||||
#undef totSLOT |
||||
} // end: cpus_refresh |
||||
@@ -5119,7 +5117,6 @@ static void summary_hlp (CPU_t *cpu, con |
||||
static void summary_show (void) { |
||||
#define isROOM(f,n) (CHKw(w, f) && Msg_row + (n) < Screen_rows - 1) |
||||
#define anyFLG 0xffffff |
||||
- static CPU_t *smpcpu = NULL; |
||||
WIN_t *w = Curwin; // avoid gcc bloat with a local copy |
||||
char tmp[MEDBUFSIZ]; |
||||
int i; |
||||
@@ -5142,7 +5139,7 @@ static void summary_show (void) { |
||||
, Frame_stopped, Frame_zombied)); |
||||
Msg_row += 1; |
||||
|
||||
- smpcpu = cpus_refresh(smpcpu); |
||||
+ cpus_refresh(); |
||||
|
||||
#ifndef NUMA_DISABLE |
||||
if (!Numa_node_tot) goto numa_nope; |
||||
@@ -5150,11 +5147,11 @@ static void summary_show (void) { |
||||
if (CHKw(w, View_CPUNOD)) { |
||||
if (Numa_node_sel < 0) { |
||||
// display the 1st /proc/stat line, then the nodes (if room) |
||||
- summary_hlp(&smpcpu[smp_num_cpus], N_txt(WORD_allcpus_txt)); |
||||
+ summary_hlp(&Cpu_tics[smp_num_cpus], N_txt(WORD_allcpus_txt)); |
||||
Msg_row += 1; |
||||
// display each cpu node's states |
||||
for (i = 0; i < Numa_node_tot; i++) { |
||||
- CPU_t *nod_ptr = &smpcpu[1 + smp_num_cpus + i]; |
||||
+ CPU_t *nod_ptr = &Cpu_tics[1 + smp_num_cpus + i]; |
||||
if (!isROOM(anyFLG, 1)) break; |
||||
#ifndef OFF_NUMASKIP |
||||
if (nod_ptr->id) { |
||||
@@ -5169,13 +5166,13 @@ static void summary_show (void) { |
||||
} else { |
||||
// display the node summary, then the associated cpus (if room) |
||||
snprintf(tmp, sizeof(tmp), N_fmt(NUMA_nodenam_fmt), Numa_node_sel); |
||||
- summary_hlp(&smpcpu[1 + smp_num_cpus + Numa_node_sel], tmp); |
||||
+ summary_hlp(&Cpu_tics[1 + smp_num_cpus + Numa_node_sel], tmp); |
||||
Msg_row += 1; |
||||
for (i = 0; i < Cpu_faux_tot; i++) { |
||||
- if (Numa_node_sel == smpcpu[i].node) { |
||||
+ if (Numa_node_sel == Cpu_tics[i].node) { |
||||
if (!isROOM(anyFLG, 1)) break; |
||||
- snprintf(tmp, sizeof(tmp), N_fmt(WORD_eachcpu_fmt), smpcpu[i].id); |
||||
- summary_hlp(&smpcpu[i], tmp); |
||||
+ snprintf(tmp, sizeof(tmp), N_fmt(WORD_eachcpu_fmt), Cpu_tics[i].id); |
||||
+ summary_hlp(&Cpu_tics[i], tmp); |
||||
Msg_row += 1; |
||||
} |
||||
} |
||||
@@ -5185,14 +5182,14 @@ numa_nope: |
||||
#endif |
||||
if (CHKw(w, View_CPUSUM)) { |
||||
// display just the 1st /proc/stat line |
||||
- summary_hlp(&smpcpu[Cpu_faux_tot], N_txt(WORD_allcpus_txt)); |
||||
+ summary_hlp(&Cpu_tics[Cpu_faux_tot], N_txt(WORD_allcpus_txt)); |
||||
Msg_row += 1; |
||||
|
||||
} else { |
||||
// display each cpu's states separately, screen height permitting... |
||||
for (i = 0; i < Cpu_faux_tot; i++) { |
||||
- snprintf(tmp, sizeof(tmp), N_fmt(WORD_eachcpu_fmt), smpcpu[i].id); |
||||
- summary_hlp(&smpcpu[i], tmp); |
||||
+ snprintf(tmp, sizeof(tmp), N_fmt(WORD_eachcpu_fmt), Cpu_tics[i].id); |
||||
+ summary_hlp(&Cpu_tics[i], tmp); |
||||
Msg_row += 1; |
||||
if (!isROOM(anyFLG, 1)) break; |
||||
} |
||||
@@ -5643,6 +5640,7 @@ static void frame_make (void) { |
||||
|
||||
// whoa either first time or thread/task mode change, (re)prime the pump... |
||||
if (Pseudo_row == PROC_XTRA) { |
||||
+ cpus_refresh(); |
||||
procs_refresh(); |
||||
usleep(LIB_USLEEP); |
||||
putp(Cap_clr_scr); |
||||
diff -up ./top/top.h.ori ./top/top.h |
||||
--- ./top/top.h.ori 2017-04-07 18:36:14.921573192 +0200 |
||||
+++ ./top/top.h 2017-04-07 18:37:14.037321741 +0200 |
||||
@@ -728,7 +728,7 @@ typedef struct WIN_t { |
||||
//atic inline void widths_resize (void); |
||||
//atic void zap_fieldstab (void); |
||||
/*------ Library Interface ---------------------------------------------*/ |
||||
-//atic CPU_t *cpus_refresh (CPU_t *cpus); |
||||
+//atic void cpus_refresh (void); |
||||
#ifdef OFF_HST_HASH |
||||
//atic inline HST_t *hstbsrch (HST_t *hst, int max, int pid); |
||||
#else |
@ -0,0 +1,35 @@
@@ -0,0 +1,35 @@
|
||||
diff -up ./top/top.c.ori ./top/top.c |
||||
--- ./top/top.c.ori 2018-01-15 14:04:42.403457405 +0100 |
||||
+++ ./top/top.c 2018-01-15 14:07:59.663713707 +0100 |
||||
@@ -1260,15 +1260,25 @@ static char *ioline (const char *prompt) |
||||
|
||||
|
||||
/* |
||||
- * Make locale aware float (but maybe restrict to whole numbers). */ |
||||
+ * Make locale unaware float (but maybe restrict to whole numbers). */ |
||||
static int mkfloat (const char *str, float *num, int whole) { |
||||
- char *ep; |
||||
+ char tmp[SMLBUFSIZ], *ep; |
||||
|
||||
- if (whole) |
||||
+ if (whole) { |
||||
*num = (float)strtol(str, &ep, 0); |
||||
- else |
||||
- *num = strtof(str, &ep); |
||||
- if (ep != str && *ep == '\0' && *num < INT_MAX) |
||||
+ if (ep != str && *ep == '\0' && *num < INT_MAX) |
||||
+ return 1; |
||||
+ return 0; |
||||
+ } |
||||
+ snprintf(tmp, sizeof(tmp), "%s", str); |
||||
+ *num = strtof(tmp, &ep); |
||||
+ if (*ep != '\0') { |
||||
+ // fallback - try to swap the floating point separator |
||||
+ if (*ep == '.') *ep = ','; |
||||
+ else if (*ep == ',') *ep = '.'; |
||||
+ *num = strtof(tmp, &ep); |
||||
+ } |
||||
+ if (ep != tmp && *ep == '\0' && *num < INT_MAX) |
||||
return 1; |
||||
return 0; |
||||
} // end: mkfloat |
@ -0,0 +1,111 @@
@@ -0,0 +1,111 @@
|
||||
diff -up ./configure.ac.ori ./configure.ac |
||||
--- ./configure.ac.ori 2014-09-23 13:40:36.000000000 +0200 |
||||
+++ ./configure.ac 2017-08-02 13:04:25.439881501 +0200 |
||||
@@ -218,11 +218,11 @@ if test "x$enable_wide_percent" = xyes; |
||||
fi |
||||
|
||||
AC_ARG_ENABLE([wide-memory], |
||||
- AS_HELP_STRING([--disable-wide-memory], [disable extra precision under memory fields for top]), |
||||
- [], [enable_wide_memory=yes] |
||||
+ AS_HELP_STRING([--enable-wide-memory], [provide extra precision under memory fields for top]), |
||||
+ [], [enable_wide_memory=no] |
||||
) |
||||
-if test "x$enable_wide_memory" = xno; then |
||||
- AC_DEFINE(NOBOOST_MEMS, 1, [disable extra precision under memory fields for top]) |
||||
+if test "x$enable_wide_memory" = xyes; then |
||||
+ AC_DEFINE(BOOST_MEMORY, 1, [provide extra precision under memory fields for top]) |
||||
fi |
||||
|
||||
AC_ARG_ENABLE([modern-top], |
||||
diff -up ./top/top.c.ori ./top/top.c |
||||
--- ./top/top.c.ori 2017-08-02 12:56:41.681326790 +0200 |
||||
+++ ./top/top.c 2017-08-02 13:50:24.953331241 +0200 |
||||
@@ -1542,11 +1542,11 @@ static inline const char *make_str (cons |
||||
* We'll interpret 'num' as a kibibytes quantity and try to |
||||
* format it to reach 'target' while also fitting 'width'. */ |
||||
static const char *scale_mem (int target, unsigned long num, int width, int justr) { |
||||
-#ifndef NOBOOST_MEMS |
||||
// SK_Kb SK_Mb SK_Gb SK_Tb SK_Pb SK_Eb |
||||
+#ifdef BOOST_MEMORY |
||||
static const char *fmttab[] = { "%.0f", "%#.1f%c", "%#.3f%c", "%#.3f%c", "%#.3f%c", NULL }; |
||||
#else |
||||
- static const char *fmttab[] = { "%.0f", "%.0f%c", "%.0f%c", "%.0f%c", "%.0f%c", NULL }; |
||||
+ static const char *fmttab[] = { "%.0f", "%.1f%c", "%.1f%c", "%.1f%c", "%.1f%c", NULL }; |
||||
#endif |
||||
static char buf[SMLBUFSIZ]; |
||||
float scaled_num; |
||||
@@ -1750,21 +1750,12 @@ static FLD_t Fieldstab[] = { |
||||
#else |
||||
{ 4, -1, A_right, SF(RES), L_statm }, // EU_MEM slot |
||||
#endif |
||||
-#ifndef NOBOOST_MEMS |
||||
{ 7, SK_Kb, A_right, SF(VRT), L_statm }, |
||||
{ 6, SK_Kb, A_right, SF(SWP), L_status }, |
||||
{ 6, SK_Kb, A_right, SF(RES), L_statm }, |
||||
{ 6, SK_Kb, A_right, SF(COD), L_statm }, |
||||
{ 7, SK_Kb, A_right, SF(DAT), L_statm }, |
||||
{ 6, SK_Kb, A_right, SF(SHR), L_statm }, |
||||
-#else |
||||
- { 5, SK_Kb, A_right, SF(VRT), L_statm }, |
||||
- { 4, SK_Kb, A_right, SF(SWP), L_status }, |
||||
- { 4, SK_Kb, A_right, SF(RES), L_statm }, |
||||
- { 4, SK_Kb, A_right, SF(COD), L_statm }, |
||||
- { 5, SK_Kb, A_right, SF(DAT), L_statm }, |
||||
- { 4, SK_Kb, A_right, SF(SHR), L_statm }, |
||||
-#endif |
||||
{ 4, -1, A_right, SF(FL1), L_stat }, |
||||
{ 4, -1, A_right, SF(FL2), L_stat }, |
||||
{ 4, -1, A_right, SF(DRT), L_statm }, |
||||
@@ -1785,11 +1776,7 @@ static FLD_t Fieldstab[] = { |
||||
{ -1, -1, A_left, SF(ENV), L_ENVIRON }, |
||||
{ 3, -1, A_right, SF(FV1), L_stat }, |
||||
{ 3, -1, A_right, SF(FV2), L_stat }, |
||||
-#ifndef NOBOOST_MEMS |
||||
{ 6, SK_Kb, A_right, SF(USE), L_USED }, |
||||
-#else |
||||
- { 4, SK_Kb, A_right, SF(USE), L_USED }, |
||||
-#endif |
||||
{ 10, -1, A_right, SF(NS1), L_NS }, // IPCNS |
||||
{ 10, -1, A_right, SF(NS2), L_NS }, // MNTNS |
||||
{ 10, -1, A_right, SF(NS3), L_NS }, // NETNS |
||||
@@ -5208,12 +5195,20 @@ numa_nope: |
||||
const char *fmts; |
||||
const char *label; |
||||
} scaletab[] = { |
||||
- { 1, "%1.0f ", NULL }, // kibibytes |
||||
- { 1024.0, "%#4.3f ", NULL }, // mebibytes |
||||
- { 1024.0*1024, "%#4.3f ", NULL }, // gibibytes |
||||
- { 1024.0*1024*1024, "%#4.3f ", NULL }, // tebibytes |
||||
- { 1024.0*1024*1024*1024, "%#4.3f ", NULL }, // pebibytes |
||||
- { 1024.0*1024*1024*1024*1024, "%#4.3f ", NULL } // exbibytes |
||||
+ { 1, "%.0f ", NULL }, // kibibytes |
||||
+#ifdef BOOST_MEMORY |
||||
+ { 1024.0, "%#.3f ", NULL }, // mebibytes |
||||
+ { 1024.0*1024, "%#.3f ", NULL }, // gibibytes |
||||
+ { 1024.0*1024*1024, "%#.3f ", NULL }, // tebibytes |
||||
+ { 1024.0*1024*1024*1024, "%#.3f ", NULL }, // pebibytes |
||||
+ { 1024.0*1024*1024*1024*1024, "%#.3f ", NULL } // exbibytes |
||||
+#else |
||||
+ { 1024.0, "%#.1f ", NULL }, // mebibytes |
||||
+ { 1024.0*1024, "%#.1f ", NULL }, // gibibytes |
||||
+ { 1024.0*1024*1024, "%#.1f ", NULL }, // tebibytes |
||||
+ { 1024.0*1024*1024*1024, "%#.1f ", NULL }, // pebibytes |
||||
+ { 1024.0*1024*1024*1024*1024, "%#.1f ", NULL } // exbibytes |
||||
+#endif |
||||
}; |
||||
struct { // 0123456789 |
||||
// snprintf contents of each buf (after SK_Kb): 'nnnn.nnn 0' |
||||
diff -up ./top/top.h.ori ./top/top.h |
||||
--- ./top/top.h.ori 2017-08-02 12:56:41.681326790 +0200 |
||||
+++ ./top/top.h 2017-08-02 13:04:25.446881464 +0200 |
||||
@@ -23,8 +23,8 @@ |
||||
#include "../proc/readproc.h" |
||||
|
||||
/* Defines represented in configure.ac ----------------------------- */ |
||||
-//#define BOOST_PERCNT /* enable extra precision for two % fields */ |
||||
-//#define NOBOOST_MEMS /* disable extra precision for mem fields */ |
||||
+//#define BOOST_MEMORY /* enable extra precision for mem fields */ |
||||
+//#define BOOST_PERCNT /* enable extra precision for 2 % fields */ |
||||
//#define NUMA_DISABLE /* disable summary area NUMA/Nodes display */ |
||||
//#define OOMEM_ENABLE /* enable the SuSE out-of-memory additions */ |
||||
//#define ORIG_TOPDEFS /* with no rcfile retain original defaults */ |
@ -0,0 +1,57 @@
@@ -0,0 +1,57 @@
|
||||
diff -Naur procps-ng-3.3.10.orig/proc/sysinfo.c procps-ng-3.3.10/proc/sysinfo.c |
||||
--- procps-ng-3.3.10.orig/proc/sysinfo.c 2016-01-14 15:57:33.000000000 +0100 |
||||
+++ procps-ng-3.3.10/proc/sysinfo.c 2016-01-14 16:40:01.290000000 +0100 |
||||
@@ -988,7 +988,7 @@ |
||||
int cPartition = 0; |
||||
int fields; |
||||
unsigned dummy; |
||||
- char devname[32]; |
||||
+ char devname[35]; |
||||
|
||||
*disks = NULL; |
||||
*partitions = NULL; |
||||
@@ -1001,10 +1001,10 @@ |
||||
fclose(fd); |
||||
break; |
||||
} |
||||
- fields = sscanf(buff, " %*d %*d %15s %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %u", devname, &dummy); |
||||
+ fields = sscanf(buff, " %*d %*d %34s %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %u", devname, &dummy); |
||||
if (fields == 2 && is_disk(devname)){ |
||||
(*disks) = xrealloc(*disks, (cDisk+1)*sizeof(struct disk_stat)); |
||||
- sscanf(buff, " %*d %*d %15s %u %u %llu %u %u %u %llu %u %u %u %u", |
||||
+ sscanf(buff, " %*d %*d %31s %u %u %llu %u %u %u %llu %u %u %u %u", |
||||
//&disk_major, |
||||
//&disk_minor, |
||||
(*disks)[cDisk].disk_name, |
||||
@@ -1026,8 +1026,8 @@ |
||||
(*partitions) = xrealloc(*partitions, (cPartition+1)*sizeof(struct partition_stat)); |
||||
fflush(stdout); |
||||
sscanf(buff, (fields == 2) |
||||
- ? " %*d %*d %15s %u %*u %llu %*u %u %*u %llu %*u %*u %*u %*u" |
||||
- : " %*d %*d %15s %u %llu %u %llu", |
||||
+ ? " %*d %*d %34s %u %*u %llu %*u %u %*u %llu %*u %*u %*u %*u" |
||||
+ : " %*d %*d %34s %u %llu %u %llu", |
||||
//&part_major, |
||||
//&part_minor, |
||||
(*partitions)[cPartition].partition_name, |
||||
diff -Naur procps-ng-3.3.10.orig/proc/sysinfo.h procps-ng-3.3.10/proc/sysinfo.h |
||||
--- procps-ng-3.3.10.orig/proc/sysinfo.h 2014-09-23 13:40:36.000000000 +0200 |
||||
+++ procps-ng-3.3.10/proc/sysinfo.h 2016-01-14 16:30:02.326000000 +0100 |
||||
@@ -101,7 +101,7 @@ |
||||
typedef struct disk_stat{ |
||||
unsigned long long reads_sectors; |
||||
unsigned long long written_sectors; |
||||
- char disk_name [16]; |
||||
+ char disk_name [32]; |
||||
unsigned inprogress_IO; |
||||
unsigned merged_reads; |
||||
unsigned merged_writes; |
||||
@@ -115,7 +115,7 @@ |
||||
}disk_stat; |
||||
|
||||
typedef struct partition_stat{ |
||||
- char partition_name [16]; |
||||
+ char partition_name [35]; |
||||
unsigned long long reads_sectors; |
||||
unsigned parent_disk; // index into a struct disk_stat array |
||||
unsigned reads; |
@ -0,0 +1,13 @@
@@ -0,0 +1,13 @@
|
||||
diff --git a/proc/sysinfo.c b/proc/sysinfo.c |
||||
index baa2453..c95f378 100644 |
||||
--- a/proc/sysinfo.c |
||||
+++ b/proc/sysinfo.c |
||||
@@ -979,7 +979,7 @@ unsigned int getpartitions_num(struct disk_stat *disks, int ndisks){ |
||||
///////////////////////////////////////////////////////////////////////////// |
||||
static int is_disk(char *dev) |
||||
{ |
||||
- char syspath[32]; |
||||
+ char syspath[64]; |
||||
char *slash; |
||||
|
||||
while ((slash = strchr(dev, '/'))) |
@ -0,0 +1,435 @@
@@ -0,0 +1,435 @@
|
||||
# The testsuite is unsuitable for running on buildsystems |
||||
%global tests_enabled 0 |
||||
|
||||
Summary: System and process monitoring utilities |
||||
Name: procps-ng |
||||
Version: 3.3.10 |
||||
Release: 23%{?dist} |
||||
License: GPL+ and GPLv2 and GPLv2+ and GPLv3+ and LGPLv2+ |
||||
Group: Applications/System |
||||
URL: https://sourceforge.net/projects/procps-ng/ |
||||
|
||||
Source: http://downloads.sourceforge.net/%{name}/%{name}-%{version}.tar.xz |
||||
|
||||
Patch0: procps-ng-3.3.10-pmap-skip-vmflags.patch |
||||
Patch1: procps-ng-3.3.10-free-uninitialized-errno.patch |
||||
Patch2: procps-ng-3.3.10-ps-thcount-format-option.patch |
||||
Patch3: procps-ng-3.3.10-vmstat-devlen.patch |
||||
Patch4: procps-ng-3.3.10-find_elf_note-memory-error-fix.patch |
||||
Patch5: procps-ng-3.3.10-ps-scattered-thread-cgroups.patch |
||||
Patch6: procps-ng-3.3.10-vmstat-long-device-name.patch |
||||
Patch7: procps-ng-3.3.10-ps-full-wchan-name.patch |
||||
Patch8: procps-ng-3.3.10-pmap-lines-twice.patch |
||||
Patch9: procps-ng-3.3.10-slabtop-use-val-float.patch |
||||
Patch10: procps-ng-3.3.10-sysctl-conf-manpage-predef-note.patch |
||||
Patch11: procps-ng-3.3.10-top-instant-cpu-stats.patch |
||||
Patch12: procps-ng-3.3.10-sysctl-man-conf-override-hint.patch |
||||
Patch13: procps-ng-3.3.10-top-strange-mem-val-scaling.patch |
||||
Patch14: procps-ng-3.3.10-sysctl-empty-value-allowed.patch |
||||
Patch15: procps-ng-3.3.10-top-locale-independent-float-delay.patch |
||||
Patch16: procps-ng-3.3.10-free-mem-petabytes-segfault.patch |
||||
Patch17: procps-ng-3.3.10-ps-new-option-loginid-luid.patch |
||||
Patch18: procps-ng-3.3.10-CVE-2018-1124.patch |
||||
|
||||
|
||||
Requires(post): /sbin/ldconfig |
||||
Requires(postun): /sbin/ldconfig |
||||
|
||||
BuildRequires: ncurses-devel |
||||
BuildRequires: libtool |
||||
BuildRequires: autoconf |
||||
BuildRequires: automake |
||||
BuildRequires: gettext-devel |
||||
BuildRequires: systemd-devel |
||||
|
||||
%if %{tests_enabled} |
||||
BuildRequires: dejagnu |
||||
%endif |
||||
|
||||
Provides: procps = %{version}-%{release} |
||||
Obsoletes: procps < 3.2.9-1 |
||||
|
||||
# usrmove hack - will be removed once initscripts are fixed |
||||
Provides: /sbin/sysctl |
||||
Provides: /bin/ps |
||||
|
||||
%description |
||||
The procps package contains a set of system utilities that provide |
||||
system information. Procps includes ps, free, skill, pkill, pgrep, |
||||
snice, tload, top, uptime, vmstat, w, watch and pwdx. The ps command |
||||
displays a snapshot of running processes. The top command provides |
||||
a repetitive update of the statuses of running processes. The free |
||||
command displays the amounts of free and used memory on your |
||||
system. The skill command sends a terminate command (or another |
||||
specified signal) to a specified set of processes. The snice |
||||
command is used to change the scheduling priority of specified |
||||
processes. The tload command prints a graph of the current system |
||||
load average to a specified tty. The uptime command displays the |
||||
current time, how long the system has been running, how many users |
||||
are logged on, and system load averages for the past one, five, |
||||
and fifteen minutes. The w command displays a list of the users |
||||
who are currently logged on and what they are running. The watch |
||||
program watches a running program. The vmstat command displays |
||||
virtual memory statistics about processes, memory, paging, block |
||||
I/O, traps, and CPU activity. The pwdx command reports the current |
||||
working directory of a process or processes. |
||||
|
||||
%package devel |
||||
Summary: System and process monitoring utilities |
||||
Group: Development/Libraries |
||||
Requires: %{name}%{?_isa} = %{version}-%{release} |
||||
Provides: procps-devel = %{version}-%{release} |
||||
Obsoletes: procps-devel < 3.2.9-1 |
||||
|
||||
%description devel |
||||
System and process monitoring utilities development headers |
||||
|
||||
%package i18n |
||||
Summary: Internationalization pack for procps-ng |
||||
Group: Applications/System |
||||
Requires: %{name} = %{version}-%{release} |
||||
|
||||
%description i18n |
||||
Internationalization pack for procps-ng |
||||
|
||||
|
||||
%prep |
||||
%setup -q -n %{name}-%{version} |
||||
|
||||
%patch0 -p1 |
||||
%patch1 -p1 |
||||
%patch2 -p1 |
||||
%patch3 -p1 |
||||
%patch4 -p1 |
||||
%patch5 -p1 |
||||
%patch6 -p1 |
||||
%patch7 -p1 |
||||
%patch8 -p1 |
||||
%patch9 -p1 |
||||
%patch10 -p1 |
||||
%patch11 -p1 |
||||
%patch12 -p1 |
||||
%patch13 -p1 |
||||
%patch14 -p1 |
||||
%patch15 -p1 |
||||
%patch16 -p1 |
||||
%patch17 -p1 |
||||
%patch18 -p1 |
||||
|
||||
|
||||
%build |
||||
# The following stuff is needed for git archives only |
||||
#echo "%{version}" > .tarball-version |
||||
#./autogen.sh |
||||
|
||||
autoreconf --verbose --force --install |
||||
|
||||
./configure --prefix=/ \ |
||||
--bindir=%{_bindir} \ |
||||
--sbindir=%{_sbindir} \ |
||||
--libdir=%{_libdir} \ |
||||
--mandir=%{_mandir} \ |
||||
--includedir=%{_includedir} \ |
||||
--sysconfdir=%{_sysconfdir} \ |
||||
--localedir=%{_datadir}/locale \ |
||||
--docdir=/unwanted \ |
||||
--disable-static \ |
||||
--enable-w-from \ |
||||
--disable-kill \ |
||||
--disable-rpath \ |
||||
--enable-watch8bit \ |
||||
--enable-skill \ |
||||
--enable-sigwinch \ |
||||
--enable-libselinux \ |
||||
--with-systemd \ |
||||
--disable-pidof \ |
||||
--disable-modern-top |
||||
|
||||
make CFLAGS="%{optflags}" |
||||
|
||||
|
||||
%if %{tests_enabled} |
||||
%check |
||||
make check |
||||
%endif |
||||
|
||||
|
||||
%install |
||||
make DESTDIR=%{buildroot} install |
||||
|
||||
# --localedir doesn't work correctly |
||||
mv %{buildroot}/share/locale %{buildroot}%{_datadir} |
||||
rmdir %{buildroot}/share |
||||
|
||||
# translated man pages |
||||
#find man-po/ -type d -maxdepth 1 -mindepth 1 | while read dirname; do cp -a $dirname %{buildroot}/usr/share/man/ ; done |
||||
|
||||
%post -p /sbin/ldconfig |
||||
|
||||
%postun -p /sbin/ldconfig |
||||
|
||||
%files |
||||
%doc AUTHORS Documentation/BUGS COPYING COPYING.LIB Documentation/FAQ NEWS README top/README.top Documentation/TODO |
||||
|
||||
%{_libdir}/libprocps.so.* |
||||
%{_bindir}/* |
||||
%{_sbindir}/* |
||||
%{_mandir}/man1/* |
||||
%{_mandir}/man8/* |
||||
%{_mandir}/man5/* |
||||
#%%{_mandir}/*/man1/* |
||||
#%%{_mandir}/*/man8/* |
||||
#%%{_mandir}/*/man5/* |
||||
|
||||
%exclude %{_libdir}/libprocps.la |
||||
%exclude %{_sysconfdir}/sysctl.conf |
||||
%exclude /unwanted/* |
||||
|
||||
%files devel |
||||
%doc COPYING COPYING.LIB |
||||
%{_libdir}/libprocps.so |
||||
%{_libdir}/pkgconfig/libprocps.pc |
||||
%{_includedir}/proc |
||||
%{_mandir}/man3/* |
||||
|
||||
%files i18n |
||||
%{_datadir}/locale/* |
||||
|
||||
%changelog |
||||
* Tue May 15 2018 Kamil Dudka <kdudka@redhat.com> - 3.3.10-23 |
||||
- check for truncation after calling snprintf() |
||||
- Related: CVE-2018-1124 |
||||
|
||||
* Fri May 11 2018 Kamil Dudka <kdudka@redhat.com> - 3.3.10-22 |
||||
- fix integer overflows leading to heap overflow in file2strvec() |
||||
- Resolves: CVE-2018-1124 |
||||
|
||||
* Thu Apr 19 2018 Jan Rybar <jrybar@redhat.com> - 3.3.10-21 |
||||
- ps: new format option LUID (LoginId) |
||||
- Resolves: rhbz#1518986 |
||||
|
||||
* Mon Jan 15 2018 Jan Rybar <jrybar@redhat.com> - 3.3.10-20 |
||||
- free: segfault when system memory exceeds petabytes |
||||
- Resolves: rhbz#1263765 |
||||
|
||||
* Mon Jan 15 2018 Jan Rybar <jrybar@redhat.com> - 3.3.10-19 |
||||
- top: locale independent float character in delay now accepted |
||||
- Resolves: rhbz#1182248 |
||||
|
||||
* Thu Jan 04 2018 Jan Rybar <jrybar@redhat.com> - 3.3.10-18 |
||||
- sysctl: empty value is now accepted |
||||
- Resolves: rhbz#1507356 |
||||
|
||||
* Wed Sep 06 2017 Jan Rybar <jrybar@redhat.com> - 3.3.10-17 |
||||
- top: strange unit scaling with high memory values |
||||
- Resolves: rhbz#1253851 |
||||
|
||||
* Wed May 31 2017 Jan Rybar <jrybar@redhat.com> - 3.3.10-16 |
||||
- sysctl manpage: Added explanation of conf files precedence |
||||
- Resolves: rhbz#1456905 |
||||
|
||||
* Fri Apr 07 2017 Jan Rybar <jrybar@redhat.com> - 3.3.10-15 |
||||
- top - real CPU statistics instead of since-boot are shown at start |
||||
- Resolves: rhbz#1182327 |
||||
|
||||
* Fri Apr 07 2017 Jan Rybar <jrybar@redhat.com> - 3.3.10-14 |
||||
- sysctl.conf manpage: note about predefined values added |
||||
- Resolves: rhbz#1439837 |
||||
|
||||
* Mon Mar 13 2017 Jan Rybar <jrybar@redhat.com> - 3.3.10-13 |
||||
- slabtop: incorrect computation of "used" value, use float to fix |
||||
- Resolves: rhbz#1329958 |
||||
|
||||
* Mon Feb 20 2017 Jan Rybar <jrybar@redhat.com> - 3.3.10-12 |
||||
- pmap no longer shows each line twice with blank values on newer kernels |
||||
- Resolves: rhbz#1330417 |
||||
|
||||
* Tue Jan 31 2017 Jan Rybar <jrybar@redhat.com> - 3.3.10-11 |
||||
- ps no longer removes 'do_' and 'sys_' from wchan data |
||||
- Resolves: rhbz#1373246 |
||||
|
||||
* Tue Jul 26 2016 Jan Rybar <jrybar@redhat.com> - 3.3.10-10 |
||||
- Fixes sysinfo - devices with name longer than 20 chars are mistaken for partitions |
||||
- Resolves: rhbz#1169349 |
||||
|
||||
* Thu Jul 07 2016 Jan Rybar <jrybar@redhat.com> - 3.3.10-9 |
||||
- Fixes showing same cgroups for threads under process by adding format option |
||||
- Resolves: rhbz#1284087 |
||||
|
||||
* Mon Jul 04 2016 Jan Rybar <jrybar@redhat.com> - 3.3.10-8 |
||||
- Fixes obtaining environment variables in find_elf_note function |
||||
- Resolves: rhbz#1287752 |
||||
|
||||
* Thu Jun 09 2016 Jan Rybar <jrybar@redhat.com> - 3.3.10-7 |
||||
- Fixing sysinfo - devices with length exceeding 15 chars are not displayed in vmstat -d |
||||
- Resolves: #1169349 |
||||
|
||||
* Mon Jun 06 2016 Jan Rybar <jrybar@redhat.com> - 3.3.10-6 |
||||
- #1174311 - ps - thcount not recognized as a format option |
||||
- Resolves: #1174311 |
||||
|
||||
* Tue Dec 01 2015 Jaromir Capik <jcapik@redhat.com> - 3.3.10-5 |
||||
- #1287038 - free - error while parsing arguments |
||||
- Resolves: #1287038 |
||||
|
||||
* Tue Nov 24 2015 Jaromir Capik <jcapik@redhat.com> - 3.3.10-4 |
||||
- #1262864 - Correctly skip vmflags (and other keys starting with A-Z) |
||||
- Resolves: #1262864 |
||||
|
||||
* Mon Oct 06 2014 Jaromir Capik <jcapik@redhat.com> - 3.3.10-3 |
||||
- Disabling translated man pages due to conflicts with man-pages-* |
||||
- Removing /etc/sysctl.d (quietly stolen by systemd) |
||||
- Related: rhbz#1119263 rhbz#1119260 rhbz#1060715 rhbz#1113206 |
||||
- Related: rhbz#1112734 rhbz#1078310 rhbz#1116309 rhbz#1070736 |
||||
|
||||
* Tue Sep 23 2014 Jaromir Capik <jcapik@redhat.com> - 3.3.10-2 |
||||
- Replacing RC tarball with final 3.3.10 release |
||||
- Related: rhbz#1119263 rhbz#1119260 rhbz#1060715 rhbz#1113206 |
||||
- Related: rhbz#1112734 rhbz#1078310 rhbz#1116309 rhbz#1070736 |
||||
|
||||
* Tue Sep 09 2014 Jaromir Capik <jcapik@redhat.com> - 3.3.10-1 |
||||
- Upgrading to 3.3.10 |
||||
- top.1: physical memory - has used / is using (#1119263) |
||||
- Include man pages for openproc, readproc and readproctab (#1119260) |
||||
- ps -p cycles over all PIDs instead of just one (#1060715) |
||||
- Remove explicit dependency on systemd-libs package (#1113206) |
||||
- Allow longer usernames to display in ps output (#1112734) |
||||
- w doesn't display FROM by default (#1078310) |
||||
- Return value of pgrep is incorrect (#1116309) |
||||
- Should shared memory be accounted in cached in free output? (#1070736) |
||||
- Resolves: rhbz#1119263 rhbz#1119260 rhbz#1060715 rhbz#1113206 |
||||
- Resolves: rhbz#1112734 rhbz#1078310 rhbz#1116309 rhbz#1070736 |
||||
|
||||
* Thu Feb 27 2014 Jaromir Capik <jcapik@redhat.com> - 3.3.9-6 |
||||
- Subtracting Shmem from Cached (#1070736) |
||||
- Resolves: rhbz#1070736 |
||||
|
||||
* Thu Feb 06 2014 Jaromir Capik <jcapik@redhat.com> - 3.3.9-5 |
||||
- Support for timestamps & wide diskstat (#1053428, #1025833) |
||||
- Fixing fd leak in watch |
||||
- Fixing format-security build issues |
||||
- Skipping trailing zeros in read_unvectored (#1057600) |
||||
- Resolves: rhbz#1053428, Related: rhbz#1025833 |
||||
|
||||
* Fri Jan 24 2014 Daniel Mach <dmach@redhat.com> - 3.3.9-4 |
||||
- Mass rebuild 2014-01-24 |
||||
|
||||
* Mon Jan 20 2014 Jaromir Capik <jcapik@redhat.com> - 3.3.9-3 |
||||
- 'vmstat -w' was not wide enough (#1025833) |
||||
- Related: rhbz#1025833 |
||||
|
||||
* Fri Dec 27 2013 Daniel Mach <dmach@redhat.com> - 3.3.9-2 |
||||
- Mass rebuild 2013-12-27 |
||||
|
||||
* Tue Dec 03 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.9-1 |
||||
- Update to 3.3.9 |
||||
- Resolves: rhbz#1025833 rhbz#1025774 rhbz#1027109 |
||||
|
||||
* Mon Oct 21 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-15 |
||||
- Fixing incorrect format specifier (introduced with namespaces) |
||||
|
||||
* Tue Sep 17 2013 Aristeu Rozanski <aris@redhat.com> - 3.3.8-14 |
||||
- Introduce namespaces support (#980516) |
||||
|
||||
* Fri Aug 09 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-13 |
||||
- Including forgotten man fixes (#948522) |
||||
|
||||
* Wed Aug 07 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-12 |
||||
- Fixing the license tag |
||||
|
||||
* Wed Aug 07 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-11 |
||||
- Support for libselinux (#975459) |
||||
- Support for systemd (#994457) |
||||
- Support for 'Shmem' in free (#993271) |
||||
|
||||
* Sun Aug 04 2013 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 3.3.8-10 |
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild |
||||
|
||||
* Fri Jul 19 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-9 |
||||
- RH man page scan (#948522) |
||||
|
||||
* Tue Jul 02 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-8 |
||||
- Extending the end-of-job patch disabling the screen content restoration |
||||
|
||||
* Mon Jul 01 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-7 |
||||
- Disabling screen content restoration when exiting 'top' (#977561) |
||||
- Enabling SIGWINCH flood prevention |
||||
|
||||
* Wed Jun 26 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-6 |
||||
- Avoiding "write error" messages when piping to grep (#976199) |
||||
|
||||
* Wed Jun 26 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-5 |
||||
- Disabling tests - unsuitable for running on buildsystems |
||||
|
||||
* Mon Jun 17 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-4 |
||||
- Enabling skill and snice (#974752) |
||||
|
||||
* Wed Jun 12 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-3 |
||||
- Adding major version in the libnuma soname |
||||
|
||||
* Thu May 30 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-2 |
||||
- watch: enabling UTF-8 (#965867) |
||||
|
||||
* Wed May 29 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-1 |
||||
- Update to 3.3.8 |
||||
|
||||
* Wed May 22 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.7-4 |
||||
- top: inoculated against a window manager like 'screen' (#962022) |
||||
|
||||
* Tue Apr 16 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.7-3 |
||||
- Avoid segfaults when reading zero bytes - file2str (#951391) |
||||
|
||||
* Mon Apr 15 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.7-2 |
||||
- Moving libprocps.pc to the devel subpackage (#951726) |
||||
|
||||
* Tue Mar 26 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.7-1 |
||||
- Update to 3.3.7 |
||||
- Reverting upstream commit for testsuite/unix.exp |
||||
|
||||
* Tue Feb 05 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.6-4 |
||||
- Fixing empty pmap output on ppc/s390 (#906457) |
||||
|
||||
* Tue Jan 15 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.6-3 |
||||
- Typo in the description, pdwx instead of pwdx (#891476) |
||||
|
||||
* Tue Jan 08 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.6-2 |
||||
- Rebuilding with tests disabled (koji issue #853084) |
||||
|
||||
* Tue Jan 08 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.6-1 |
||||
- Update to 3.3.6 |
||||
- Changing URL/Source from gitorious to recently created sourceforge page |
||||
- Replacing autogen.sh with autoreconf |
||||
|
||||
* Mon Jan 07 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.5-1 |
||||
- Update to 3.3.5 |
||||
|
||||
* Tue Dec 11 2012 Jaromir Capik <jcapik@redhat.com> - 3.3.4-2 |
||||
- fixing the following regressions: |
||||
- negative ETIME field in ps (#871819) |
||||
- procps states a bug is hit when receiving a signal (#871824) |
||||
- allow core file generation by ps command (#871825) |
||||
|
||||
* Tue Dec 11 2012 Jaromir Capik <jcapik@redhat.com> - 3.3.4-1 |
||||
- Update to 3.3.4 |
||||
|
||||
* Tue Sep 25 2012 Jaromir Capik <jcapik@redhat.com> - 3.3.3-3.20120807git |
||||
- SELinux spelling fixes (#859900) |
||||
|
||||
* Tue Aug 21 2012 Jaromir Capik <jcapik@redhat.com> - 3.3.3-2.20120807git |
||||
- Tests enabled |
||||
|
||||
* Tue Aug 07 2012 Jaromir Capik <jcapik@redhat.com> - 3.3.3-1.20120807git |
||||
- Update to 3.3.3-20120807git |
||||
|
||||
* Sat Jul 21 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 3.3.2-4 |
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild |
||||
|
||||
* Thu Mar 08 2012 Jaromir Capik <jcapik@redhat.com> - 3.3.2-3 |
||||
- Second usrmove hack - providing /bin/ps |
||||
|
||||
* Tue Mar 06 2012 Jaromir Capik <jcapik@redhat.com> - 3.3.2-2 |
||||
- Fixing requires in the devel subpackage (missing %{?_isa} macro) |
||||
- License statement clarification (upstream patch referrenced in the spec header) |
||||
|
||||
* Mon Feb 27 2012 Jaromir Capik <jcapik@redhat.com> - 3.3.2-1 |
||||
- Initial version |
Loading…
Reference in new issue