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ででるのか。放置でいいんだろうな。