From ab7f1cc3bea1c0bf24817861e7432a649b7fdda3 Mon Sep 17 00:00:00 2001 From: Drazen Kacar Date: Thu, 6 May 1999 01:15:44 +0000 Subject: [PATCH] List of supplementary groups was not correct. Fixed. * glibtop_private.h, procuid.c, procdata.c: List of supplementary groups was not correct. Fixed. --- sysdeps/solaris/ChangeLog | 5 +++++ sysdeps/solaris/glibtop_private.h | 2 +- sysdeps/solaris/procdata.c | 17 ++++++++++++++++- sysdeps/solaris/procuid.c | 8 ++++---- 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/sysdeps/solaris/ChangeLog b/sysdeps/solaris/ChangeLog index b9eb985a..4b102d85 100644 --- a/sysdeps/solaris/ChangeLog +++ b/sysdeps/solaris/ChangeLog @@ -1,3 +1,8 @@ +1999-05-06 Drazen Kacar + + * glibtop_private.h, procuid.c, procdata.c: List of supplementary + groups was not correct. Fixed. + 1999-05-04 Drazen Kacar * glibtop_machine.h: Changed boot time to unsigned long long. diff --git a/sysdeps/solaris/glibtop_private.h b/sysdeps/solaris/glibtop_private.h index d765c35a..4003ddf8 100644 --- a/sysdeps/solaris/glibtop_private.h +++ b/sysdeps/solaris/glibtop_private.h @@ -41,7 +41,7 @@ int glibtop_get_proc_data_psinfo_s (glibtop *server, struct psinfo *psinfo, pid_ int glibtop_get_proc_data_usage_s (glibtop *server, struct prusage *prusage, pid_t pid); /* Read /proc//cred */ -int glibtop_get_proc_credentials_s(glibtop *, struct prcred *, pid_t); +int glibtop_get_proc_credentials_s(glibtop *, struct prcred *, gid_t *, pid_t); /* Read /proc//status */ int glibtop_get_proc_status_s(glibtop *, struct pstatus *, pid_t); diff --git a/sysdeps/solaris/procdata.c b/sysdeps/solaris/procdata.c index 0de27e0b..bda7cbc0 100644 --- a/sysdeps/solaris/procdata.c +++ b/sysdeps/solaris/procdata.c @@ -23,6 +23,7 @@ #include #include +#include #include @@ -75,9 +76,13 @@ glibtop_get_proc_data_usage_s (glibtop *server, struct prusage *prusage, pid_t p } int -glibtop_get_proc_credentials_s(glibtop *server, struct prcred *prcred, pid_t pid) +glibtop_get_proc_credentials_s(glibtop *server, + struct prcred *prcred, + gid_t *groups, + pid_t pid) { int fd; + size_t toread; char buffer[BUFSIZ]; sprintf(buffer, "/proc/%d/cred", (int)pid); @@ -93,6 +98,16 @@ glibtop_get_proc_credentials_s(glibtop *server, struct prcred *prcred, pid_t pid glibtop_warn_io_r(server, "pread (%s)", buffer); return -1; } + if(prcred->pr_ngroups >= 0) + { + if(prcred->pr_ngroups <= GLIBTOP_MAX_GROUPS) + toread = prcred->pr_ngroups * sizeof(gid_t); + else + toread = GLIBTOP_MAX_GROUPS * sizeof(gid_t); + if(pread(fd, groups, toread, + &(((struct prcred *)0)->pr_groups[0])) != toread) + prcred->pr_ngroups = 0; + } close(fd); return 0; } diff --git a/sysdeps/solaris/procuid.c b/sysdeps/solaris/procuid.c index 7695850e..9639307d 100644 --- a/sysdeps/solaris/procuid.c +++ b/sysdeps/solaris/procuid.c @@ -53,6 +53,7 @@ glibtop_get_proc_uid_s (glibtop *server, glibtop_proc_uid *buf, pid_t pid) { struct psinfo psinfo; struct prcred prcred; + gid_t groups[GLIBTOP_MAX_GROUPS]; memset (buf, 0, sizeof (glibtop_proc_uid)); @@ -76,7 +77,7 @@ glibtop_get_proc_uid_s (glibtop *server, glibtop_proc_uid *buf, pid_t pid) buf->flags = _glibtop_sysdeps_proc_uid_psinfo; - if(glibtop_get_proc_credentials_s(server, &prcred, pid)) + if(glibtop_get_proc_credentials_s(server, &prcred, groups, pid)) return; buf->suid = prcred.pr_suid; @@ -85,14 +86,13 @@ glibtop_get_proc_uid_s (glibtop *server, glibtop_proc_uid *buf, pid_t pid) prcred.pr_ngroups : GLIBTOP_MAX_GROUPS; if(sizeof(int) == sizeof(gid_t)) - memcpy(buf->groups, prcred.pr_groups, - buf->ngroups * sizeof(gid_t)); + memcpy(buf->groups, &groups, buf->ngroups * sizeof(gid_t)); else { int i; for(i = 0; i < buf->ngroups; ++i) - buf->groups[i] = prcred.pr_groups[i]; + buf->groups[i] = groups[i]; } buf->flags += _glibtop_sysdeps_proc_uid_prcred; }