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

ruby-changes:34435

From: usa <ko1@a...>
Date: Mon, 23 Jun 2014 18:44:19 +0900 (JST)
Subject: [ruby-changes:34435] usa:r46516 (ruby_2_0_0): merge revision(s) 45287:

usa	2014-06-23 18:44:14 +0900 (Mon, 23 Jun 2014)

  New Revision: 46516

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=46516

  Log:
    merge revision(s) 45287:
    
    process.c: tmp buffer instead of alloca
    
    * process.c (OBJ2UID1, OBJ2GID1): separate from OBJ2UID and
      OBJ2GID respectively, need given buffers.
    
    * process.c (OBJ2UID, OBJ2GID): no longer need PREPARE_GETPWNAM
      and PREPARE_GETGRNAM.
    
    * process.c (obj2uid, obj2gid): use tmp buffer instead of alloca
      to get rid of potential stack overflow.

  Modified directories:
    branches/ruby_2_0_0/
  Modified files:
    branches/ruby_2_0_0/process.c
    branches/ruby_2_0_0/version.h
Index: ruby_2_0_0/process.c
===================================================================
--- ruby_2_0_0/process.c	(revision 46515)
+++ ruby_2_0_0/process.c	(revision 46516)
@@ -153,17 +153,30 @@ static void check_gid_switch(void); https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/process.c#L153
 # endif
 # ifdef USE_GETPWNAM_R
 #   define PREPARE_GETPWNAM \
-    long getpw_buf_len = sysconf(_SC_GETPW_R_SIZE_MAX); \
-    char *getpw_buf = ALLOCA_N(char, (getpw_buf_len < 0 ? (getpw_buf_len = 4096) : getpw_buf_len));
-#   define OBJ2UID(id) obj2uid((id), getpw_buf, getpw_buf_len)
-static rb_uid_t obj2uid(VALUE id, char *getpw_buf, size_t getpw_buf_len);
+    VALUE getpw_buf = 0
+#   define FINISH_GETPWNAM \
+    ALLOCV_END(getpw_buf)
+#   define OBJ2UID1(id) obj2uid((id), &getpw_buf)
+#   define OBJ2UID(id) obj2uid0(id)
+static rb_uid_t obj2uid(VALUE id, VALUE *getpw_buf);
+static inline rb_uid_t
+obj2uid0(VALUE id)
+{
+    rb_uid_t uid;
+    PREPARE_GETPWNAM;
+    uid = OBJ2UID1(id);
+    FINISH_GETPWNAM;
+    return uid;
+}
 # else
 #   define PREPARE_GETPWNAM	/* do nothing */
+#   define FINISH_GETPWNAM	/* do nothing */
 #   define OBJ2UID(id) obj2uid((id))
 static rb_uid_t obj2uid(VALUE id);
 # endif
 #else
 # define PREPARE_GETPWNAM	/* do nothing */
+# define FINISH_GETPWNAM	/* do nothing */
 # define OBJ2UID(id) NUM2UIDT(id)
 # ifdef p_uid_from_name
 #   undef p_uid_from_name
@@ -180,17 +193,31 @@ static rb_uid_t obj2uid(VALUE id); https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/process.c#L193
 # endif
 # ifdef USE_GETGRNAM_R
 #   define PREPARE_GETGRNAM \
-    long getgr_buf_len = sysconf(_SC_GETGR_R_SIZE_MAX); \
-    char *getgr_buf = ALLOCA_N(char, (getgr_buf_len < 0 ? (getgr_buf_len = 4096) : getgr_buf_len));
-#   define OBJ2GID(id) obj2gid((id), getgr_buf, getgr_buf_len)
-static rb_gid_t obj2gid(VALUE id, char *getgr_buf, size_t getgr_buf_len);
+    VALUE getgr_buf = 0
+#   define FINISH_GETGRNAM \
+    ALLOCV_END(getgr_buf)
+#   define OBJ2GID1(id) obj2gid((id), &getgr_buf)
+#   define OBJ2GID(id) obj2gid0(id)
+static rb_gid_t obj2gid(VALUE id, VALUE *getgr_buf);
+static inline rb_gid_t
+obj2gid0(VALUE id)
+{
+    rb_gid_t gid;
+    PREPARE_GETGRNAM;
+    gid = OBJ2GID1(id);
+    FINISH_GETGRNAM;
+    return gid;
+}
+static rb_gid_t obj2gid(VALUE id, VALUE *getgr_buf);
 # else
 #   define PREPARE_GETGRNAM	/* do nothing */
+#   define FINISH_GETGRNAM	/* do nothing */
 #   define OBJ2GID(id) obj2gid((id))
 static rb_gid_t obj2gid(VALUE id);
 # endif
 #else
 # define PREPARE_GETGRNAM	/* do nothing */
+# define FINISH_GETGRNAM	/* do nothing */
 # define OBJ2GID(id) NUM2GIDT(id)
 # ifdef p_gid_from_name
 #   undef p_gid_from_name
@@ -1732,7 +1759,6 @@ rb_execarg_addopt(VALUE execarg_obj, VAL https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/process.c#L1759
 	    }
 	    check_uid_switch();
 	    {
-		PREPARE_GETPWNAM;
 		eargp->uid = OBJ2UID(val);
 		eargp->uid_given = 1;
 	    }
@@ -1748,7 +1774,6 @@ rb_execarg_addopt(VALUE execarg_obj, VAL https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/process.c#L1774
 	    }
 	    check_gid_switch();
 	    {
-		PREPARE_GETGRNAM;
 		eargp->gid = OBJ2GID(val);
 		eargp->gid_given = 1;
 	    }
@@ -4735,7 +4760,7 @@ check_gid_switch(void) https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/process.c#L4760
 static rb_uid_t
 obj2uid(VALUE id
 # ifdef USE_GETPWNAM_R
-	, char *getpw_buf, size_t getpw_buf_len
+	, VALUE *getpw_tmp
 # endif
     )
 {
@@ -4793,7 +4818,6 @@ obj2uid(VALUE id https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/process.c#L4818
 static VALUE
 p_uid_from_name(VALUE self, VALUE id)
 {
-    PREPARE_GETPWNAM
     return UIDT2NUM(OBJ2UID(id));
 }
 # endif
@@ -4803,7 +4827,7 @@ p_uid_from_name(VALUE self, VALUE id) https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/process.c#L4827
 static rb_gid_t
 obj2gid(VALUE id
 # ifdef USE_GETGRNAM_R
-	, char *getgr_buf, size_t getgr_buf_len
+	, VALUE *getgr_tmp
 # endif
     )
 {
@@ -4861,7 +4885,6 @@ obj2gid(VALUE id https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/process.c#L4885
 static VALUE
 p_gid_from_name(VALUE self, VALUE id)
 {
-    PREPARE_GETGRNAM;
     return GIDT2NUM(OBJ2GID(id));
 }
 # endif
@@ -4880,7 +4903,6 @@ p_gid_from_name(VALUE self, VALUE id) https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/process.c#L4903
 static VALUE
 p_sys_setuid(VALUE obj, VALUE id)
 {
-    PREPARE_GETPWNAM;
     check_uid_switch();
     if (setuid(OBJ2UID(id)) != 0) rb_sys_fail(0);
     return Qnil;
@@ -4903,7 +4925,6 @@ p_sys_setuid(VALUE obj, VALUE id) https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/process.c#L4925
 static VALUE
 p_sys_setruid(VALUE obj, VALUE id)
 {
-    PREPARE_GETPWNAM;
     check_uid_switch();
     if (setruid(OBJ2UID(id)) != 0) rb_sys_fail(0);
     return Qnil;
@@ -4926,7 +4947,6 @@ p_sys_setruid(VALUE obj, VALUE id) https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/process.c#L4947
 static VALUE
 p_sys_seteuid(VALUE obj, VALUE id)
 {
-    PREPARE_GETPWNAM;
     check_uid_switch();
     if (seteuid(OBJ2UID(id)) != 0) rb_sys_fail(0);
     return Qnil;
@@ -4951,9 +4971,13 @@ p_sys_seteuid(VALUE obj, VALUE id) https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/process.c#L4971
 static VALUE
 p_sys_setreuid(VALUE obj, VALUE rid, VALUE eid)
 {
+    rb_uid_t ruid, euid;
     PREPARE_GETPWNAM;
     check_uid_switch();
-    if (setreuid(OBJ2UID(rid), OBJ2UID(eid)) != 0) rb_sys_fail(0);
+    ruid = OBJ2UID1(rid);
+    euid = OBJ2UID1(eid);
+    FINISH_GETPWNAM;
+    if (setreuid(ruid, euid) != 0) rb_sys_fail(0);
     return Qnil;
 }
 #else
@@ -4976,9 +5000,14 @@ p_sys_setreuid(VALUE obj, VALUE rid, VAL https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/process.c#L5000
 static VALUE
 p_sys_setresuid(VALUE obj, VALUE rid, VALUE eid, VALUE sid)
 {
+    rb_uid_t ruid, euid, suid;
     PREPARE_GETPWNAM;
     check_uid_switch();
-    if (setresuid(OBJ2UID(rid), OBJ2UID(eid), OBJ2UID(sid)) != 0) rb_sys_fail(0);
+    ruid = OBJ2UID1(rid);
+    euid = OBJ2UID1(eid);
+    suid = OBJ2UID1(sid);
+    FINISH_GETPWNAM;
+    if (setresuid(ruid, euid, suid) != 0) rb_sys_fail(0);
     return Qnil;
 }
 #else
@@ -5018,7 +5047,6 @@ static VALUE https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/process.c#L5047
 proc_setuid(VALUE obj, VALUE id)
 {
     rb_uid_t uid;
-    PREPARE_GETPWNAM;
 
     check_uid_switch();
 
@@ -5090,7 +5118,6 @@ static VALUE https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/process.c#L5118
 p_uid_change_privilege(VALUE obj, VALUE id)
 {
     rb_uid_t uid;
-    PREPARE_GETPWNAM;
 
     check_uid_switch();
 
@@ -5260,7 +5287,6 @@ p_uid_change_privilege(VALUE obj, VALUE https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/process.c#L5287
 static VALUE
 p_sys_setgid(VALUE obj, VALUE id)
 {
-    PREPARE_GETGRNAM;
     check_gid_switch();
     if (setgid(OBJ2GID(id)) != 0) rb_sys_fail(0);
     return Qnil;
@@ -5283,7 +5309,6 @@ p_sys_setgid(VALUE obj, VALUE id) https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/process.c#L5309
 static VALUE
 p_sys_setrgid(VALUE obj, VALUE id)
 {
-    PREPARE_GETGRNAM;
     check_gid_switch();
     if (setrgid(OBJ2GID(id)) != 0) rb_sys_fail(0);
     return Qnil;
@@ -5306,7 +5331,6 @@ p_sys_setrgid(VALUE obj, VALUE id) https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/process.c#L5331
 static VALUE
 p_sys_setegid(VALUE obj, VALUE id)
 {
-    PREPARE_GETGRNAM;
     check_gid_switch();
     if (setegid(OBJ2GID(id)) != 0) rb_sys_fail(0);
     return Qnil;
@@ -5331,9 +5355,13 @@ p_sys_setegid(VALUE obj, VALUE id) https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/process.c#L5355
 static VALUE
 p_sys_setregid(VALUE obj, VALUE rid, VALUE eid)
 {
+    rb_gid_t rgid, egid;
     PREPARE_GETGRNAM;
     check_gid_switch();
-    if (setregid(OBJ2GID(rid), OBJ2GID(eid)) != 0) rb_sys_fail(0);
+    rgid = OBJ2GID(rid);
+    egid = OBJ2GID(eid);
+    FINISH_GETGRNAM;
+    if (setregid(rgid, egid) != 0) rb_sys_fail(0);
     return Qnil;
 }
 #else
@@ -5355,9 +5383,14 @@ p_sys_setregid(VALUE obj, VALUE rid, VAL https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/process.c#L5383
 static VALUE
 p_sys_setresgid(VALUE obj, VALUE rid, VALUE eid, VALUE sid)
 {
+    rb_gid_t rgid, egid, sgid;
     PREPARE_GETGRNAM;
     check_gid_switch();
-    if (setresgid(OBJ2GID(rid), OBJ2GID(eid), OBJ2GID(sid)) != 0) rb_sys_fail(0);
+    rgid = OBJ2GID(rid);
+    egid = OBJ2GID(eid);
+    sgid = OBJ2GID(sid);
+    FINISH_GETGRNAM;
+    if (setresgid(rgid, egid, sgid) != 0) rb_sys_fail(0);
     return Qnil;
 }
 #else
@@ -5425,7 +5458,6 @@ static VALUE https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/process.c#L5458
 proc_setgid(VALUE obj, VALUE id)
 {
     rb_gid_t gid;
-    PREPARE_GETGRNAM;
 
     check_gid_switch();
 
@@ -5573,8 +5605,9 @@ proc_setgroups(VALUE obj, VALUE ary) https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/process.c#L5605
     for (i = 0; i < ngroups; i++) {
 	VALUE g = RARRAY_PTR(ary)[i];
 
-	groups[i] = OBJ2GID(g);
+	groups[i] = OBJ2GID1(g);
     }
+    FINISH_GETGRNAM;
 
     if (setgroups(ngroups, groups) == -1) /* ngroups <= maxgroups */
 	rb_sys_fail(0);
@@ -5607,7 +5640,6 @@ proc_setgroups(VALUE obj, VALUE ary) https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/process.c#L5640
 static VALUE
 proc_initgroups(VALUE obj, VALUE uname, VALUE base_grp)
 {
-    PREPARE_GETGRNAM;
     if (initgroups(StringValuePtr(uname), OBJ2GID(base_grp)) != 0) {
 	rb_sys_fail(0);
     }
@@ -5789,7 +5821,6 @@ static VALUE https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/process.c#L5821
 p_gid_change_privilege(VALUE obj, VALUE id)
 {
     rb_gid_t gid;
-    PREPARE_GETGRNAM;
 
     check_gid_switch();
 
@@ -5999,7 +6030,6 @@ proc_seteuid(rb_uid_t uid) https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/process.c#L6030
 static VALUE
 proc_seteuid_m(VALUE mod, VALUE euid)
 {
-    PREPARE_GETPWNAM;
     check_uid_switch();
     proc_seteuid(OBJ2UID(euid));
     return euid;
@@ -6065,7 +6095,6 @@ rb_seteuid_core(rb_uid_t euid) https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/process.c#L6095
 static VALUE
 p_uid_grant_privilege(VALUE obj, VALUE id)
 {
-    PREPARE_GETPWNAM;
     rb_seteuid_core(OBJ2UID(id));
     return id;
 }
@@ -6105,7 +6134,6 @@ proc_setegid(VALUE obj, VALUE egid) https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/process.c#L6134
 {
 #if defined(HAVE_SETRESGID) || defined(HAVE_SETREGID) || defined(HAVE_SETEGID) || defined(HAVE_SETGID)
     rb_gid_t gid;
-    PREPARE_GETGRNAM;
 #endif
 
     check_gid_switch();
@@ -6197,7 +6225,6 @@ rb_setegid_core(rb_gid_t egid) https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/process.c#L6225
 static VALUE
 p_gid_grant_privilege(VALUE obj, VALUE id)
 {
-    PREPARE_GETGRNAM;
     rb_setegid_core(OBJ2GID(id));
     return id;
 }
Index: ruby_2_0_0/version.h
===================================================================
--- ruby_2_0_0/version.h	(revision 46515)
+++ ruby_2_0_0/version.h	(revision 46516)
@@ -1,6 +1,6 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/version.h#L1
 #define RUBY_VERSION "2.0.0"
 #define RUBY_RELEASE_DATE "2014-06-23"
-#define RUBY_PATCHLEVEL 496
+#define RUBY_PATCHLEVEL 497
 
 #define RUBY_RELEASE_YEAR 2014
 #define RUBY_RELEASE_MONTH 6

Property changes on: ruby_2_0_0
___________________________________________________________________
Modified: svn:mergeinfo
   Merged /trunk:r45287


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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