svn commit: r265003 - head/secure/usr.sbin/sshd

Konstantin Belousov kostikbel at gmail.com
Wed Aug 20 15:13:24 UTC 2014


On Wed, Aug 20, 2014 at 04:41:05PM +0200, Roger Pau Monn?? wrote:
> On 27/04/14 07:28, Konstantin Belousov wrote:
> > Author: kib
> > Date: Sun Apr 27 05:28:14 2014
> > New Revision: 265003
> > URL: http://svnweb.freebsd.org/changeset/base/265003
> > 
> > Log:
> >   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
> > 
> > Modified:
> >   head/secure/usr.sbin/sshd/Makefile
> > 
> > Modified: head/secure/usr.sbin/sshd/Makefile
> > ==============================================================================
> > --- head/secure/usr.sbin/sshd/Makefile	Sun Apr 27 05:19:01 2014	(r265002)
> > +++ head/secure/usr.sbin/sshd/Makefile	Sun Apr 27 05:28:14 2014	(r265003)
> > @@ -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
> 
> Hello,
> 
> This change makes the following simple test program fail on the second 
> assert. The problem is that sa_handler == SIG_DFL, and sa_flags == 
> SA_SIGINFO, which according to the sigaction(9) man page is not 
> possible. With this change reverted the test is successful.
I do not quite follow.

What are the relations between sshd and your test program ?
Should the test be run somehow specially ?

> 
> ---
> #include <signal.h>
> #include <string.h>
> #include <assert.h>
> 
> int main(int argn, char **argv)
> {
>         struct sigaction new, old;
>         int rc;
> 
>         memset(&new, 0, sizeof(new));
>         memset(&old, 0, sizeof(old));
> 
>         sigemptyset(&new.sa_mask);
>         new.sa_handler = SIG_DFL;
>         new.sa_flags = 0;
> 
>         rc = sigaction(SIGCHLD, &new, &old);
>         assert(rc == 0);
>         assert((old.sa_handler == SIG_DFL || old.sa_handler == SIG_IGN) &&
>                 !(old.sa_flags & SA_SIGINFO));
> 
>         return (0);
> }
> 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://lists.freebsd.org/pipermail/svn-src-head/attachments/20140820/5acf027f/attachment.sig>


More information about the svn-src-head mailing list