Project

General

Profile

Actions

Bug #865

closed

1.4.3: src/util-print.c: Solaris doesn't have a s6_addr16

Added by Mark Solaris over 10 years ago. Updated over 6 years ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
-
Affected Versions:
Effort:
Difficulty:
Label:

Description

Solaris doesn't define s6_addr16 in the in6_addr struct. We need to work around that.

One interesting fix is used by the tor project:
https://svn.torproject.org/svn/tor/branches/tor-0_2_0-patches/src/common/compat.h

/* Apparently, MS and Solaris don't define s6_addr16 or s6_addr32. */
#ifdef HAVE_STRUCT_IN6_ADDR_S6_ADDR32
#define S6_ADDR32(x) ((uint32_t*)(x).s6_addr32)
#else
#define S6_ADDR32(x) ((uint32_t*)((char*)&(x).s6_addr))
#endif
#ifdef HAVE_STRUCT_IN6_ADDR_S6_ADDR16
#define S6_ADDR16(x) ((uint16_t*)(x).s6_addr16)
#else
#define S6_ADDR16(x) ((uint16_t*)((char*)&(x).s6_addr))
#endif

I'm not sure I enjoy reading that so I've elected to go a more portable approach, double stepping through 16 * s6_addr8 instead of 8 * s6_addr16

What a simplified in6_addr struct looks like:

struct in6_addr {
    union {
        uint8_t u6_addr8[16];
        uint16_t u6_addr16[8];
        uint32_t u6_addr32[4];
    } in6_u;
#define s6_addr in6_u.u6_addr8
#define s6_addr16 in6_u.u6_addr16
#define s6_addr32 in6_u.u6_addr32
};

Using that we can replicate what s6_addr16 does:

--- suricata-1.4.3/src/util-print.c.orig        Tue Jul  9 19:24:32 2013
+++ suricata-1.4.3/src/util-print.c     Tue Jul  9 19:25:03 2013
@@ -217,8 +217,8 @@
     return;
 }

-#ifndef s6_addr16
-# define s6_addr16 __u6_addr.__u6_addr16
+#if !defined(s6_addr16) && !defined(__sun)
+#    define s6_addr16 __u6_addr.__u6_addr16
 #endif

 static const char *PrintInetIPv6(const void *src, char *dst, socklen_t size)
@@ -225,6 +225,9 @@
 {
     struct in6_addr * insrc = (struct in6_addr *) src;
     int i;
+#if defined(__sun)
+    int sol_loc;
+#endif
     char s_part[6];

     /* current IPv6 format is fixed size */
@@ -234,7 +237,12 @@
     }
     memset(dst, 0, size);
     for(i = 0; i < 8; i++) {
+#if defined(__sun) /* Step through in different units as we don't have the non-standard s6_addr16 */
+        sol_loc = (i * 2); /* We use _S6_un._S6_u8 so we need to double step the pointer */
+        snprintf(s_part, 6, "%04x:", htons((uint16_t)insrc->s6_addr[sol_loc]));
+#else
         snprintf(s_part, 6, "%04x:", htons(insrc->s6_addr16[i]));
+#endif
         strlcat(dst, s_part, size);
     }
     /* suppress last ':' */

Actions #1

Updated by Victor Julien over 10 years ago

  • Target version set to TBD
Actions #2

Updated by Mark Solaris over 10 years ago

Issue still exists in master 2013-12-02

Actions #3

Updated by Andreas Herz over 8 years ago

  • Status changed from New to Closed
Actions #4

Updated by Victor Julien over 6 years ago

  • Target version deleted (TBD)
Actions

Also available in: Atom PDF