Re: SASL 2.1.27 pre-release 1

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]


Rather than stealing a bunch of per-platform #ifdefs from Apple, I'm wondering if this simple typecast would work. This would essentially be doing the same thing that happens on those platforms that use a union inside struct in6_addr.

diff --git a/plugins/plugin_common.c b/plugins/plugin_common.c
index f2b26bd..1d633ee 100644
--- a/plugins/plugin_common.c
+++ b/plugins/plugin_common.c
@@ -94,7 +94,7 @@ static void sockaddr_unmapped(
     if (!IN6_IS_ADDR_V4MAPPED((&sin6->sin6_addr)))
     sin4 = (struct sockaddr_in *)sa;
-    addr = *(uint32_t *)&sin6->sin6_addr.s6_addr32[3];
+    addr = *(uint32_t *)&sin6->sin6_addr.s6_addr[12];
     port = sin6->sin6_port;
     memset(sin4, 0, sizeof(struct sockaddr_in));
     sin4->sin_addr.s_addr = addr;

On 11/25/2016 04:21 PM, Julien ÉLIE via Cyrus-sasl wrote:
Hi Ken,

Can you try this patch for OSX:

diff --git a/plugins/plugin_common.c b/plugins/plugin_common.c
index f2b26bd..1211fea 100644
--- a/plugins/plugin_common.c
+++ b/plugins/plugin_common.c
@@ -88,6 +88,10 @@ static void sockaddr_unmapped(
     uint32_t addr;
     int port;

+#if defined(__FreeBSD__) && !defined(s6_addr32)
+#define s6_addr32 __u6_addr.__u6_addr32
     if (sa->sa_family != AF_INET6)
     sin6 = (struct sockaddr_in6 *)sa;

It works with "defined(__APPLE__)" instead of "defined(__FreeBSD__)".

Yet, I found out there probably a better patch to integrate into Cyrus SASL:

 * Oh, the wonderful world of IPv6 compatibility.  Apparently some
 * implementations expose the (more logical) 32-bit address parts
 * to everyone, while others only expose it to kernel code...  To
 * make supporting IPv6 even easier, each vendor chose different
 * core structure and union names, so the same defines or code
 * can't be used on all platforms.
 * The following will likely need tweaking on new platforms that
 * support IPv6 - the "s6_addr32" define maps to the 32-bit integer
 * array in the in6_addr union, which is named differently on various
 * platforms.

#if defined(AF_INET6) && !defined(s6_addr32)
#  if defined(__sun)
#    define s6_addr32    _S6_un._S6_u32
# elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__APPLE__)
#    define s6_addr32    __u6_addr.__u6_addr32
#  elif defined(__osf__)
#    define s6_addr32    s6_un.sa6_laddr
#  elif defined(WIN32)
 * Windows only defines byte and 16-bit word members of the union and
 * requires special casing of all raw address code...
#    define s6_addr32    error_need_win32_specific_code
#  endif /* __sun */
#endif /* AF_INET6 && !s6_addr32 */

Yet, I now obtain the following error:

/bin/sh ../libtool --tag=CC --mode=link gcc -Wall -W -g -O2 -o -lresolv -lresolv
libtool: link: ar cru .libs/libobj.a
ar: no archive members specified
usage:  ar -d [-TLsv] archive file ...
    ar -m [-TLsv] archive file ...
    ar -m [-abiTLsv] position archive file ...
    ar -p [-TLsv] archive [file ...]
    ar -q [-cTLsv] archive file ...
    ar -r [-cuTLsv] archive file ...
    ar -r [-abciuTLsv] position archive file ...
    ar -t [-TLsv] archive [file ...]
    ar -x [-ouTLsv] archive [file ...]
make[3]: *** [] Error 1

Maybe caused by "noinst_LTLIBRARIES" not properly defined?

Kenneth Murchison
Principal Systems Software Engineer
Carnegie Mellon University

[Index of Archives]     [Info Cyrus]     [Squirrel Mail]     [Linux Media]     [Yosemite News]     [gtk]     [KDE]     [Gimp on Windows]     [Steve's Art]

  Powered by Linux