procps-ng package update
Signed-off-by: basebuilder_pel7x64builder0 <basebuilder@powerel.org>master
parent
8b673841a3
commit
08310eae92
|
@ -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 @@
|
||||||
|
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 @@
|
||||||
|
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 @@
|
||||||
|
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 @@
|
||||||
|
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 @@
|
||||||
|
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 @@
|
||||||
|
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 @@
|
||||||
|
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 @@
|
||||||
|
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 @@
|
||||||
|
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 @@
|
||||||
|
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 @@
|
||||||
|
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 @@
|
||||||
|
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 @@
|
||||||
|
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 @@
|
||||||
|
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 @@
|
||||||
|
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 @@
|
||||||
|
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 @@
|
||||||
|
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 @@
|
||||||
|
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 @@
|
||||||
|
# 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