diff options
author | nagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-03-04 16:04:53 +0000 |
---|---|---|
committer | nagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-03-04 16:04:53 +0000 |
commit | dab8d82d212ea64b6ddc2ff7a7b84c79fa60c28c (patch) | |
tree | 1b430e7b207df973d3dac1ac571b940a9864dfdb /file.c | |
parent | bec0f1a6ce80868b650620f567386fc290e8d95e (diff) |
merge revision(s) 39349,39374: [Backport #7886]
* file.c (rb_group_member): get rid of NGROUPS dependency.
[Bug #7886] [ruby-core:52537]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_0_0@39588 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'file.c')
-rw-r--r-- | file.c | 59 |
1 files changed, 36 insertions, 23 deletions
@@ -1013,39 +1013,52 @@ rb_file_lstat(VALUE obj) #endif } +/* Linux allow 65536 groups and it is maximum value as far as we know. */ +#define RUBY_GROUP_MAX 65536 + static int rb_group_member(GETGROUPS_T gid) { +#ifdef _WIN32 + return FALSE; +#else int rv = FALSE; -#ifndef _WIN32 + int groups = 16; + VALUE v = 0; + GETGROUPS_T *gary; + int anum; + if (getgid() == gid || getegid() == gid) return TRUE; -# ifdef HAVE_GETGROUPS -# ifndef NGROUPS -# ifdef NGROUPS_MAX -# define NGROUPS NGROUPS_MAX -# else -# define NGROUPS 32 -# endif -# endif - { - GETGROUPS_T *gary; - int anum; - - gary = xmalloc(NGROUPS * sizeof(GETGROUPS_T)); - anum = getgroups(NGROUPS, gary); - while (--anum >= 0) { - if (gary[anum] == gid) { - rv = TRUE; - break; - } + /* + * On Mac OS X (Mountain Lion), NGROUPS is 16. But libc and kernel + * accept more larger value. + * So we don't trunk NGROUPS anymore. + */ + while (groups <= RUBY_GROUP_MAX) { + gary = ALLOCV_N(GETGROUPS_T, v, groups); + anum = getgroups(groups, gary); + if (anum != groups) + break; + groups *= 2; + if (v) { + ALLOCV_END(v); + v = 0; } - xfree(gary); } -# endif -#endif + + while (--anum >= 0) { + if (gary[anum] == gid) { + rv = TRUE; + break; + } + } + if (v) + ALLOCV_END(v); + return rv; +#endif } #ifndef S_IXUGO |