mirror of
				https://github.com/osmarks/ngircd.git
				synced 2025-10-26 03:27:38 +00:00 
			
		
		
		
	Only setuid()/setgid() if it differs from current UID/GID.
Solves problems with Cygwin.
This commit is contained in:
		| @@ -12,7 +12,7 @@ | |||||||
|  |  | ||||||
| #include "portab.h" | #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 |  * @file | ||||||
| @@ -711,29 +711,35 @@ NGIRCd_Init( bool NGIRCd_NoDaemon ) | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if ( Conf_UID == 0 ) { | 	if (Conf_UID == 0) { | ||||||
| 		Log( LOG_INFO, "ServerUID must not be 0, switching to user nobody", Conf_UID ); | 		Log(LOG_INFO, "ServerUID must not be 0, using \"nobody\" instead.", Conf_UID); | ||||||
|  |  | ||||||
|   		if (!NGIRCd_getNobodyID(&Conf_UID, &Conf_GID )) { |   		if (! NGIRCd_getNobodyID(&Conf_UID, &Conf_GID)) { | ||||||
| 			Log( LOG_WARNING, "Could not get uid/gid of user nobody: %s", | 			Log(LOG_WARNING, "Could not get user/group ID of user \"nobody\": %s", | ||||||
| 					errno ? strerror(errno) : "not found" ); | 					errno ? strerror(errno) : "not found" ); | ||||||
| 			return false; | 			return false; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if( setgid( Conf_GID ) != 0 ) { | 	if (getgid() != Conf_GID) { | ||||||
|  | 		/* Change group ID */ | ||||||
|  | 		if (setgid(Conf_GID) != 0) { | ||||||
| 			real_errno = errno; | 			real_errno = errno; | ||||||
| 			Log( LOG_ERR, "Can't change group ID to %u: %s", Conf_GID, strerror( errno )); | 			Log( LOG_ERR, "Can't change group ID to %u: %s", Conf_GID, strerror( errno )); | ||||||
| 			if (real_errno != EPERM)  | 			if (real_errno != EPERM)  | ||||||
| 				return false; | 				return false; | ||||||
| 		} | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	if( setuid( Conf_UID ) != 0 ) { | 	if (getuid() != Conf_UID) { | ||||||
|  | 		/* Change user ID */ | ||||||
|  | 		if (setuid(Conf_UID) != 0) { | ||||||
| 			real_errno = errno; | 			real_errno = errno; | ||||||
| 		Log( LOG_ERR, "Can't change user ID to %u: %s", Conf_UID, strerror( errno )); | 			Log(LOG_ERR, "Can't change user ID to %u: %s", Conf_UID, strerror(errno)); | ||||||
| 			if (real_errno != EPERM)  | 			if (real_errno != EPERM)  | ||||||
| 				return false; | 				return false; | ||||||
| 		} | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	initialized = true; | 	initialized = true; | ||||||
|  |  | ||||||
| @@ -764,16 +770,14 @@ NGIRCd_Init( bool NGIRCd_NoDaemon ) | |||||||
|  |  | ||||||
| 	Pidfile_Create( pid ); | 	Pidfile_Create( pid ); | ||||||
|  |  | ||||||
| 	/* check uid we are running as, can be different from values configured (e.g. if we were already | 	/* Check UID/GID we are running as, can be different from values | ||||||
| 	started with a uid > 0 */ | 	 * configured (e. g. if we were already started with a UID>0. */ | ||||||
| 	Conf_UID = getuid(); | 	Conf_UID = getuid(); | ||||||
| 	Conf_GID = getgid(); | 	Conf_GID = getgid(); | ||||||
|  |  | ||||||
| 	assert( Conf_GID > 0); |  | ||||||
| 	assert( Conf_UID > 0); |  | ||||||
|  |  | ||||||
| 	pwd = getpwuid( Conf_UID ); | 	pwd = getpwuid( Conf_UID ); | ||||||
| 	grp = getgrgid( Conf_GID ); | 	grp = getgrgid( Conf_GID ); | ||||||
|  |  | ||||||
| 	Log( LOG_INFO, "Running as user %s(%ld), group %s(%ld), with PID %ld.", | 	Log( LOG_INFO, "Running as user %s(%ld), group %s(%ld), with PID %ld.", | ||||||
| 				pwd ? pwd->pw_name : "unknown", Conf_UID, | 				pwd ? pwd->pw_name : "unknown", Conf_UID, | ||||||
| 				grp ? grp->gr_name : "unknown", Conf_GID, pid); | 				grp ? grp->gr_name : "unknown", Conf_GID, pid); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Alexander Barton
					Alexander Barton