<html>
  <head>

    <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    I was recently working with stunnel on Solaris and ran across the
    following code in client.c:<br>
    <br>
                    putenv("LD_PRELOAD=" LIBDIR "/libstunnel.so");<br>
    <br>
    This appears to have been put in place to interpose a stunnel
    version of getpeername() on the downstream application.  This works
    great when libstunnel.so has the same bittedness as the downstream
    application, but Solaris allows users to install and run both 32 and
    64 bit applications on the same system.  If the stunnel exectuable
    is a 32 bit application and the downstream application is a 64 bit
    application, the runtime linker falls over because of the mismatch
    with the interposed library.  To avoid this problem, stunnel should
    use LD_PRELOAD_32 and LD_PRELOAD_64 on Solaris.  I have put together
    a patch to client.c that sets both LD_PRELOAD_* environment
    variables to something that seems to make sense on Solaris, but have
    used a fairly hacky way of enabling it when I build.  The client.c
    changes that I put together are:<br>
    <blockquote>
      <pre># On Solaris, fix stunnel so that the linker know where both the 32 and 64 bit
# interposer libraries are.  If you use LD_PRELOAD with the wrong bittedness
# of interposer, the runtime linker hits a fatal error in trying to load
# mismatched ELF objects.
#
diff -r -u stunnel-4.55.orig/src/client.c stunnel-4.55/src/client.c
--- stunnel-4.55.orig/src/client.c      2013-02-28 00:17:58.000000000 -0800
+++ stunnel-4.55/src/client.c   2013-03-21 22:55:21.098479331 -0700
@@ -1096,9 +1096,14 @@
             /* just don't set these variables if getnameinfo() fails */
             putenv(str_printf("REMOTE_HOST=%s", host));
             if(c->opt->option.transparent_src) {
-                putenv("LD_PRELOAD=" LIBDIR "/libstunnel.so");
-                /* for Tru64 _RLD_LIST is used instead */
+#ifdef MACH64
+                putenv("LD_PRELOAD_32=" LIBDIR "/libstunnel.so");
+                putenv("LD_PRELOAD_64=" LIBDIR "/" MACH64 "/libstunnel.so");
+#elif __osf /* for Tru64 _RLD_LIST is used instead */
                 putenv("_RLD_LIST=" LIBDIR "/libstunnel.so:DEFAULT");
+#else
+                putenv("LD_PRELOAD=" LIBDIR "/libstunnel.so");
+#endif
             }
         }
 
</pre>
    </blockquote>
    This adds more appropriate environment variables into the calling
    environment on Solaris.  It still needs some work to integrate
    better with the build.  Anyway, I thought that I would raise the
    issue and at least offer a direction to work from.  I am happy to
    work with someone on a better resolution to this.<br>
    <br>
        -Norm<br>
    <br>
  </body>
</html>