diff --git a/src/sbbs3/ftpsrvr.c b/src/sbbs3/ftpsrvr.c index 91ac1347fa05a5d78ce10ca35d3dbdd780071001..41fe13bac947bc69a7a8297b64a9e96a2bebc9fd 100644 --- a/src/sbbs3/ftpsrvr.c +++ b/src/sbbs3/ftpsrvr.c @@ -63,6 +63,7 @@ #include "text.h" /* TOTAL_TEXT */ #include "ftpsrvr.h" #include "telnet.h" +#include "sbbscon.h" /* thread_suid_broken */ /* Constants */ @@ -4565,7 +4566,8 @@ void DLLCALL ftp_server(void* arg) startup=(ftp_startup_t*)arg; #ifdef _THREAD_SUID_BROKEN - startup->seteuid(TRUE); + if(thread_suid_broken) + startup->seteuid(TRUE); #endif if(startup==NULL) { diff --git a/src/sbbs3/mailsrvr.c b/src/sbbs3/mailsrvr.c index 5b75b1babf71420a755a98f1dfe5b26748f0d14c..f2693f529cac892ad069829da824a6281742dab1 100644 --- a/src/sbbs3/mailsrvr.c +++ b/src/sbbs3/mailsrvr.c @@ -66,6 +66,7 @@ #include "base64.h" #include "ini_file.h" #include "netwrap.h" /* getNameServerList() */ +#include "sbbscon.h" /* thread_suid_broken */ /* Constants */ #define FORWARD "forward:" @@ -4092,7 +4093,8 @@ void DLLCALL mail_server(void* arg) startup=(mail_startup_t*)arg; #ifdef _THREAD_SUID_BROKEN - startup->seteuid(TRUE); + if(thread_suid_broken) + startup->seteuid(TRUE); #endif if(startup==NULL) { diff --git a/src/sbbs3/main.cpp b/src/sbbs3/main.cpp index 7a004398a484522cfd34d6b234e26e11868d1af3..e3ac019d7f4ff71095d682e4349115ae912eb81d 100644 --- a/src/sbbs3/main.cpp +++ b/src/sbbs3/main.cpp @@ -38,6 +38,7 @@ #include "sbbs.h" #include "ident.h" #include "telnet.h" +#include "sbbscon.h" /* thread_suid_broken */ #ifdef __unix__ #include <sys/un.h> @@ -3796,7 +3797,8 @@ void DLLCALL bbs_thread(void* arg) } #ifdef _THREAD_SUID_BROKEN - startup->seteuid(TRUE); + if(thread_suid_broken) + startup->seteuid(TRUE); #endif /* Setup intelligent defaults */ diff --git a/src/sbbs3/sbbscon.c b/src/sbbs3/sbbscon.c index be5b61c3ad89f975afcadbdedcdb4746c1830a50..cf131b372dce38582d91da8c9d8f99680eb0db0f 100644 --- a/src/sbbs3/sbbscon.c +++ b/src/sbbs3/sbbscon.c @@ -51,6 +51,7 @@ #include "ftpsrvr.h" /* ftp_startup_t, ftp_server */ #include "mailsrvr.h" /* mail_startup_t, mail_server */ #include "services.h" /* services_startup_t, services_thread */ +#include "sbbscon.h" /* XPDEV headers */ #include "conwrap.h" /* kbhit/getch */ @@ -290,11 +291,6 @@ static BOOL do_seteuid(BOOL to_new) result=FALSE; } -#if defined(_THREAD_SUID_BROKEN) - SLEEP(5); - SLEEP(5); -#endif - pthread_mutex_unlock(&setid_mutex); if(!result) { @@ -310,11 +306,16 @@ static BOOL do_seteuid(BOOL to_new) BOOL do_setuid(BOOL force) { BOOL result=TRUE; -#if defined(DONT_BLAME_SYNCHRONET) || defined(_THREAD_SUID_BROKEN) +#if defined(DONT_BLAME_SYNCHRONET) if(!force) return(do_seteuid(TRUE)); #endif +#if defined(_THREAD_SUID_BROKEN) + if(thread_suid_broken && (!force)) + return(do_seteuid(TRUE)); +#endif + if(!setid_mutex_initialized) { pthread_mutex_init(&setid_mutex,NULL); setid_mutex_initialized=TRUE; @@ -383,6 +384,13 @@ static void thread_up(void* p, BOOL up, BOOL setuid) static pthread_mutex_t mutex; static BOOL mutex_initialized; +#ifdef _THREAD_SUID_BROKEN + if(thread_suid_broken && up && setuid) { + do_seteuid(FALSE); + do_setuid(FALSE); + } +#endif + if(!mutex_initialized) { pthread_mutex_init(&mutex,NULL); mutex_initialized=TRUE; @@ -390,13 +398,6 @@ static void thread_up(void* p, BOOL up, BOOL setuid) pthread_mutex_lock(&mutex); -#ifdef _THREAD_SUID_BROKEN - if(up && setuid) { - do_seteuid(FALSE); - do_setuid(FALSE); - } -#endif - if(up) thread_count++; else if(thread_count>0) @@ -489,8 +490,10 @@ static void bbs_started(void* p) bbs_running=TRUE; bbs_stopped=FALSE; #ifdef _THREAD_SUID_BROKEN - do_seteuid(FALSE); - do_setuid(FALSE); + if(thread_suid_broken) { + do_seteuid(FALSE); + do_setuid(FALSE); + } #endif } @@ -549,8 +552,10 @@ static void ftp_started(void* p) ftp_running=TRUE; ftp_stopped=FALSE; #ifdef _THREAD_SUID_BROKEN - do_seteuid(FALSE); - do_setuid(FALSE); + if(thread_suid_broken) { + do_seteuid(FALSE); + do_setuid(FALSE); + } #endif } @@ -605,8 +610,10 @@ static void mail_started(void* p) mail_running=TRUE; mail_stopped=FALSE; #ifdef _THREAD_SUID_BROKEN - do_seteuid(FALSE); - do_setuid(FALSE); + if(thread_suid_broken) { + do_seteuid(FALSE); + do_setuid(FALSE); + } #endif } @@ -661,8 +668,10 @@ static void services_started(void* p) services_running=TRUE; services_stopped=FALSE; #ifdef _THREAD_SUID_BROKEN - do_seteuid(FALSE); - do_setuid(FALSE); + if(thread_suid_broken) { + do_seteuid(FALSE); + do_setuid(FALSE); + } #endif } @@ -757,8 +766,10 @@ static void web_started(void* p) web_running=TRUE; web_stopped=FALSE; #ifdef _THREAD_SUID_BROKEN - do_seteuid(FALSE); - do_setuid(FALSE); + if(thread_suid_broken) + do_seteuid(FALSE); + do_setuid(FALSE); + } #endif } @@ -1021,6 +1032,9 @@ int main(int argc, char** argv) struct group* gr_entry; sigset_t sigs; #endif +#ifdef _THREAD_SUID_BROKEN + size_t conflen; +#endif #ifdef __QNX__ setlocale( LC_ALL, "C-TRADITIONAL" ); @@ -1593,6 +1607,17 @@ int main(int argc, char** argv) do_seteuid(TRUE); #endif +#ifdef _THREAD_SUID_BROKEN + /* check if we're using NPTL */ + conflen=confstr (_CS_GNU_LIBPTHREAD_VERSION, NULL, 0); + if (conflen > 0) { + char *buf = alloca (conflen); + confstr (_CS_GNU_LIBPTHREAD_VERSION, buf, conflen); + if (strstr (buf, "NPTL")) + thread_suid_broken=FALSE; + } +#endif + /* Install Ctrl-C/Break signal handler here */ #if defined(_WIN32) SetConsoleCtrlHandler(ControlHandler, TRUE /* Add */); @@ -1613,21 +1638,23 @@ int main(int argc, char** argv) if(new_uid_name[0]!=0) { /* check the user arg, if we have uid 0 */ /* Can't recycle servers (re-bind ports) as non-root user */ /* If DONT_BLAME_SYNCHRONET is set, keeps root credentials laying around */ -#if !defined(DONT_BLAME_SYNCHRONET) && !defined(_THREAD_SUID_BROKEN) - if(bbs_startup.telnet_port < IPPORT_RESERVED - || (bbs_startup.options & BBS_OPT_ALLOW_RLOGIN - && bbs_startup.rlogin_port < IPPORT_RESERVED)) - bbs_startup.options|=BBS_OPT_NO_RECYCLE; - if(ftp_startup.port < IPPORT_RESERVED) - ftp_startup.options|=FTP_OPT_NO_RECYCLE; - if(web_startup.port < IPPORT_RESERVED) - web_startup.options|=BBS_OPT_NO_RECYCLE; - if((mail_startup.options & MAIL_OPT_ALLOW_POP3 - && mail_startup.pop3_port < IPPORT_RESERVED) - || mail_startup.smtp_port < IPPORT_RESERVED) - mail_startup.options|=MAIL_OPT_NO_RECYCLE; - /* Perhaps a BBS_OPT_NO_RECYCLE_LOW option? */ - services_startup.options|=BBS_OPT_NO_RECYCLE; +#if !defined(DONT_BLAME_SYNCHRONET) + if(!thread_suid_broken) { + if(bbs_startup.telnet_port < IPPORT_RESERVED + || (bbs_startup.options & BBS_OPT_ALLOW_RLOGIN + && bbs_startup.rlogin_port < IPPORT_RESERVED)) + bbs_startup.options|=BBS_OPT_NO_RECYCLE; + if(ftp_startup.port < IPPORT_RESERVED) + ftp_startup.options|=FTP_OPT_NO_RECYCLE; + if(web_startup.port < IPPORT_RESERVED) + web_startup.options|=BBS_OPT_NO_RECYCLE; + if((mail_startup.options & MAIL_OPT_ALLOW_POP3 + && mail_startup.pop3_port < IPPORT_RESERVED) + || mail_startup.smtp_port < IPPORT_RESERVED) + mail_startup.options|=MAIL_OPT_NO_RECYCLE; + /* Perhaps a BBS_OPT_NO_RECYCLE_LOW option? */ + services_startup.options|=BBS_OPT_NO_RECYCLE; + } #endif } #endif diff --git a/src/sbbs3/sbbscon.h b/src/sbbs3/sbbscon.h new file mode 100644 index 0000000000000000000000000000000000000000..090111bd799dd501dd9effc4efb57e7ae7713662 --- /dev/null +++ b/src/sbbs3/sbbscon.h @@ -0,0 +1,10 @@ +#ifndef _SBBSCON_H_ +#define _SBBSCON_H_ + +#ifdef _THREAD_SUID_BROKEN +extern int thread_suid_broken; /* NPTL is no longer broken */ +#else +#define thread_suid_broken FALSE +#endif + +#endif diff --git a/src/sbbs3/services.c b/src/sbbs3/services.c index 399ca9f0bdecc48e4ea18579b90bb254623cbe04..e2228f69800e289538056f5d7a047d33b8f420f7 100644 --- a/src/sbbs3/services.c +++ b/src/sbbs3/services.c @@ -69,6 +69,7 @@ #include "services.h" #include "ident.h" /* identify() */ #include "sbbs_ini.h" +#include "sbbscon.h" /* thread_suid_broken */ /* Constants */ @@ -1642,7 +1643,8 @@ void DLLCALL services_thread(void* arg) } #ifdef _THREAD_SUID_BROKEN - startup->seteuid(TRUE); + if(thread_suid_broken) + startup->seteuid(TRUE); #endif /* Setup intelligent defaults */ diff --git a/src/sbbs3/websrvr.c b/src/sbbs3/websrvr.c index 85b66026d5118801a2ec6fd773be89bc32da67e6..74e1ebba30ef65e953836c064b35c39267226cda 100644 --- a/src/sbbs3/websrvr.c +++ b/src/sbbs3/websrvr.c @@ -65,6 +65,7 @@ #include "semwrap.h" #include "websrvr.h" #include "base64.h" +#include "sbbscon.h" /* thread_suid_broken */ static const char* server_name="Synchronet Web Server"; static const char* newline="\r\n"; @@ -4719,7 +4720,8 @@ void DLLCALL web_server(void* arg) } #ifdef _THREAD_SUID_BROKEN - startup->seteuid(TRUE); + if(thread_suid_broken) + startup->seteuid(TRUE); #endif /* Setup intelligent defaults */