ruby-changes:19010
From: kosaki <ko1@a...>
Date: Mon, 7 Mar 2011 21:35:51 +0900 (JST)
Subject: [ruby-changes:19010] Ruby:r31048 (trunk): * process.c (proc_setgroups): replace getgrnam() with getgrnam_r()
kosaki 2011-03-07 21:35:45 +0900 (Mon, 07 Mar 2011) New Revision: 31048 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=31048 Log: * process.c (proc_setgroups): replace getgrnam() with getgrnam_r() because getgrnam() isn't thread safe. Modified files: trunk/ChangeLog trunk/process.c Index: ChangeLog =================================================================== --- ChangeLog (revision 31047) +++ ChangeLog (revision 31048) @@ -1,3 +1,8 @@ +Mon Mar 7 21:31:38 2011 KOSAKI Motohiro <kosaki.motohiro@g...> + + * process.c (proc_setgroups): replace getgrnam() with getgrnam_r() + because getgrnam() isn't thread safe. + Mon Mar 7 20:49:12 2011 KOSAKI Motohiro <kosaki.motohiro@g...> * process.c (proc_getmaxgroups, proc_setmaxgroups): refrect Index: process.c =================================================================== --- process.c (revision 31047) +++ process.c (revision 31048) @@ -4614,8 +4614,13 @@ { 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); ngroups = RARRAY_LEN(ary); @@ -4632,18 +4637,24 @@ } 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; } } } -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/