summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Dumazet <eric.dumazet@gmail.com>2012-10-11 19:02:10 +0200
committerCraig Small <csmall@enc.com.au>2012-10-24 21:43:37 +1100
commit7933435584aa1fd75460f4c7715a3d4855d97c1c (patch)
tree853f1afa2af7e891b8119b4f946100077dd06c73
parent9a60202b818c4566c33a0b7cfc7b79e886d006f8 (diff)
downloadprocps-ng-7933435584aa1fd75460f4c7715a3d4855d97c1c.tar.gz
ps: allow large list of groups
Current linux kernels output no more than 32 groups in /proc/{pid}/status. Plan is to increase this limit. This patch allows ps to not core dump if the buffer used to read status file was too small. # ps aux Signal 11 (SEGV) caught by ps (procps-ng version 3.3.3). ps:display.c:59: please report this bug Also increases the size of the buffer from 1024 to 4096, since even with 32 groups we are close to the limit. cat /proc/12731/status | wc 39 128 961 Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
-rw-r--r--proc/readproc.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/proc/readproc.c b/proc/readproc.c
index 63dbd5c..162cbad 100644
--- a/proc/readproc.c
+++ b/proc/readproc.c
@@ -353,7 +353,9 @@ ENTER(0x220);
P->vm_swap = strtol(S,&S,10);
continue;
case_Groups:
- { int j = strchr(S, '\n') - S; // currently lines end space + \n
+ { char *nl = strchr(S, '\n');
+ int j = nl ? (nl - S) : strlen(S);
+
if (j) {
P->supgid = xmalloc(j+1); // +1 in case space disappears
memcpy(P->supgid, S, j);
@@ -735,7 +737,7 @@ int read_cmdline(char *restrict const dst, unsigned sz, unsigned pid) {
// room to spare.
static proc_t* simple_readproc(PROCTAB *restrict const PT, proc_t *restrict const p) {
static struct stat sb; // stat() buffer
- static char sbuf[1024]; // buffer for stat,statm,status
+ static char sbuf[4096]; // buffer for stat,statm,status
char *restrict const path = PT->path;
unsigned flags = PT->flags;
@@ -841,7 +843,7 @@ next_proc:
// path is a path to the task, with some room to spare.
static proc_t* simple_readtask(PROCTAB *restrict const PT, const proc_t *restrict const p, proc_t *restrict const t, char *restrict const path) {
static struct stat sb; // stat() buffer
- static char sbuf[1024]; // buffer for stat,statm,status
+ static char sbuf[4096]; // buffer for stat,statm,status
unsigned flags = PT->flags;
if (unlikely(stat(path, &sb) == -1)) /* no such dirent (anymore) */
@@ -1384,7 +1386,7 @@ proc_data_t *readproctab3 (int(*want_task)(proc_t *buf), PROCTAB *restrict const
* and filled out proc_t structure.
*/
proc_t * get_proc_stats(pid_t pid, proc_t *p) {
- static char path[32], sbuf[1024];
+ static char path[32], sbuf[4096];
struct stat statbuf;
sprintf(path, "/proc/%d", pid);