Author: brooks
Date: Fri Jul 24 15:03:10 2009
New Revision: 195843
URL: http://svn.freebsd.org/changeset/base/195843

Log:
  Revert the changes to struct kinfo_proc in r194498.  Instead, fill
  in up to 16 (KI_NGROUPS) values and steal a bit from ki_cr_flags
  (all bits currently unused) to indicate overflow with the new flag
  KI_CRF_GRP_OVERFLOW.
  
  This fixes procstat -s.
  
  Approved by: re (kib)

Modified:
  head/lib/libkvm/kvm_proc.c
  head/sys/kern/kern_proc.c
  head/sys/sys/user.h

Modified: head/lib/libkvm/kvm_proc.c
==============================================================================
--- head/lib/libkvm/kvm_proc.c  Fri Jul 24 14:57:02 2009        (r195842)
+++ head/lib/libkvm/kvm_proc.c  Fri Jul 24 15:03:10 2009        (r195843)
@@ -145,8 +145,14 @@ kvm_proclist(kd, what, arg, p, bp, maxcn
                        kp->ki_svuid = ucred.cr_svuid;
                        kp->ki_rgid = ucred.cr_rgid;
                        kp->ki_svgid = ucred.cr_svgid;
-                       kp->ki_ngroups = ucred.cr_ngroups;
-                       kp->ki_groups = ucred.cr_groups;
+                       kp->ki_cr_flags = ucred.cr_flags;
+                       if (ucred.cr_ngroups > KI_NGROUPS) {
+                               kp->ki_ngroups = KI_NGROUPS;
+                               kp->ki_cr_flags |= KI_CRF_GRP_OVERFLOW;
+                       }
+                               kp->ki_ngroups = ucred.cr_ngroups;
+                       bcopy(ucred.cr_groups, kp->ki_groups,
+                           kp->ki_ngroups * sizeof(gid_t));
                        kp->ki_uid = ucred.cr_uid;
                        if (ucred.cr_prison != NULL) {
                                if (KREAD(kd, (u_long)ucred.cr_prison, &pr)) {

Modified: head/sys/kern/kern_proc.c
==============================================================================
--- head/sys/kern/kern_proc.c   Fri Jul 24 14:57:02 2009        (r195842)
+++ head/sys/kern/kern_proc.c   Fri Jul 24 15:03:10 2009        (r195843)
@@ -730,11 +730,17 @@ fill_kinfo_proc_only(struct proc *p, str
                kp->ki_uid = cred->cr_uid;
                kp->ki_ruid = cred->cr_ruid;
                kp->ki_svuid = cred->cr_svuid;
-               kp->ki_ngroups = cred->cr_ngroups;
-               kp->ki_groups = cred->cr_groups;
+               kp->ki_cr_flags = cred->cr_flags;
+               /* XXX bde doesn't like KI_NGROUPS */
+               if (cred->cr_ngroups > KI_NGROUPS) {
+                       kp->ki_ngroups = KI_NGROUPS;
+                       kp->ki_cr_flags |= KI_CRF_GRP_OVERFLOW;
+               } else
+                       kp->ki_ngroups = cred->cr_ngroups;
+               bcopy(cred->cr_groups, kp->ki_groups,
+                   kp->ki_ngroups * sizeof(gid_t));
                kp->ki_rgid = cred->cr_rgid;
                kp->ki_svgid = cred->cr_svgid;
-               kp->ki_cr_flags = cred->cr_flags;
                /* If jailed(cred), emulate the old P_JAILED flag. */
                if (jailed(cred)) {
                        kp->ki_flag |= P_JAILED;

Modified: head/sys/sys/user.h
==============================================================================
--- head/sys/sys/user.h Fri Jul 24 14:57:02 2009        (r195842)
+++ head/sys/sys/user.h Fri Jul 24 15:03:10 2009        (r195843)
@@ -85,7 +85,7 @@
  */
 #define        KI_NSPARE_INT   9
 #define        KI_NSPARE_LONG  12
-#define        KI_NSPARE_PTR   6
+#define        KI_NSPARE_PTR   7
 
 #ifdef __amd64__
 #define        KINFO_PROC_SIZE 1088
@@ -117,8 +117,15 @@
 #define        OCOMMLEN        16              /* size of returned thread name 
*/
 #define        COMMLEN         19              /* size of returned ki_comm 
name */
 #define        KI_EMULNAMELEN  16              /* size of returned ki_emul */
+#define KI_NGROUPS     16              /* number of groups in ki_groups */
 #define        LOGNAMELEN      17              /* size of returned ki_login */
 
+/*
+ * Steal a bit from ki_cr_flags (cr_flags is never used) to indicate
+ * that the cred had more than KI_NGROUPS groups.
+ */
+#define KI_CRF_GRP_OVERFLOW    0x80000000
+
 struct kinfo_proc {
        int     ki_structsize;          /* size of this structure */
        int     ki_layout;              /* reserved: layout identifier */
@@ -150,7 +157,7 @@ struct kinfo_proc {
        gid_t   ki_svgid;               /* Saved effective group id */
        short   ki_ngroups;             /* number of groups */
        short   ki_spare_short2;        /* unused (just here for alignment) */
-       uint32_t __was_ki_groups[16];   /* unused; left for bin compat */
+       gid_t   ki_groups[KI_NGROUPS];  /* groups */
        vm_size_t ki_size;              /* virtual size */
        segsz_t ki_rssize;              /* current resident set size in pages */
        segsz_t ki_swrss;               /* resident set size before last swap */
@@ -200,7 +207,6 @@ struct kinfo_proc {
        struct  pcb *ki_pcb;            /* kernel virtual addr of pcb */
        void    *ki_kstack;             /* kernel virtual addr of stack */
        void    *ki_udata;              /* User convenience pointer */
-       gid_t   *ki_groups;             /* groups */
        /*
         * When adding new variables, take space for pointers from the
         * front of ki_spareptrs, and longs from the end of ki_sparelongs.
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to