[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]