warning
gcc -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-parentheses -Wpointer-arith -Wwrite-strings -Wno-missing-field-initializers -Wno-long-long -fPIC -I. -I.ext/include/i686-linux -I../ruby_1_9_2/include -I../ruby_1_9_2 -DRUBY_EXPORT -o process.o -c ../ruby_1_9_2/process.c ../ruby_1_9_2/process.c: In function ‘p_uid_change_privilege’: ../ruby_1_9_2/process.c:4111: 警告: 条件式に符合付き型と符合無し型とがあります ../ruby_1_9_2/process.c:4112: 警告: 条件式に符合付き型と符合無し型とがあります ../ruby_1_9_2/process.c:4113: 警告: 条件式に符合付き型と符合無し型とがあります ../ruby_1_9_2/process.c: In function ‘p_gid_change_privilege’: ../ruby_1_9_2/process.c:4730: 警告: 条件式に符合付き型と符合無し型とがあります ../ruby_1_9_2/process.c:4731: 警告: 条件式に符合付き型と符合無し型とがあります ../ruby_1_9_2/process.c:4732: 警告: 条件式に符合付き型と符合無し型とがあります
調べてみた。
% cat -n ../ruby_1_9_2/process.c|egrep '411[123]|473[012]' 4111 if (setresuid((getuid() == uid)? -1: uid, 4112 (geteuid() == uid)? -1: uid, 4113 (SAVED_USER_ID == uid)? -1: uid) < 0) rb_sys_fail(0); 4730 if (setresgid((getgid() == gid)? -1: gid, 4731 (getegid() == gid)? -1: gid, 4732 (SAVED_GROUP_ID == gid)? -1: gid) < 0) rb_sys_fail(0);
条件式に。っていうからてっきりgetuid() == uidの部分とか思ったけど、そういう意味じゃなかった。uidがunsigned intで、-1がsignedだから条件によって違うのが返るよということらしい。たぶん。で、setresuid()のmanをみると、" If one of the parameters equals -1, the corresponding value is not changed."ってかいてある。
int setresuid(uid_t ruid, uid_t euid, uid_t suid);
なのに。関数は32bitだったら0xffffffffをうけとるんだから、それにすればいいのかな。64bitだとどうなるんだろ?あ、uid_tのサイズがかわらないならそれでいいのかな。
とりあえず、ruby ../ruby_1_9_2/test/ruby/test_process.rb は全部通った。しかし、全然自信がない。
Index: process.c =================================================================== --- process.c (revision 28878) +++ process.c (working copy) @@ -4108,16 +4108,16 @@ #endif } else { /* unprivileged user */ #if defined(HAVE_SETRESUID) - if (setresuid((getuid() == uid)? -1: uid, - (geteuid() == uid)? -1: uid, - (SAVED_USER_ID == uid)? -1: uid) < 0) rb_sys_fail(0); + if (setresuid((getuid() == uid)? 0xffffffff: uid, + (geteuid() == uid)? 0xffffffff: uid, + (SAVED_USER_ID == uid)? 0xffffffff: uid) < 0) rb_sys_fail(0); SAVED_USER_ID = uid; #elif defined(HAVE_SETREUID) && !defined(OBSOLETE_SETREUID) if (SAVED_USER_ID == uid) { - if (setreuid((getuid() == uid)? -1: uid, - (geteuid() == uid)? -1: uid) < 0) rb_sys_fail(0); + if (setreuid((getuid() == uid)? 0xffffffff: uid, + (geteuid() == uid)? 0xffffffff: uid) < 0) rb_sys_fail(0); } else if (getuid() != uid) { - if (setreuid(uid, (geteuid() == uid)? -1: uid) < 0) rb_sys_fail(0); + if (setreuid(uid, (geteuid() == uid)? 0xffffffff: uid) < 0) rb_sys_fail(0); SAVED_USER_ID = uid; } else if (/* getuid() == uid && */ geteuid() != uid) { if (setreuid(geteuid(), uid) < 0) rb_sys_fail(0); @@ -4727,16 +4727,16 @@ #endif } else { /* unprivileged user */ #if defined(HAVE_SETRESGID) - if (setresgid((getgid() == gid)? -1: gid, - (getegid() == gid)? -1: gid, - (SAVED_GROUP_ID == gid)? -1: gid) < 0) rb_sys_fail(0); + if (setresgid((getgid() == gid)? 0xffffffff: gid, + (getegid() == gid)? 0xffffffff: gid, + (SAVED_GROUP_ID == gid)? 0xffffffff: gid) < 0) rb_sys_fail(0); SAVED_GROUP_ID = gid; #elif defined(HAVE_SETREGID) && !defined(OBSOLETE_SETREGID) if (SAVED_GROUP_ID == gid) { - if (setregid((getgid() == gid)? -1: gid, - (getegid() == gid)? -1: gid) < 0) rb_sys_fail(0); + if (setregid((getgid() == gid)? 0xffffffff: gid, + (getegid() == gid)? 0xffffffff: gid) < 0) rb_sys_fail(0); } else if (getgid() != gid) { - if (setregid(gid, (getegid() == gid)? -1: gid) < 0) rb_sys_fail(0); + if (setregid(gid, (getegid() == gid)? 0xffffffff: gid) < 0) rb_sys_fail(0); SAVED_GROUP_ID = gid; } else if (/* getgid() == gid && */ getegid() != gid) { if (setregid(getegid(), gid) < 0) rb_sys_fail(0);
- Wextraででるのか。放置でいいんだろうな。