From: Kazuhiro NISHIYAMA Date: 2006-08-11T02:13:23+09:00 Subject: Re: [ ruby-Bugs-5351 ] Process.gid= fails on OS X >>>>> On Wed, 9 Aug 2006 12:31:07 +0900 >>>>> nobu@ruby-lang.org said: > > > -#elif defined HAVE_SETREUID > > +#elif defined(HAVE_SETREUID) && !defined(OBSOLETE_SETREUID) > > They all should be BROKEN_SETREUID, but not OBSOLETE_SETREUID, > sorry. I tried patch with debug print, s/OBSOLETE_SETREUID/BROKEN_SETREUID/g, s/OBSOLETE_SETREUID/BROKEN_SETREUID/g and s/GIDTYPE/rb_gid_t/, but failed yet. Mac-mini:~ kazu$ sudo ~/opt/ruby18/bin/ruby -ve 'Process.gid=502' ruby 1.8.5 (2006-08-09) [powerpc-darwin8.7.0] /Users/kazu/wc/ruby-lang/ruby_1_8/process.c:2494 /Users/kazu/wc/ruby-lang/ruby_1_8/process.c:2503 -e:1:in `gid=': Operation not permitted (Errno::EPERM) from -e:1 Mac-mini:~ kazu$ Index: process.c =================================================================== RCS file: /src/ruby/process.c,v retrieving revision 1.92.2.33 diff -u -p -r1.92.2.33 process.c --- process.c 25 Jul 2006 04:58:15 -0000 1.92.2.33 +++ process.c 10 Aug 2006 17:09:15 -0000 @@ -2122,7 +2122,7 @@ proc_setuid(obj, id) check_uid_switch(); #if defined(HAVE_SETRESUID) && !defined(__CHECKER__) if (setresuid(uid, -1, -1) < 0) rb_sys_fail(0); -#elif defined HAVE_SETREUID +#elif defined(HAVE_SETREUID) && !defined(BROKEN_SETREUID) if (setreuid(uid, -1) < 0) rb_sys_fail(0); #elif defined HAVE_SETRUID if (setruid(uid) < 0) rb_sys_fail(0); @@ -2491,14 +2491,19 @@ proc_setgid(obj, id) { int gid = NUM2INT(id); +printf("%s:%d\n", __FILE__, __LINE__); check_gid_switch(); #if defined(HAVE_SETRESGID) && !defined(__CHECKER__) +printf("%s:%d\n", __FILE__, __LINE__); if (setresgid(gid, -1, -1) < 0) rb_sys_fail(0); -#elif defined HAVE_SETREGID +#elif defined(HAVE_SETREGID) && !defined(BROKEN_SETREGID) +printf("%s:%d\n", __FILE__, __LINE__); if (setregid(gid, -1) < 0) rb_sys_fail(0); #elif defined HAVE_SETRGID - if (setrgid((GIDTYPE)gid) < 0) rb_sys_fail(0); +printf("%s:%d\n", __FILE__, __LINE__); + if (setrgid((rb_gid_t)gid) < 0) rb_sys_fail(0); #elif defined HAVE_SETGID +printf("%s:%d\n", __FILE__, __LINE__); { if (getegid() == gid) { if (setgid(gid) < 0) rb_sys_fail(0); @@ -2508,8 +2513,10 @@ proc_setgid(obj, id) } } #else +printf("%s:%d\n", __FILE__, __LINE__); rb_notimplement(); #endif +printf("%s:%d\n", __FILE__, __LINE__); return INT2FIX(gid); } @@ -2894,7 +2901,7 @@ proc_seteuid(obj, euid) check_uid_switch(); #if defined(HAVE_SETRESUID) && !defined(__CHECKER__) if (setresuid(-1, NUM2INT(euid), -1) < 0) rb_sys_fail(0); -#elif defined HAVE_SETREUID +#elif defined(HAVE_SETREUID) && !defined(BROKEN_SETREUID) if (setreuid(-1, NUM2INT(euid)) < 0) rb_sys_fail(0); #elif defined HAVE_SETEUID if (seteuid(NUM2INT(euid)) < 0) rb_sys_fail(0); @@ -3008,7 +3015,7 @@ proc_setegid(obj, egid) #if defined(HAVE_SETRESGID) && !defined(__CHECKER__) if (setresgid(-1, NUM2INT(egid), -1) < 0) rb_sys_fail(0); -#elif defined HAVE_SETREGID +#elif defined(HAVE_SETREGID) && !defined(BROKEN_SETREGID) if (setregid(-1, NUM2INT(egid)) < 0) rb_sys_fail(0); #elif defined HAVE_SETEGID if (setegid(NUM2INT(egid)) < 0) rb_sys_fail(0); Mac-mini:~ kazu$ cat setrgid-test.c #include #include int main() { printf("%d\n", getgid()); printf("%d\n", setrgid(0)); perror("setrgid(0)"); printf("%d\n", getgid()); printf("%d\n", setrgid(502)); perror("setrgid(502)"); printf("%d\n", getgid()); return 0; } Mac-mini:~ kazu$ gcc setrgid-test.c Mac-mini:~ kazu$ sudo ./a.out 0 0 setrgid(0): Unknown error: 0 0 -1 setrgid(502): Operation not permitted 0 Mac-mini:~ kazu$ -- |ZnZ |Kazuhiro NISHIYAMA