summaryrefslogtreecommitdiffstats
path: root/secure
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2014-04-27 05:28:14 +0000
committerkib <kib@FreeBSD.org>2014-04-27 05:28:14 +0000
commit3ae13c8b20856f1003f3e26ee1e578bfeff024e3 (patch)
treeff3a5900e9bcb50ccaec70f614248a865a181025 /secure
parentc36743d23f1edd16b34eabb0153f27f5f763ce0f (diff)
downloadFreeBSD-src-3ae13c8b20856f1003f3e26ee1e578bfeff024e3.zip
FreeBSD-src-3ae13c8b20856f1003f3e26ee1e578bfeff024e3.tar.gz
Fix order of libthr and libc in the global dso list for sshd, by
explicitely linking main binary with -lpthread. Before, libthr appeared in the list due to dependency of one of the kerberos libs. Due to the change in ld(1) behaviour of not copying NEEDED entries from direct dependencies into the link results, the order becomes reversed. The libthr must appear before libc to properly interpose libc symbols and provide working rtld locks implementation. The symptom was sshd hanging on rtld bind lock during nested symbol binding from a signal handler. Approved by: des (openssh maintainer) Sponsored by: The FreeBSD Foundation MFC after: 1 week
Diffstat (limited to 'secure')
-rw-r--r--secure/usr.sbin/sshd/Makefile10
1 files changed, 10 insertions, 0 deletions
diff --git a/secure/usr.sbin/sshd/Makefile b/secure/usr.sbin/sshd/Makefile
index 4f730a9..e1c71a3 100644
--- a/secure/usr.sbin/sshd/Makefile
+++ b/secure/usr.sbin/sshd/Makefile
@@ -57,6 +57,16 @@ CFLAGS+= -DNONE_CIPHER_ENABLED
DPADD+= ${LIBCRYPT} ${LIBCRYPTO} ${LIBZ}
LDADD+= -lcrypt -lcrypto -lz
+# Fix the order of NEEDED entries for libthr and libc. The libthr
+# needs to interpose libc symbols, leaving the libthr loading as
+# dependency of krb causes reversed order and broken interposing. Put
+# the threading library last on the linker command line, just before
+# the -lc added by a compiler driver.
+.if ${MK_KERBEROS_SUPPORT} != "no"
+DPADD+= ${LIBPTHREAD}
+LDADD+= -lpthread
+.endif
+
.if defined(LOCALBASE)
CFLAGS+= -DXAUTH_PATH=\"${LOCALBASE}/bin/xauth\"
.endif
OpenPOWER on IntegriCloud