--- server/main.c.orig Wed Nov 27 01:26:42 1996 +++ server/main.c Mon Nov 19 20:49:24 2001 @@ -57,6 +57,7 @@ #include #include #include +#include #include "IR.h" #include "net.h" @@ -82,6 +83,8 @@ #ifdef USE_UNIX_SOCKET extern struct sockaddr_un unsock; #endif + struct passwd *pw; + uid_t binuid; /* サーバを子プロセス(デーモン)として起動する */ parentid = BecomeDaemon(argc, argv); @@ -114,9 +117,21 @@ exit(2); } + if ( (pw = getpwnam(cannaOwner)) == NULL ) { + fprintf(stderr, "User %s unknown\n", cannaOwner); + exit(1); + } + /* エラー出力の切り替え、TTYの切り離し */ if (parentid) kill(parentid, SIGTERM); DetachTTY(); + + /* Drop root privilege. */ + binuid = pw->pw_uid; + if ( setuid(binuid) < 0 ) { + fprintf(stderr, "Unable to setuid to %s(UID: %s).\n", cannaOwner, binuid); + exit(1); + } /* ディスパッチループ */ Dispatch() ;