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

ruby-changes:34430

From: usa <ko1@a...>
Date: Mon, 23 Jun 2014 17:32:58 +0900 (JST)
Subject: [ruby-changes:34430] usa:r46511 (ruby_2_0_0): merge revision(s) 45287:45290: [Backport #9600]

usa	2014-06-23 17:32:49 +0900 (Mon, 23 Jun 2014)

  New Revision: 46511

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

  Log:
    merge revision(s) 45287:45290: [Backport #9600]
    
    * process.c (obj2uid, obj2gid): now getpwnam_r() and getgrnam_r()
      may need larger buffers than sysconf values, so retry with
      expanding the buffer when ERANGE is returned.
      [ruby-core:61325] [Bug #9600]

  Modified directories:
    branches/ruby_2_0_0/
  Modified files:
    branches/ruby_2_0_0/ChangeLog
    branches/ruby_2_0_0/process.c
    branches/ruby_2_0_0/version.h
Index: ruby_2_0_0/ChangeLog
===================================================================
--- ruby_2_0_0/ChangeLog	(revision 46510)
+++ ruby_2_0_0/ChangeLog	(revision 46511)
@@ -1,3 +1,10 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/ChangeLog#L1
+Mon Jun 23 17:29:53 2014  Nobuyoshi Nakada  <nobu@r...>
+
+	* process.c (obj2uid, obj2gid): now getpwnam_r() and getgrnam_r()
+	  may need larger buffers than sysconf values, so retry with
+	  expanding the buffer when ERANGE is returned.
+	  [ruby-core:61325] [Bug #9600]
+
 Mon Jun 23 17:20:10 2014  Tanaka Akira  <akr@f...>
 
 	* ext/socket/socket.c (sock_s_getnameinfo): Save errno for EAI_SYSTEM.
Index: ruby_2_0_0/process.c
===================================================================
--- ruby_2_0_0/process.c	(revision 46510)
+++ ruby_2_0_0/process.c	(revision 46511)
@@ -147,6 +147,9 @@ static void check_gid_switch(void); https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/process.c#L147
 #if defined(HAVE_PWD_H)
 # if defined(HAVE_GETPWNAM_R) && defined(_SC_GETPW_R_SIZE_MAX)
 #  define USE_GETPWNAM_R 1
+#  define GETPW_R_SIZE_INIT sysconf(_SC_GETPW_R_SIZE_MAX)
+#  define GETPW_R_SIZE_DEFAULT 0x1000
+#  define GETPW_R_SIZE_LIMIT  0x10000
 # endif
 # ifdef USE_GETPWNAM_R
 #   define PREPARE_GETPWNAM \
@@ -171,6 +174,9 @@ static rb_uid_t obj2uid(VALUE id); https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/process.c#L174
 #if defined(HAVE_GRP_H)
 # if defined(HAVE_GETGRNAM_R) && defined(_SC_GETGR_R_SIZE_MAX)
 #  define USE_GETGRNAM_R
+#  define GETGR_R_SIZE_INIT sysconf(_SC_GETGR_R_SIZE_MAX)
+#  define GETGR_R_SIZE_DEFAULT 0x1000
+#  define GETGR_R_SIZE_LIMIT  0x10000
 # endif
 # ifdef USE_GETGRNAM_R
 #   define PREPARE_GETGRNAM \
@@ -4744,8 +4750,28 @@ obj2uid(VALUE id https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/process.c#L4750
 	struct passwd *pwptr;
 #ifdef USE_GETPWNAM_R
 	struct passwd pwbuf;
-	if (getpwnam_r(usrname, &pwbuf, getpw_buf, getpw_buf_len, &pwptr))
-	    rb_sys_fail("getpwnam_r");
+	char *getpw_buf;
+	long getpw_buf_len;
+	if (!*getpw_tmp) {
+	    getpw_buf_len = GETPW_R_SIZE_INIT;
+	    if (getpw_buf_len < 0) getpw_buf_len = GETPW_R_SIZE_DEFAULT;
+	    getpw_buf = rb_alloc_tmp_buffer(getpw_tmp, getpw_buf_len);
+	}
+	else {
+	    getpw_buf = RSTRING_PTR(*getpw_tmp);
+	    getpw_buf_len = rb_str_capacity(*getpw_tmp);
+	}
+	errno = ERANGE;
+	/* gepwnam_r() on MacOS X doesn't set errno if buffer size is insufficient */
+	while (getpwnam_r(usrname, &pwbuf, getpw_buf, getpw_buf_len, &pwptr)) {
+	    if (errno != ERANGE || getpw_buf_len >= GETPW_R_SIZE_LIMIT) {
+		rb_free_tmp_buffer(getpw_tmp);
+		rb_sys_fail("getpwnam_r");
+	    }
+	    rb_str_modify_expand(*getpw_tmp, getpw_buf_len);
+	    getpw_buf = RSTRING_PTR(*getpw_tmp);
+	    getpw_buf_len = rb_str_capacity(*getpw_tmp);
+	}
 #else
 	pwptr = getpwnam(usrname);
 #endif
@@ -4792,8 +4818,28 @@ obj2gid(VALUE id https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/process.c#L4818
 	struct group *grptr;
 #ifdef USE_GETGRNAM_R
 	struct group grbuf;
-	if (getgrnam_r(grpname, &grbuf, getgr_buf, getgr_buf_len, &grptr))
-	    rb_sys_fail("getgrnam_r");
+	char *getgr_buf;
+	long getgr_buf_len;
+	if (!*getgr_tmp) {
+	    getgr_buf_len = GETGR_R_SIZE_INIT;
+	    if (getgr_buf_len < 0) getgr_buf_len = GETGR_R_SIZE_DEFAULT;
+	    getgr_buf = rb_alloc_tmp_buffer(getgr_tmp, getgr_buf_len);
+	}
+	else {
+	    getgr_buf = RSTRING_PTR(*getgr_tmp);
+	    getgr_buf_len = rb_str_capacity(*getgr_tmp);
+	}
+	errno = ERANGE;
+	/* gegrnam_r() on MacOS X doesn't set errno if buffer size is insufficient */
+	while (getgrnam_r(grpname, &grbuf, getgr_buf, getgr_buf_len, &grptr)) {
+	    if (errno != ERANGE || getgr_buf_len >= GETGR_R_SIZE_LIMIT) {
+		rb_free_tmp_buffer(getgr_tmp);
+		rb_sys_fail("getgrnam_r");
+	    }
+	    rb_str_modify_expand(*getgr_tmp, getgr_buf_len);
+	    getgr_buf = RSTRING_PTR(*getgr_tmp);
+	    getgr_buf_len = rb_str_capacity(*getgr_tmp);
+	}
 #else
 	grptr = getgrnam(grpname);
 #endif
Index: ruby_2_0_0/version.h
===================================================================
--- ruby_2_0_0/version.h	(revision 46510)
+++ ruby_2_0_0/version.h	(revision 46511)
@@ -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 493
+#define RUBY_PATCHLEVEL 494
 
 #define RUBY_RELEASE_YEAR 2014
 #define RUBY_RELEASE_MONTH 6

Property changes on: ruby_2_0_0
___________________________________________________________________
Modified: svn:mergeinfo
   Merged /trunk:r45288-45290


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

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