diff --git a/PLATFORMS.md b/PLATFORMS.md index 6f2c0deaf6..840af14b34 100644 --- a/PLATFORMS.md +++ b/PLATFORMS.md @@ -66,3 +66,4 @@ These are platforms on which BIND is known *not* to build or run: * Windows Server 2012 and older * Platforms that don't support IPv6 Advanced Socket API (RFC 3542) * Platforms that don't support atomic operations (via compiler or library) +* Linux without NPTL (Native POSIX Thread Library) diff --git a/acconfig.h b/acconfig.h index ee05bbc862..4b1304f273 100644 --- a/acconfig.h +++ b/acconfig.h @@ -23,9 +23,6 @@ /** define if sigwait() is the UnixWare flavor */ #undef HAVE_UNIXWARE_SIGWAIT -/** define if LinuxThreads is in use */ -#undef HAVE_LINUXTHREADS - /** define if sysconf() is available */ #undef HAVE_SYSCONF diff --git a/bin/named/unix/os.c b/bin/named/unix/os.c index 00052e8cf8..1571b88be9 100644 --- a/bin/named/unix/os.c +++ b/bin/named/unix/os.c @@ -68,7 +68,6 @@ static int singletonfd = -1; /* * Linux defines: - * (T) HAVE_LINUXTHREADS * (C) HAVE_SYS_CAPABILITY_H * (P) HAVE_SYS_PRCTL_H * The possible cases are: @@ -103,10 +102,6 @@ static int singletonfd = -1; * It will be nice when Linux threads work properly with setuid(). */ -#ifdef HAVE_LINUXTHREADS -static pid_t mainpid = 0; -#endif - static struct passwd *runas_pw = NULL; static bool done_setuid = false; static int dfd[2] = { -1, -1 }; @@ -201,7 +196,7 @@ linux_initialprivs(void) { */ SET_CAP(CAP_SYS_CHROOT); -#if defined(HAVE_SYS_PRCTL_H) || !defined(HAVE_LINUXTHREADS) +#if defined(HAVE_SYS_PRCTL_H) /* * We can setuid() only if either the kernel supports keeping * capabilities after setuid() (which we don't know until we've @@ -317,9 +312,6 @@ named_os_init(const char *progname) { #ifdef HAVE_SYS_CAPABILITY_H linux_initialprivs(); #endif -#ifdef HAVE_LINUXTHREADS - mainpid = getpid(); -#endif #ifdef SIGXFSZ signal(SIGXFSZ, SIG_IGN); #endif @@ -362,10 +354,6 @@ named_os_daemonize(void) { * We're the child. */ -#ifdef HAVE_LINUXTHREADS - mainpid = getpid(); -#endif - if (setsid() == -1) { strerror_r(errno, strbuf, sizeof(strbuf)); named_main_earlyfatal("setsid(): %s", strbuf); @@ -499,20 +487,6 @@ named_os_changeuser(void) { done_setuid = true; -#ifdef HAVE_LINUXTHREADS -#ifdef HAVE_SYS_CAPABILITY_H - if (!non_root_caps) { - named_main_earlyfatal("-u with Linux threads not supported: " - "requires kernel support for " - "prctl(PR_SET_KEEPCAPS)"); - } -#else - named_main_earlyfatal("-u with Linux threads not supported: " - "no capabilities support or capabilities " - "disabled at build time"); -#endif -#endif - if (setgid(runas_pw->pw_gid) < 0) { strerror_r(errno, strbuf, sizeof(strbuf)); named_main_earlyfatal("setgid(): %s", strbuf); @@ -534,7 +508,7 @@ named_os_changeuser(void) { strbuf); } #endif -#if defined(HAVE_SYS_CAPABILITY_H) && !defined(HAVE_LINUXTHREADS) +#if defined(HAVE_SYS_CAPABILITY_H) linux_minprivs(); #endif } @@ -548,7 +522,7 @@ ns_os_uid(void) { void named_os_adjustnofile(void) { -#ifdef HAVE_LINUXTHREADS +#if defined(__linux__) isc_result_t result; isc_resourcevalue_t newvalue; @@ -570,11 +544,7 @@ named_os_minprivs(void) { linux_keepcaps(); #endif -#ifdef HAVE_LINUXTHREADS - named_os_changeuser(); /* Call setuid() before threads are started */ -#endif - -#if defined(HAVE_SYS_CAPABILITY_H) && defined(HAVE_LINUXTHREADS) +#if defined(HAVE_SYS_CAPABILITY_H) linux_minprivs(); #endif } @@ -759,21 +729,16 @@ named_os_openfile(const char *filename, mode_t mode, bool switch_user) { free(f); if (switch_user && runas_pw != NULL) { -#ifndef HAVE_LINUXTHREADS gid_t oldgid = getgid(); -#endif /* Set UID/GID to the one we'll be running with eventually */ setperms(runas_pw->pw_uid, runas_pw->pw_gid); fd = safe_open(filename, mode, false); -#ifndef HAVE_LINUXTHREADS /* Restore UID/GID to root */ setperms(0, oldgid); -#endif /* HAVE_LINUXTHREADS */ if (fd == -1) { -#ifndef HAVE_LINUXTHREADS fd = safe_open(filename, mode, false); if (fd != -1) { named_main_earlywarning("Required root " @@ -786,13 +751,6 @@ named_os_openfile(const char *filename, mode_t mode, bool switch_user) { named_main_earlywarning("Please check file and " "directory permissions " "or reconfigure the filename."); -#else /* HAVE_LINUXTHREADS */ - named_main_earlywarning("Could not open " - "'%s'.", filename); - named_main_earlywarning("Please check file and " - "directory permissions " - "or reconfigure the filename."); -#endif /* HAVE_LINUXTHREADS */ } } else { fd = safe_open(filename, mode, false); @@ -846,11 +804,7 @@ named_os_writepidfile(const char *filename, bool first_time) { cleanup_pidfile(); return; } -#ifdef HAVE_LINUXTHREADS - pid = mainpid; -#else pid = getpid(); -#endif if (fprintf(fh, "%ld\n", (long)pid) < 0) { (*report)("fprintf() to pid file '%s' failed", filename); (void)fclose(fh); @@ -956,11 +910,7 @@ named_os_shutdownmsg(char *command, isc_buffer_t *text) { return; } -#ifdef HAVE_LINUXTHREADS - pid = mainpid; -#else pid = getpid(); -#endif (void)isc_buffer_printf(text, "pid: %ld", (long)pid); } diff --git a/config.h.in b/config.h.in index 0c5941ff64..c5283ae70e 100644 --- a/config.h.in +++ b/config.h.in @@ -23,9 +23,6 @@ /** define if sigwait() is the UnixWare flavor */ #undef HAVE_UNIXWARE_SIGWAIT -/** define if LinuxThreads is in use */ -#undef HAVE_LINUXTHREADS - /** define if sysconf() is available */ #undef HAVE_SYSCONF diff --git a/config.h.win32 b/config.h.win32 index fe881f50cd..15d42b928b 100644 --- a/config.h.win32 +++ b/config.h.win32 @@ -73,9 +73,6 @@ /* define on Solaris to get sigwait() to work using pthreads semantics */ /* #undef _POSIX_PTHREAD_SEMANTICS */ -/* define if LinuxThreads is in use */ -/* #undef HAVE_LINUXTHREADS */ - /* define if catgets() is available */ /* #undef HAVE_CATGETS */ diff --git a/configure b/configure index 41d04d9ce8..dda2137af9 100755 --- a/configure +++ b/configure @@ -15325,14 +15325,6 @@ fi ;; esac - ;; - # - # LinuxThreads requires some changes to the way we - # deal with signals. - # - *-linux*) - $as_echo "#define HAVE_LINUXTHREADS 1" >>confdefs.h - ;; esac diff --git a/configure.in b/configure.in index 29cb31ca6a..ce82ce1dc0 100644 --- a/configure.in +++ b/configure.in @@ -752,13 +752,6 @@ case "$host" in ;; esac ;; - # - # LinuxThreads requires some changes to the way we - # deal with signals. - # - *-linux*) - AC_DEFINE(HAVE_LINUXTHREADS) - ;; esac # Look for functions relating to thread naming diff --git a/lib/isc/unix/app.c b/lib/isc/unix/app.c index db82bdd6af..a02311f7fc 100644 --- a/lib/isc/unix/app.c +++ b/lib/isc/unix/app.c @@ -144,20 +144,6 @@ static struct { (void *)isc__app_unblock }; -#ifdef HAVE_LINUXTHREADS -/*! - * Linux has sigwait(), but it appears to prevent signal handlers from - * running, even if they're not in the set being waited for. This makes - * it impossible to get the default actions for SIGILL, SIGSEGV, etc. - * Instead of messing with it, we just use sigsuspend() instead. - */ -#undef HAVE_SIGWAIT -/*! - * We need to remember which thread is the main thread... - */ -static pthread_t main_thread; -#endif - #ifndef HAVE_SIGWAIT static void exit_action(int arg) { @@ -208,10 +194,6 @@ isc__app_ctxstart(isc_appctx_t *ctx0) { * Start an ISC library application. */ -#ifdef HAVE_LINUXTHREADS - main_thread = pthread_self(); -#endif /* HAVE_LINUXTHREADS */ - result = isc_mutex_init(&ctx->readylock); if (result != ISC_R_SUCCESS) return (result); @@ -388,10 +370,6 @@ isc__app_ctxrun(isc_appctx_t *ctx0) { REQUIRE(VALID_APPCTX(ctx)); -#ifdef HAVE_LINUXTHREADS - REQUIRE(main_thread == pthread_self()); -#endif - LOCK(&ctx->lock); if (!ctx->running) { @@ -564,23 +542,6 @@ isc__app_ctxshutdown(isc_appctx_t *ctx0) { /* BIND9 internal, but using multiple contexts */ ctx->want_shutdown = true; else { -#ifdef HAVE_LINUXTHREADS - if (isc_bind9) { - /* BIND9 internal, single context */ - int result; - - result = pthread_kill(main_thread, SIGTERM); - if (result != 0) { - strerror_r(result, - strbuf, sizeof(strbuf)); - UNEXPECTED_ERROR(__FILE__, __LINE__, - "isc_app_shutdown() " - "pthread_kill: %s", - strbuf); - return (ISC_R_UNEXPECTED); - } - } -#else if (isc_bind9) { /* BIND9 internal, single context */ if (kill(getpid(), SIGTERM) < 0) { @@ -592,7 +553,6 @@ isc__app_ctxshutdown(isc_appctx_t *ctx0) { return (ISC_R_UNEXPECTED); } } -#endif /* HAVE_LINUXTHREADS */ else { /* External, multiple contexts */ LOCK(&ctx->readylock); @@ -637,23 +597,6 @@ isc__app_ctxsuspend(isc_appctx_t *ctx0) { ctx->want_reload = true; else { ctx->want_reload = true; -#ifdef HAVE_LINUXTHREADS - if (isc_bind9) { - /* BIND9 internal, single context */ - int result; - - result = pthread_kill(main_thread, SIGHUP); - if (result != 0) { - strerror_r(result, - strbuf, sizeof(strbuf)); - UNEXPECTED_ERROR(__FILE__, __LINE__, - "isc_app_reload() " - "pthread_kill: %s", - strbuf); - return (ISC_R_UNEXPECTED); - } - } -#else if (isc_bind9) { /* BIND9 internal, single context */ if (kill(getpid(), SIGHUP) < 0) { @@ -665,7 +608,6 @@ isc__app_ctxsuspend(isc_appctx_t *ctx0) { return (ISC_R_UNEXPECTED); } } -#endif /* HAVE_LINUXTHREADS */ else { /* External, multiple contexts */ LOCK(&ctx->readylock);