commit 8916b201fa19c9ace46ca1d39e959d0d1aff6a27 from: Alexander Barton date: Fri Jul 08 23:19:20 2005 UTC Only setuid()/setgid() if it differs from current UID/GID. Solves problems with Cygwin. commit - ead79d3e39954ca8eed73f45cfc30287da79d46a commit + 8916b201fa19c9ace46ca1d39e959d0d1aff6a27 blob - 985d09a9fe8beae2dae1fa00ba8197e8cfced8f9 blob + d774f791de614e811f7bf5e8e1a9b19cfad9160c --- src/ngircd/ngircd.c +++ src/ngircd/ngircd.c @@ -12,7 +12,7 @@ #include "portab.h" -static char UNUSED id[] = "$Id: ngircd.c,v 1.105 2005/07/08 21:04:39 alex Exp $"; +static char UNUSED id[] = "$Id: ngircd.c,v 1.106 2005/07/08 23:19:20 alex Exp $"; /** * @file @@ -711,28 +711,34 @@ NGIRCd_Init( bool NGIRCd_NoDaemon ) } } - if ( Conf_UID == 0 ) { - Log( LOG_INFO, "ServerUID must not be 0, switching to user nobody", Conf_UID ); + if (Conf_UID == 0) { + Log(LOG_INFO, "ServerUID must not be 0, using \"nobody\" instead.", Conf_UID); - if (!NGIRCd_getNobodyID(&Conf_UID, &Conf_GID )) { - Log( LOG_WARNING, "Could not get uid/gid of user nobody: %s", + if (! NGIRCd_getNobodyID(&Conf_UID, &Conf_GID)) { + Log(LOG_WARNING, "Could not get user/group ID of user \"nobody\": %s", errno ? strerror(errno) : "not found" ); return false; } } - if( setgid( Conf_GID ) != 0 ) { - real_errno = errno; - Log( LOG_ERR, "Can't change group ID to %u: %s", Conf_GID, strerror( errno )); - if (real_errno != EPERM) - return false; + if (getgid() != Conf_GID) { + /* Change group ID */ + if (setgid(Conf_GID) != 0) { + real_errno = errno; + Log( LOG_ERR, "Can't change group ID to %u: %s", Conf_GID, strerror( errno )); + if (real_errno != EPERM) + return false; + } } - if( setuid( Conf_UID ) != 0 ) { - real_errno = errno; - Log( LOG_ERR, "Can't change user ID to %u: %s", Conf_UID, strerror( errno )); - if (real_errno != EPERM) - return false; + if (getuid() != Conf_UID) { + /* Change user ID */ + if (setuid(Conf_UID) != 0) { + real_errno = errno; + Log(LOG_ERR, "Can't change user ID to %u: %s", Conf_UID, strerror(errno)); + if (real_errno != EPERM) + return false; + } } initialized = true; @@ -764,16 +770,14 @@ NGIRCd_Init( bool NGIRCd_NoDaemon ) Pidfile_Create( pid ); - /* check uid we are running as, can be different from values configured (e.g. if we were already - started with a uid > 0 */ + /* Check UID/GID we are running as, can be different from values + * configured (e. g. if we were already started with a UID>0. */ Conf_UID = getuid(); Conf_GID = getgid(); - assert( Conf_GID > 0); - assert( Conf_UID > 0); - pwd = getpwuid( Conf_UID ); grp = getgrgid( Conf_GID ); + Log( LOG_INFO, "Running as user %s(%ld), group %s(%ld), with PID %ld.", pwd ? pwd->pw_name : "unknown", Conf_UID, grp ? grp->gr_name : "unknown", Conf_GID, pid);