diff --git a/src/sbbs3/sbbscon.c b/src/sbbs3/sbbscon.c index 46333e5c9cd81181851d1295b836d7f8c71187f1..8cc1a844411b2851e329eb5e50bb38a9f81819c7 100644 --- a/src/sbbs3/sbbscon.c +++ b/src/sbbs3/sbbscon.c @@ -52,11 +52,6 @@ #include <stdarg.h> #include <stdlib.h> /* Is this included from somewhere else? */ -#ifndef __FreeBSD__ -#include <fcntl.h> /* Used for daemonizing */ -#include <paths.h> /* Used for daemonizing */ -#endif - #endif /* Constants */ @@ -197,9 +192,9 @@ static BOOL do_setuid(void) { BOOL result=FALSE; - setegid(old_gid); - seteuid(old_uid); - if(!setgid(new_gid) && !setuid(new_uid)) + setregid(-1,old_gid); + setreuid(-1,old_uid); + if(!setregid(new_gid,new_gid) && !setreuid(new_uid,new_uid)) result=TRUE; if(!result) { @@ -229,12 +224,12 @@ static BOOL do_seteuid(BOOL to_new) pthread_mutex_lock(&mutex); if(to_new) - if(!setegid(new_gid) && !seteuid(new_uid)) + if(!setregid(-1,new_gid) && !setreuid(-1,new_uid)) result=TRUE; else result=FALSE; else - if(!setegid(old_gid) && !seteuid(old_uid)) + if(!setregid(-1,old_gid) && !setreuid(-1,old_uid)) result=TRUE; else result=FALSE; @@ -250,11 +245,18 @@ static BOOL do_seteuid(BOOL to_new) } #endif /* __unix__ */ -static void thread_up(BOOL up) +static void thread_up(BOOL up, BOOL setuid) { static pthread_mutex_t mutex; static BOOL mutex_initialized; +#ifdef _THREAD_SUID_BROKEN + if(up && setuid) { + do_seteuid(FALSE); + do_setuid(); + } +#endif + if(!mutex_initialized) { pthread_mutex_init(&mutex,NULL); mutex_initialized=TRUE; @@ -350,6 +352,10 @@ static void bbs_started(void) { bbs_running=TRUE; bbs_stopped=FALSE; + #ifdef _THREAD_SUID_BROKEN + do_seteuid(FALSE); + do_setuid(); + #endif } static void bbs_terminated(int code) @@ -400,6 +406,10 @@ static void ftp_started(void) { ftp_running=TRUE; ftp_stopped=FALSE; + #ifdef _THREAD_SUID_BROKEN + do_seteuid(FALSE); + do_setuid(); + #endif } static void ftp_terminated(int code) @@ -450,6 +460,10 @@ static void mail_started(void) { mail_running=TRUE; mail_stopped=FALSE; + #ifdef _THREAD_SUID_BROKEN + do_seteuid(FALSE); + do_setuid(); + #endif } static void mail_terminated(int code) @@ -500,6 +514,10 @@ static void services_started(void) { services_running=TRUE; services_stopped=FALSE; + #ifdef _THREAD_SUID_BROKEN + do_seteuid(FALSE); + do_setuid(); + #endif } static void services_terminated(int code) @@ -566,6 +584,7 @@ void _sighandler_quit(int sig) exit(0); } +#if 0 // Apparently, Linux hasa daemon call too! #ifndef __FreeBSD__ /****************************************************************************/ /* Daemonizes the process */ @@ -601,6 +620,7 @@ daemon(nochdir, noclose) return (0); } #endif /* !__FreeBSD__ */ +#endif /* 0 */ #endif /* __unix__ */ @@ -1058,6 +1078,7 @@ int main(int argc, char** argv) fclose(pidfile); } } + #endif _beginthread((void(*)(void*))bbs_thread,0,&bbs_startup);