diff --git a/SOURCES/procps-ng-3.3.10-CVE-2018-1124.patch b/SOURCES/procps-ng-3.3.10-CVE-2018-1124.patch new file mode 100644 index 00000000..ecb44762 --- /dev/null +++ b/SOURCES/procps-ng-3.3.10-CVE-2018-1124.patch @@ -0,0 +1,337 @@ +From 9d2ec74b76d220f5343e548fcb7058d723293a22 Mon Sep 17 00:00:00 2001 +From: Qualys Security Advisory +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 +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 + #include + #include ++#include + #include + #include + #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 +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 + diff --git a/SOURCES/procps-ng-3.3.10-find_elf_note-memory-error-fix.patch b/SOURCES/procps-ng-3.3.10-find_elf_note-memory-error-fix.patch new file mode 100644 index 00000000..47b52d9b --- /dev/null +++ b/SOURCES/procps-ng-3.3.10-find_elf_note-memory-error-fix.patch @@ -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 /* htons */ + #endif + ++#include ++#include ++ + 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; diff --git a/SOURCES/procps-ng-3.3.10-free-mem-petabytes-segfault.patch b/SOURCES/procps-ng-3.3.10-free-mem-petabytes-segfault.patch new file mode 100644 index 00000000..bae7933d --- /dev/null +++ b/SOURCES/procps-ng-3.3.10-free-mem-petabytes-segfault.patch @@ -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; diff --git a/SOURCES/procps-ng-3.3.10-free-uninitialized-errno.patch b/SOURCES/procps-ng-3.3.10-free-uninitialized-errno.patch new file mode 100644 index 00000000..3975e420 --- /dev/null +++ b/SOURCES/procps-ng-3.3.10-free-uninitialized-errno.patch @@ -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); diff --git a/SOURCES/procps-ng-3.3.10-pmap-lines-twice.patch b/SOURCES/procps-ng-3.3.10-pmap-lines-twice.patch new file mode 100644 index 00000000..edb2250d --- /dev/null +++ b/SOURCES/procps-ng-3.3.10-pmap-lines-twice.patch @@ -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, diff --git a/SOURCES/procps-ng-3.3.10-pmap-skip-vmflags.patch b/SOURCES/procps-ng-3.3.10-pmap-skip-vmflags.patch new file mode 100644 index 00000000..bc949a88 --- /dev/null +++ b/SOURCES/procps-ng-3.3.10-pmap-skip-vmflags.patch @@ -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, diff --git a/SOURCES/procps-ng-3.3.10-ps-full-wchan-name.patch b/SOURCES/procps-ng-3.3.10-ps-full-wchan-name.patch new file mode 100644 index 00000000..e72d0597 --- /dev/null +++ b/SOURCES/procps-ng-3.3.10-ps-full-wchan-name.patch @@ -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 */ diff --git a/SOURCES/procps-ng-3.3.10-ps-new-option-loginid-luid.patch b/SOURCES/procps-ng-3.3.10-ps-new-option-loginid-luid.patch new file mode 100644 index 00000000..c1e0ecb5 --- /dev/null +++ b/SOURCES/procps-ng-3.3.10-ps-new-option-loginid-luid.patch @@ -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 ). diff --git a/SOURCES/procps-ng-3.3.10-ps-scattered-thread-cgroups.patch b/SOURCES/procps-ng-3.3.10-ps-scattered-thread-cgroups.patch new file mode 100644 index 00000000..03ec6d10 --- /dev/null +++ b/SOURCES/procps-ng-3.3.10-ps-scattered-thread-cgroups.patch @@ -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 . diff --git a/SOURCES/procps-ng-3.3.10-ps-thcount-format-option.patch b/SOURCES/procps-ng-3.3.10-ps-thcount-format-option.patch new file mode 100644 index 00000000..7e36b073 --- /dev/null +++ b/SOURCES/procps-ng-3.3.10-ps-thcount-format-option.patch @@ -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 diff --git a/SOURCES/procps-ng-3.3.10-slabtop-use-val-float.patch b/SOURCES/procps-ng-3.3.10-slabtop-use-val-float.patch new file mode 100644 index 00000000..42ed9df5 --- /dev/null +++ b/SOURCES/procps-ng-3.3.10-slabtop-use-val-float.patch @@ -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; diff --git a/SOURCES/procps-ng-3.3.10-sysctl-conf-manpage-predef-note.patch b/SOURCES/procps-ng-3.3.10-sysctl-conf-manpage-predef-note.patch new file mode 100644 index 00000000..8f687ca6 --- /dev/null +++ b/SOURCES/procps-ng-3.3.10-sysctl-conf-manpage-predef-note.patch @@ -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 diff --git a/SOURCES/procps-ng-3.3.10-sysctl-empty-value-allowed.patch b/SOURCES/procps-ng-3.3.10-sysctl-empty-value-allowed.patch new file mode 100644 index 00000000..4fc57659 --- /dev/null +++ b/SOURCES/procps-ng-3.3.10-sysctl-empty-value-allowed.patch @@ -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; + } diff --git a/SOURCES/procps-ng-3.3.10-sysctl-man-conf-override-hint.patch b/SOURCES/procps-ng-3.3.10-sysctl-man-conf-override-hint.patch new file mode 100644 index 00000000..0f3b3de5 --- /dev/null +++ b/SOURCES/procps-ng-3.3.10-sysctl-man-conf-override-hint.patch @@ -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 diff --git a/SOURCES/procps-ng-3.3.10-top-instant-cpu-stats.patch b/SOURCES/procps-ng-3.3.10-top-instant-cpu-stats.patch new file mode 100644 index 00000000..a60a043f --- /dev/null +++ b/SOURCES/procps-ng-3.3.10-top-instant-cpu-stats.patch @@ -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 diff --git a/SOURCES/procps-ng-3.3.10-top-locale-independent-float-delay.patch b/SOURCES/procps-ng-3.3.10-top-locale-independent-float-delay.patch new file mode 100644 index 00000000..8d61e69c --- /dev/null +++ b/SOURCES/procps-ng-3.3.10-top-locale-independent-float-delay.patch @@ -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 diff --git a/SOURCES/procps-ng-3.3.10-top-strange-mem-val-scaling.patch b/SOURCES/procps-ng-3.3.10-top-strange-mem-val-scaling.patch new file mode 100644 index 00000000..786eeae0 --- /dev/null +++ b/SOURCES/procps-ng-3.3.10-top-strange-mem-val-scaling.patch @@ -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 */ diff --git a/SOURCES/procps-ng-3.3.10-vmstat-devlen.patch b/SOURCES/procps-ng-3.3.10-vmstat-devlen.patch new file mode 100644 index 00000000..e41de180 --- /dev/null +++ b/SOURCES/procps-ng-3.3.10-vmstat-devlen.patch @@ -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; diff --git a/SOURCES/procps-ng-3.3.10-vmstat-long-device-name.patch b/SOURCES/procps-ng-3.3.10-vmstat-long-device-name.patch new file mode 100644 index 00000000..91c72ece --- /dev/null +++ b/SOURCES/procps-ng-3.3.10-vmstat-long-device-name.patch @@ -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, '/'))) diff --git a/SPECS/procps-ng.spec b/SPECS/procps-ng.spec new file mode 100644 index 00000000..267d951e --- /dev/null +++ b/SPECS/procps-ng.spec @@ -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 - 3.3.10-23 +- check for truncation after calling snprintf() +- Related: CVE-2018-1124 + +* Fri May 11 2018 Kamil Dudka - 3.3.10-22 +- fix integer overflows leading to heap overflow in file2strvec() +- Resolves: CVE-2018-1124 + +* Thu Apr 19 2018 Jan Rybar - 3.3.10-21 +- ps: new format option LUID (LoginId) +- Resolves: rhbz#1518986 + +* Mon Jan 15 2018 Jan Rybar - 3.3.10-20 +- free: segfault when system memory exceeds petabytes +- Resolves: rhbz#1263765 + +* Mon Jan 15 2018 Jan Rybar - 3.3.10-19 +- top: locale independent float character in delay now accepted +- Resolves: rhbz#1182248 + +* Thu Jan 04 2018 Jan Rybar - 3.3.10-18 +- sysctl: empty value is now accepted +- Resolves: rhbz#1507356 + +* Wed Sep 06 2017 Jan Rybar - 3.3.10-17 +- top: strange unit scaling with high memory values +- Resolves: rhbz#1253851 + +* Wed May 31 2017 Jan Rybar - 3.3.10-16 +- sysctl manpage: Added explanation of conf files precedence +- Resolves: rhbz#1456905 + +* Fri Apr 07 2017 Jan Rybar - 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 - 3.3.10-14 +- sysctl.conf manpage: note about predefined values added +- Resolves: rhbz#1439837 + +* Mon Mar 13 2017 Jan Rybar - 3.3.10-13 +- slabtop: incorrect computation of "used" value, use float to fix +- Resolves: rhbz#1329958 + +* Mon Feb 20 2017 Jan Rybar - 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 - 3.3.10-11 +- ps no longer removes 'do_' and 'sys_' from wchan data +- Resolves: rhbz#1373246 + +* Tue Jul 26 2016 Jan Rybar - 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 - 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 - 3.3.10-8 +- Fixes obtaining environment variables in find_elf_note function +- Resolves: rhbz#1287752 + +* Thu Jun 09 2016 Jan Rybar - 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 - 3.3.10-6 +- #1174311 - ps - thcount not recognized as a format option +- Resolves: #1174311 + +* Tue Dec 01 2015 Jaromir Capik - 3.3.10-5 +- #1287038 - free - error while parsing arguments +- Resolves: #1287038 + +* Tue Nov 24 2015 Jaromir Capik - 3.3.10-4 +- #1262864 - Correctly skip vmflags (and other keys starting with A-Z) +- Resolves: #1262864 + +* Mon Oct 06 2014 Jaromir Capik - 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 - 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 - 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 - 3.3.9-6 +- Subtracting Shmem from Cached (#1070736) +- Resolves: rhbz#1070736 + +* Thu Feb 06 2014 Jaromir Capik - 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 - 3.3.9-4 +- Mass rebuild 2014-01-24 + +* Mon Jan 20 2014 Jaromir Capik - 3.3.9-3 +- 'vmstat -w' was not wide enough (#1025833) +- Related: rhbz#1025833 + +* Fri Dec 27 2013 Daniel Mach - 3.3.9-2 +- Mass rebuild 2013-12-27 + +* Tue Dec 03 2013 Jaromir Capik - 3.3.9-1 +- Update to 3.3.9 +- Resolves: rhbz#1025833 rhbz#1025774 rhbz#1027109 + +* Mon Oct 21 2013 Jaromir Capik - 3.3.8-15 +- Fixing incorrect format specifier (introduced with namespaces) + +* Tue Sep 17 2013 Aristeu Rozanski - 3.3.8-14 +- Introduce namespaces support (#980516) + +* Fri Aug 09 2013 Jaromir Capik - 3.3.8-13 +- Including forgotten man fixes (#948522) + +* Wed Aug 07 2013 Jaromir Capik - 3.3.8-12 +- Fixing the license tag + +* Wed Aug 07 2013 Jaromir Capik - 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 - 3.3.8-10 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild + +* Fri Jul 19 2013 Jaromir Capik - 3.3.8-9 +- RH man page scan (#948522) + +* Tue Jul 02 2013 Jaromir Capik - 3.3.8-8 +- Extending the end-of-job patch disabling the screen content restoration + +* Mon Jul 01 2013 Jaromir Capik - 3.3.8-7 +- Disabling screen content restoration when exiting 'top' (#977561) +- Enabling SIGWINCH flood prevention + +* Wed Jun 26 2013 Jaromir Capik - 3.3.8-6 +- Avoiding "write error" messages when piping to grep (#976199) + +* Wed Jun 26 2013 Jaromir Capik - 3.3.8-5 +- Disabling tests - unsuitable for running on buildsystems + +* Mon Jun 17 2013 Jaromir Capik - 3.3.8-4 +- Enabling skill and snice (#974752) + +* Wed Jun 12 2013 Jaromir Capik - 3.3.8-3 +- Adding major version in the libnuma soname + +* Thu May 30 2013 Jaromir Capik - 3.3.8-2 +- watch: enabling UTF-8 (#965867) + +* Wed May 29 2013 Jaromir Capik - 3.3.8-1 +- Update to 3.3.8 + +* Wed May 22 2013 Jaromir Capik - 3.3.7-4 +- top: inoculated against a window manager like 'screen' (#962022) + +* Tue Apr 16 2013 Jaromir Capik - 3.3.7-3 +- Avoid segfaults when reading zero bytes - file2str (#951391) + +* Mon Apr 15 2013 Jaromir Capik - 3.3.7-2 +- Moving libprocps.pc to the devel subpackage (#951726) + +* Tue Mar 26 2013 Jaromir Capik - 3.3.7-1 +- Update to 3.3.7 +- Reverting upstream commit for testsuite/unix.exp + +* Tue Feb 05 2013 Jaromir Capik - 3.3.6-4 +- Fixing empty pmap output on ppc/s390 (#906457) + +* Tue Jan 15 2013 Jaromir Capik - 3.3.6-3 +- Typo in the description, pdwx instead of pwdx (#891476) + +* Tue Jan 08 2013 Jaromir Capik - 3.3.6-2 +- Rebuilding with tests disabled (koji issue #853084) + +* Tue Jan 08 2013 Jaromir Capik - 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 - 3.3.5-1 +- Update to 3.3.5 + +* Tue Dec 11 2012 Jaromir Capik - 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 - 3.3.4-1 +- Update to 3.3.4 + +* Tue Sep 25 2012 Jaromir Capik - 3.3.3-3.20120807git +- SELinux spelling fixes (#859900) + +* Tue Aug 21 2012 Jaromir Capik - 3.3.3-2.20120807git +- Tests enabled + +* Tue Aug 07 2012 Jaromir Capik - 3.3.3-1.20120807git +- Update to 3.3.3-20120807git + +* Sat Jul 21 2012 Fedora Release Engineering - 3.3.2-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild + +* Thu Mar 08 2012 Jaromir Capik - 3.3.2-3 +- Second usrmove hack - providing /bin/ps + +* Tue Mar 06 2012 Jaromir Capik - 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 - 3.3.2-1 +- Initial version