From: YOKOYAMA Takehiro Date: 2003-07-21T17:31:38+09:00 Subject: [ruby-list:37916] Re: control user ID / group ID In message "[ruby-list:37913] Re: control user ID / group ID", Hidetoshi NAGAI wrote at 21 Jul, 2003... >もし可能なら,samba 用の変更パッチを送っていただけると >どういう状況をどう修正しなければならなかったかの理解の >助けになるかと思います. >また,もし BSD/OS だけを特別扱いしなければならなくなった場合, >#if defined(????) には何を指定したら良いかも教えていただけませんか? sambaの場合に、具体的に問題になった部分は次の通りです。 #define USE_SETREUID 1 の場合に有効になる部分だけ抜き出しています。 lib/util_sec.c static void assert_gid(gid_t rgid, gid_t egid) { if ((egid != (gid_t)-1 && getegid() != egid) || (rgid != (gid_t)-1 && getgid() != rgid)) { if (!non_root_mode()) { DEBUG(0,("Failed to set gid privileges to (%d,%d) now set to (%d,%d) uid=(% d,%d)\n", (int)rgid, (int)egid, (int)getgid(), (int)getegid(), (int)getuid(), (int)geteuid())); smb_panic("failed to set gid\n"); exit(1); } } } restore_re_gid(void) { - setregid(saved_rgid, -1); - setregid(-1,saved_egid); + setgid(saved_rgid); + setegid(saved_egid); assert_gid(saved_rgid, saved_egid); } 初期化の過程で、saved_rgid = 0, saved_egid = 32766 (wheel/nogroup) の 状態でrestore_re_gid() が呼び出されたとき、setregid() が正常に動作しないため、 assert_gid()で Failed to set gid privileges to (0,32766) now set to (32766,32766) uid = (0,0) と表示され、終了してしまうのです。 restore_re_gid() を上記のように書き換えることにより、正常に動作するように なりました。ここでsetrgid()ではなくsetgid()を使っているのは、 man setrgidに非推奨と書いてあるからです。 これも他のOSとは異なる点だと思います。 実装上影響があるのはp_gid_exchange()ですね。 if (setregid(egid,gid) < 0) rb_sys_fail(0); の部分を if ((setgid(egid) < 0) || (setegid(gid) < 0)) rb_sys_fail(0); のように変更することになるのだと思います。 なお、BSD/OSだけ特別扱いする場合は、#if defined(__bsdi__) と 指定してください。 -- 横山岳浩 tac@amris.co.jp