@@ -1060,17 +1060,18 @@ pub fn getgroups() -> Result<Vec<Gid>> {
10601060 // First get the number of groups so we can size our Vec
10611061 use std:: ptr;
10621062 let ret = unsafe { libc:: getgroups ( 0 , ptr:: null_mut ( ) ) } ;
1063- let mut size = Errno :: result ( ret) ?;
10641063
10651064 // Now actually get the groups. We try multiple times in case the number of
10661065 // groups has changed since the first call to getgroups() and the buffer is
1067- // now too small
1068- let mut groups = Vec :: < Gid > :: with_capacity ( size as usize ) ;
1066+ // now too small.
1067+ let mut groups = Vec :: < Gid > :: with_capacity ( Errno :: result ( ret ) ? as usize ) ;
10691068 loop {
10701069 // FIXME: On the platforms we currently support, the `Gid` struct has
10711070 // the same representation in memory as a bare `gid_t`. This is not
10721071 // necessarily the case on all Rust platforms, though. See RFC 1785.
1073- let ret = unsafe { libc:: getgroups ( size, groups. as_mut_ptr ( ) as * mut gid_t ) } ;
1072+ let ret = unsafe {
1073+ libc:: getgroups ( groups. capacity ( ) as c_int , groups. as_mut_ptr ( ) as * mut gid_t )
1074+ } ;
10741075
10751076 match Errno :: result ( ret) {
10761077 Ok ( s) => {
@@ -1083,7 +1084,6 @@ pub fn getgroups() -> Result<Vec<Gid>> {
10831084 let cap = groups. capacity ( ) ;
10841085 unsafe { groups. set_len ( cap) } ;
10851086 groups. reserve ( 1 ) ;
1086- size = groups. capacity ( ) as c_int ;
10871087 } ,
10881088 Err ( e) => return Err ( e)
10891089 }
@@ -1135,9 +1135,10 @@ pub fn setgroups(groups: &[Gid]) -> Result<()> {
11351135 Errno :: result ( res) . map ( |_| ( ) )
11361136}
11371137
1138- /// Calculate the supplementary group access list. Gets the group IDs of all
1139- /// groups that `user` is a member of. The additional group `group` is also
1140- /// added to the list.
1138+ /// Calculate the supplementary group access list.
1139+ ///
1140+ /// Gets the group IDs of all groups that `user` is a member of. The additional
1141+ /// group `group` is also added to the list.
11411142///
11421143/// [Further reading](http://man7.org/linux/man-pages/man3/getgrouplist.3.html)
11431144///
@@ -1173,6 +1174,7 @@ pub fn getgrouplist(user: &CStr, group: Gid) -> Result<Vec<Gid>> {
11731174 groups. as_mut_ptr ( ) as * mut getgrouplist_group_t ,
11741175 & mut ngroups)
11751176 } ;
1177+
11761178 // BSD systems only return 0 or -1, Linux returns ngroups on success.
11771179 if ret >= 0 {
11781180 unsafe { groups. set_len ( ngroups as usize ) } ;
@@ -1199,9 +1201,11 @@ pub fn getgrouplist(user: &CStr, group: Gid) -> Result<Vec<Gid>> {
11991201 }
12001202}
12011203
1202- /// Initialize the supplementary group access list. Sets the supplementary
1203- /// group IDs for the calling process using all groups that `user` is a member
1204- /// of. The additional group `group` is also added to the list.
1204+ /// Initialize the supplementary group access list.
1205+ ///
1206+ /// Sets the supplementary group IDs for the calling process using all groups
1207+ /// that `user` is a member of. The additional group `group` is also added to
1208+ /// the list.
12051209///
12061210/// [Further reading](http://man7.org/linux/man-pages/man3/initgroups.3.html)
12071211///
@@ -1211,7 +1215,7 @@ pub fn getgrouplist(user: &CStr, group: Gid) -> Result<Vec<Gid>> {
12111215/// another user. For example, given the user `www-data`, we could look up the
12121216/// UID and GID for the user in the system's password database (usually found
12131217/// in `/etc/passwd`). If the `www-data` user's UID and GID were `33` and `33`,
1214- /// respectively, one could switch user as follows:
1218+ /// respectively, one could switch the user as follows:
12151219/// ```
12161220/// let user = CString::new("www-data").unwrap();
12171221/// let uid = Uid::from_raw(33);
0 commit comments