From 8916b201fa19c9ace46ca1d39e959d0d1aff6a27 Mon Sep 17 00:00:00 2001 From: Alexander Barton Date: Fri, 8 Jul 2005 23:19:20 +0000 Subject: [PATCH] Only setuid()/setgid() if it differs from current UID/GID. Solves problems with Cygwin. --- src/ngircd/ngircd.c | 44 ++++++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/src/ngircd/ngircd.c b/src/ngircd/ngircd.c index 985d09a9..d774f791 100644 --- a/src/ngircd/ngircd.c +++ b/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);