basebuilder_pel7x64builder0
6 years ago
20 changed files with 1614 additions and 0 deletions
@ -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