summaryrefslogtreecommitdiff
path: root/process.c
diff options
context:
space:
mode:
authorkosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-03-07 12:35:45 +0000
committerkosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-03-07 12:35:45 +0000
commit19a127d0cbb9a94b530add65f118252e94551bb9 (patch)
tree3abfbd45961eeeaafae4e822463d66cf3f8220f2 /process.c
parent1a8ee910f3f923f50e2b21cd55b8d3ae50eac85a (diff)
* process.c (proc_setgroups): replace getgrnam() with getgrnam_r()
because getgrnam() isn't thread safe. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@31048 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'process.c')
-rw-r--r--process.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/process.c b/process.c
index 3da3543e2b..134ebfac5c 100644
--- a/process.c
+++ b/process.c
@@ -4614,7 +4614,12 @@ proc_setgroups(VALUE obj, VALUE ary)
{
size_t ngroups, i;
rb_gid_t *groups;
- struct group *gr;
+ long getgr_buf_len = sysconf(_SC_GETGR_R_SIZE_MAX);
+ char* getgr_buf;
+
+ if (getgr_buf_len < 0)
+ getgr_buf_len = 4096;
+ getgr_buf = ALLOCA_N(char, getgr_buf_len);
Check_Type(ary, T_ARRAY);
@@ -4632,18 +4637,24 @@ proc_setgroups(VALUE obj, VALUE ary)
}
else {
VALUE tmp = rb_check_string_type(g);
+ struct group grp;
+ struct group *p;
+ int ret;
if (NIL_P(tmp)) {
groups[i] = NUM2GIDT(g);
}
else {
- gr = getgrnam(RSTRING_PTR(tmp));
- if (gr == NULL) {
- RB_GC_GUARD(tmp);
+ StringValue(tmp);
+
+ ret = getgrnam_r(RSTRING_PTR(tmp), &grp, getgr_buf, getgr_buf_len, &p);
+ if (ret)
+ rb_sys_fail("getgrnam_r");
+ if (p == NULL) {
rb_raise(rb_eArgError,
"can't find group for %s", RSTRING_PTR(tmp));
}
- groups[i] = gr->gr_gid;
+ groups[i] = grp.gr_gid;
}
}
}