From owner-freebsd-hackers@FreeBSD.ORG Tue Nov 4 12:42:36 2014 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 0B4403AA for ; Tue, 4 Nov 2014 12:42:36 +0000 (UTC) Received: from ustc.edu.cn (email6.ustc.edu.cn [IPv6:2001:da8:d800::8]) by mx1.freebsd.org (Postfix) with ESMTP id 07B89BBA for ; Tue, 4 Nov 2014 12:42:34 +0000 (UTC) Received: from freebsd (unknown [58.211.218.74]) by newmailweb.ustc.edu.cn (Coremail) with SMTP id LkAmygAXiT2KyVhUnEbOAA--.19213S2; Tue, 04 Nov 2014 20:41:52 +0800 (CST) Date: Tue, 4 Nov 2014 20:41:20 +0800 From: Tiwei Bie To: Mateusz Guzik Subject: Re: [PATCH] Finish the task 'Embedd group table into struct ucred' Message-ID: <20141104124120.GA11252@freebsd> References: <1415094686-39302-1-git-send-email-btw@mail.ustc.edu.cn> <20141104100130.GC4032@dft-labs.eu> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20141104100130.GC4032@dft-labs.eu> User-Agent: Mutt/1.5.23 (2014-03-12) X-CM-TRANSID: LkAmygAXiT2KyVhUnEbOAA--.19213S2 X-Coremail-Antispam: 1UD129KBjvJXoW7tr1fJrW7Wr1fXFWxtry7ZFb_yoW5JFWxpa 97t3y8KF43J34UJryktayvvF4xZw1F9a4DC3yrur1aqrn3tF1fZF15urWYkrWqgF1rGw1U KF1fAw1Utr93Aa7anT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUkYb7Iv0xC_KF4lb4IE77IF4wAFF20E14v26r1j6r4UM7CY07I2 0VC2zVCF04k26cxKx2IYs7xG6rWj6s0DM7CIcVAFz4kK6r1j6r18M28lY4IEw2IIxxk0rw A2F7IY1VAKz4vEj48ve4kI8wA2z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xII jxv20xvEc7CjxVAFwI0_Gr1j6F4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwV C2z280aVCY1x0267AKxVW0oVCq3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC 0VAKzVAqx4xG6I80ewAv7VC0I7IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Cr0_Gr 1UMcvjeVCFs4IE7xkEbVWUJVW8JwACjcxG0xvEwIxGrwCY02Avz4vE14v_Xr1l42xK82IY c2Ij64vIr41l4I8I3I0E4IkC6x0Yz7v_Jr0_Gr1lx2IqxVAqx4xG67AKxVWUJVWUGwC20s 026x8GjcxK67AKxVWUGVWUWwC2zVAF1VAY17CE14v26r1Y6r17MIIYrxkI7VAKI48JMIIF 0xvE2Ix0cI8IcVAFwI0_Jr0_JF4lIxAIcVC0I7IYx2IY6xkF7I0E14v26r1j6r4UMIIF0x vE42xK8VAvwI8IcIk0rVWrZr1j6s0DMIIF0xvEx4A2jsIE14v26r1j6r4UMIIF0xvEx4A2 jsIEc7CjxVAFwI0_Jr0_GrUvcSsGvfC2KfnxnUUI43ZEXa7IU8Q_-DUUUUU== X-CM-SenderInfo: xewzqzxdloh3xvwfhvlgxou0/1tbiAQURAVQhl8y9PQAGs8 Cc: freebsd-hackers@freebsd.org X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 04 Nov 2014 12:42:36 -0000 On Tue, Nov 04, 2014 at 11:01:30AM +0100, Mateusz Guzik wrote: > On Tue, Nov 04, 2014 at 05:51:26PM +0800, Tiwei Bie wrote: > > diff --git a/sys/kern/kern_prot.c b/sys/kern/kern_prot.c > > index 9b2bcd8..76d2cfc 100644 > > --- a/sys/kern/kern_prot.c > > +++ b/sys/kern/kern_prot.c > > @@ -1864,7 +1864,8 @@ crfree(struct ucred *cr) > > #ifdef MAC > > mac_cred_destroy(cr); > > #endif > > - free(cr->cr_groups, M_CRED); > > + if (cr->cr_groups != cr->cr_smallgroups) > > + free(cr->cr_groups, M_CRED); > > free(cr, M_CRED); > > } > > } > > @@ -1976,6 +1977,12 @@ crextend(struct ucred *cr, int n) > > if (n <= cr->cr_agroups) > > return; > > > > + if (n <= XU_NGROUPS) { > > + cr->cr_groups = cr->cr_smallgroups; > > + cr->cr_agroups = XU_NGROUPS; > > + return; > > + } > > + > > This should be initialized in crget, which should no longer call this > function. Sorry for my delay... Yeah, you are right. I didn't notice it... :-( My new patch: diff --git a/sys/kern/kern_prot.c b/sys/kern/kern_prot.c index 9b2bcd8..c83af66 100644 --- a/sys/kern/kern_prot.c +++ b/sys/kern/kern_prot.c @@ -1817,7 +1817,9 @@ crget(void) #ifdef MAC mac_cred_init(cr); #endif - crextend(cr, XU_NGROUPS); + cr->cr_groups = cr->cr_smallgroups; + cr->cr_agroups = XU_NGROUPS; + return (cr); } @@ -1864,7 +1866,8 @@ crfree(struct ucred *cr) #ifdef MAC mac_cred_destroy(cr); #endif - free(cr->cr_groups, M_CRED); + if (cr->cr_groups != cr->cr_smallgroups) + free(cr->cr_groups, M_CRED); free(cr, M_CRED); } } @@ -1997,7 +2000,7 @@ crextend(struct ucred *cr, int n) cnt = roundup2(n, PAGE_SIZE / sizeof(gid_t)); /* Free the old array. */ - if (cr->cr_groups) + if (cr->cr_groups != cr->cr_smallgroups) free(cr->cr_groups, M_CRED); cr->cr_groups = malloc(cnt * sizeof(gid_t), M_CRED, M_WAITOK | M_ZERO); diff --git a/sys/sys/ucred.h b/sys/sys/ucred.h index 81e4520..a6531c4 100644 --- a/sys/sys/ucred.h +++ b/sys/sys/ucred.h @@ -37,6 +37,8 @@ struct loginclass; +#define XU_NGROUPS 16 + /* * Credentials. * @@ -64,13 +66,12 @@ struct ucred { struct auditinfo_addr cr_audit; /* Audit properties. */ gid_t *cr_groups; /* groups */ int cr_agroups; /* Available groups */ + gid_t cr_smallgroups[XU_NGROUPS]; /* storage for small groups */ }; #define NOCRED ((struct ucred *)0) /* no credential available */ #define FSCRED ((struct ucred *)-1) /* filesystem credential */ #endif /* _KERNEL || _WANT_UCRED */ -#define XU_NGROUPS 16 - /* * Flags for cr_flags. */ -- 2.1.0 Tiwei Bie