]> git.ipfire.org Git - thirdparty/ulogd2.git/commitdiff
cleanup for key builder and fix IPv6 support and introduce 128-bits type
authorPablo Neira Ayuso <pablo@netfilter.org>
Sun, 1 Jun 2008 23:38:33 +0000 (01:38 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Sun, 1 Jun 2008 23:38:33 +0000 (01:38 +0200)
This patch cleans up the key building by breaking lines at 80 columns and
it fixes the IPv6 support (use of a pointer after free) by introducing a new
128 bit type.

filter/ulogd_filter_IP2BIN.c
filter/ulogd_filter_IP2STR.c
include/ulogd/ulogd.h
input/flow/ulogd_inpflow_NFCT.c

index 33db6a2f157ecfa101d65f3070fc09e240e37b5b..7412e382222a4c0cc9413c1f472acfc1342c587b 100644 (file)
@@ -137,7 +137,7 @@ static char *ip2bin(struct ulogd_key* inp, int index, char family)
 
        switch (family) {
                case AF_INET6:
-                       addr = GET_VALUE(inp, index).ptr;
+                       addr = GET_VALUE(inp, index).ui128;
                        break;
                case AF_INET:
                        /* Convert IPv4 to IPv4 in IPv6 */
index e4ec06d7e95e61c2bc11acfafbeebe425edcaad4..9ad3b811f4c4e10957a1bf3f81dcc69e75024806 100644 (file)
@@ -174,7 +174,7 @@ static char *ip2str(struct ulogd_key *inp, int index)
        switch (convfamily) {
        case AF_INET6:
                inet_ntop(AF_INET6,
-                         GET_VALUE(inp, index).ptr,
+                         GET_VALUE(inp, index).ui128,
                          tmp, sizeof(tmp));
                break;
        case AF_INET:
index 73a1711cf1fd63a35fe9d986ab6e4a15dd5332d4..776111a73105290874560e9f1594e8cca37c1eb4 100644 (file)
@@ -105,10 +105,12 @@ struct ulogd_key {
                        u_int16_t       ui16;
                        u_int32_t       ui32;
                        u_int64_t       ui64;
+                       u_int32_t       ui128[4];
                        int8_t          i8;
                        int16_t         i16;
                        int32_t         i32;
                        int64_t         i64;
+                       int32_t         i128[4];
                        void            *ptr;
                } value;
                struct ulogd_key *source;
@@ -252,4 +254,16 @@ int ulogd_select_main(struct timeval *tv);
  ***********************************************************************/
 #include <ulogd/timer.h>
 
+/***********************************************************************
+ * other declarations
+ ***********************************************************************/
+
+#ifndef IPPROTO_DCCP
+#define IPPROTO_DCCP 33
+#endif
+
+#ifndef IPPROTO_UDPLITE
+#define IPPROTO_UDPLITE 136
+#endif
+
 #endif /* _ULOGD_H */
index 1390af4c4b133bd241391f4bfd93dc5ab1ca2919..7b9f13ca132fa0cd0470a3dff92409f1219d150c 100644 (file)
@@ -453,77 +453,112 @@ static int propagate_ct(struct ulogd_pluginstance *upi,
        ret[NFCT_OOB_PROTOCOL].flags |= ULOGD_RETF_VALID;
 
        switch (nfct_get_attr_u8(ct, ATTR_L3PROTO)) {
-               case AF_INET:
-                       ret[NFCT_ORIG_IP_SADDR].u.value.ui32 = nfct_get_attr_u32(ct, ATTR_ORIG_IPV4_SRC);
-                       ret[NFCT_ORIG_IP_SADDR].flags |= ULOGD_RETF_VALID;
-                       ret[NFCT_ORIG_IP_DADDR].u.value.ui32 = nfct_get_attr_u32(ct, ATTR_ORIG_IPV4_DST);
-                       ret[NFCT_ORIG_IP_DADDR].flags |= ULOGD_RETF_VALID;
+       case AF_INET:
+               ret[NFCT_ORIG_IP_SADDR].u.value.ui32 =
+                       nfct_get_attr_u32(ct, ATTR_ORIG_IPV4_SRC);
+               ret[NFCT_ORIG_IP_SADDR].flags |= ULOGD_RETF_VALID;
 
-                       ret[NFCT_REPLY_IP_SADDR].u.value.ui32 = nfct_get_attr_u32(ct, ATTR_REPL_IPV4_SRC);
-                       ret[NFCT_REPLY_IP_SADDR].flags |= ULOGD_RETF_VALID;
-                       ret[NFCT_REPLY_IP_DADDR].u.value.ui32 = nfct_get_attr_u32(ct, ATTR_REPL_IPV4_DST);
-                       ret[NFCT_REPLY_IP_DADDR].flags |= ULOGD_RETF_VALID;
+               ret[NFCT_ORIG_IP_DADDR].u.value.ui32 =
+                       nfct_get_attr_u32(ct, ATTR_ORIG_IPV4_DST);
+               ret[NFCT_ORIG_IP_DADDR].flags |= ULOGD_RETF_VALID;
 
-                       break;
-               case AF_INET6:
-                       ret[NFCT_ORIG_IP_SADDR].u.value.ptr = (struct in6_addr *)nfct_get_attr(ct, ATTR_ORIG_IPV6_SRC);
-                       ret[NFCT_ORIG_IP_SADDR].flags |= ULOGD_RETF_VALID;
-                       ret[NFCT_ORIG_IP_DADDR].u.value.ptr = (struct in6_addr *)nfct_get_attr(ct, ATTR_ORIG_IPV6_DST);
-                       ret[NFCT_ORIG_IP_DADDR].flags |= ULOGD_RETF_VALID;
+               ret[NFCT_REPLY_IP_SADDR].u.value.ui32 =
+                       nfct_get_attr_u32(ct, ATTR_REPL_IPV4_SRC);
+               ret[NFCT_REPLY_IP_SADDR].flags |= ULOGD_RETF_VALID;
 
-                       ret[NFCT_REPLY_IP_SADDR].u.value.ptr = (struct in6_addr *)nfct_get_attr(ct, ATTR_REPL_IPV6_SRC);
-                       ret[NFCT_REPLY_IP_SADDR].flags |= ULOGD_RETF_VALID;
-                       ret[NFCT_REPLY_IP_DADDR].u.value.ptr = (struct in6_addr *)nfct_get_attr(ct, ATTR_REPL_IPV6_DST);
-                       ret[NFCT_REPLY_IP_DADDR].flags |= ULOGD_RETF_VALID;
+               ret[NFCT_REPLY_IP_DADDR].u.value.ui32 =
+                       nfct_get_attr_u32(ct, ATTR_REPL_IPV4_DST);
+               ret[NFCT_REPLY_IP_DADDR].flags |= ULOGD_RETF_VALID;
 
-                       break;
-               default:
-                       ulogd_log(ULOGD_NOTICE, "Unknown protocol family (%d)\n",
-                                 nfct_get_attr_u8(ct, ATTR_L3PROTO));
+               break;
+       case AF_INET6:
+               memcpy(ret[NFCT_ORIG_IP_SADDR].u.value.ui128,
+                      nfct_get_attr(ct, ATTR_ORIG_IPV6_SRC),
+                      sizeof(int32_t) * 4);
+               ret[NFCT_ORIG_IP_SADDR].flags |= ULOGD_RETF_VALID;
+
+               memcpy(ret[NFCT_ORIG_IP_DADDR].u.value.ui128,
+                      nfct_get_attr(ct, ATTR_ORIG_IPV6_DST),
+                      sizeof(int32_t) * 4);
+               ret[NFCT_ORIG_IP_DADDR].flags |= ULOGD_RETF_VALID;
+
+               memcpy(ret[NFCT_REPLY_IP_SADDR].u.value.ui128,
+                      nfct_get_attr(ct, ATTR_REPL_IPV6_SRC),
+                      sizeof(int32_t) * 4);
+               ret[NFCT_REPLY_IP_SADDR].flags |= ULOGD_RETF_VALID;
+
+               memcpy(ret[NFCT_REPLY_IP_DADDR].u.value.ui128,
+                      nfct_get_attr(ct, ATTR_REPL_IPV6_DST),
+                      sizeof(int32_t) * 4);
+               ret[NFCT_REPLY_IP_DADDR].flags |= ULOGD_RETF_VALID;
+
+               break;
+       default:
+               ulogd_log(ULOGD_NOTICE, "Unknown protocol family (%d)\n",
+                         nfct_get_attr_u8(ct, ATTR_L3PROTO));
        }
-       ret[NFCT_ORIG_IP_PROTOCOL].u.value.ui8 = nfct_get_attr_u8(ct, ATTR_ORIG_L4PROTO);
+       ret[NFCT_ORIG_IP_PROTOCOL].u.value.ui8 =
+               nfct_get_attr_u8(ct, ATTR_ORIG_L4PROTO);
        ret[NFCT_ORIG_IP_PROTOCOL].flags |= ULOGD_RETF_VALID;
-       ret[NFCT_REPLY_IP_PROTOCOL].u.value.ui8 = nfct_get_attr_u8(ct, ATTR_REPL_L4PROTO);
+
+       ret[NFCT_REPLY_IP_PROTOCOL].u.value.ui8 =
+               nfct_get_attr_u8(ct, ATTR_REPL_L4PROTO);
        ret[NFCT_REPLY_IP_PROTOCOL].flags |= ULOGD_RETF_VALID;
 
        switch (nfct_get_attr_u8(ct, ATTR_ORIG_L4PROTO)) {
        case IPPROTO_TCP:
        case IPPROTO_UDP:
+       case IPPROTO_UDPLITE:
        case IPPROTO_SCTP:
-               /* FIXME: DCCP */
-               ret[NFCT_ORIG_L4_SPORT].u.value.ui16 = htons(nfct_get_attr_u16(ct, ATTR_ORIG_PORT_SRC));
+       case IPPROTO_DCCP:
+               ret[NFCT_ORIG_L4_SPORT].u.value.ui16 =
+                       htons(nfct_get_attr_u16(ct, ATTR_ORIG_PORT_SRC));
                ret[NFCT_ORIG_L4_SPORT].flags |= ULOGD_RETF_VALID;
-               ret[NFCT_ORIG_L4_DPORT].u.value.ui16 = htons(nfct_get_attr_u16(ct, ATTR_ORIG_PORT_DST));
+
+               ret[NFCT_ORIG_L4_DPORT].u.value.ui16 =
+                       htons(nfct_get_attr_u16(ct, ATTR_ORIG_PORT_DST));
                ret[NFCT_ORIG_L4_DPORT].flags |= ULOGD_RETF_VALID;
                break;
        case IPPROTO_ICMP:
-               ret[NFCT_ICMP_CODE].u.value.ui8 = nfct_get_attr_u8(ct, ATTR_ICMP_CODE);
+               ret[NFCT_ICMP_CODE].u.value.ui8 =
+                       nfct_get_attr_u8(ct, ATTR_ICMP_CODE);
                ret[NFCT_ICMP_CODE].flags |= ULOGD_RETF_VALID;
-               ret[NFCT_ICMP_TYPE].u.value.ui8 = nfct_get_attr_u8(ct, ATTR_ICMP_TYPE);
+
+               ret[NFCT_ICMP_TYPE].u.value.ui8 =
+                       nfct_get_attr_u8(ct, ATTR_ICMP_TYPE);
                ret[NFCT_ICMP_TYPE].flags |= ULOGD_RETF_VALID;
                break;
        }
 
        switch (nfct_get_attr_u8(ct, ATTR_REPL_L4PROTO)) {
-               case IPPROTO_TCP:
-               case IPPROTO_UDP:
-               case IPPROTO_SCTP:
-                       ret[NFCT_REPLY_L4_SPORT].u.value.ui16 = htons(nfct_get_attr_u16(ct, ATTR_REPL_PORT_SRC));
-                       ret[NFCT_REPLY_L4_SPORT].flags |= ULOGD_RETF_VALID;
-                       ret[NFCT_REPLY_L4_DPORT].u.value.ui16 = htons(nfct_get_attr_u16(ct, ATTR_REPL_PORT_DST));
-                       ret[NFCT_REPLY_L4_DPORT].flags |= ULOGD_RETF_VALID;
+       case IPPROTO_TCP:
+       case IPPROTO_UDP:
+       case IPPROTO_UDPLITE:
+       case IPPROTO_SCTP:
+       case IPPROTO_DCCP:
+               ret[NFCT_REPLY_L4_SPORT].u.value.ui16 =
+                       htons(nfct_get_attr_u16(ct, ATTR_REPL_PORT_SRC));
+               ret[NFCT_REPLY_L4_SPORT].flags |= ULOGD_RETF_VALID;
+
+               ret[NFCT_REPLY_L4_DPORT].u.value.ui16 =
+                       htons(nfct_get_attr_u16(ct, ATTR_REPL_PORT_DST));
+               ret[NFCT_REPLY_L4_DPORT].flags |= ULOGD_RETF_VALID;
        }
 
-       ret[NFCT_ORIG_RAW_PKTLEN].u.value.ui32 = nfct_get_attr_u32(ct, ATTR_ORIG_COUNTER_BYTES);
+       ret[NFCT_ORIG_RAW_PKTLEN].u.value.ui32 =
+               nfct_get_attr_u32(ct, ATTR_ORIG_COUNTER_BYTES);
        ret[NFCT_ORIG_RAW_PKTLEN].flags |= ULOGD_RETF_VALID;
 
-       ret[NFCT_ORIG_RAW_PKTCOUNT].u.value.ui32 = nfct_get_attr_u32(ct, ATTR_ORIG_COUNTER_PACKETS);
+       ret[NFCT_ORIG_RAW_PKTCOUNT].u.value.ui32 =
+               nfct_get_attr_u32(ct, ATTR_ORIG_COUNTER_PACKETS);
        ret[NFCT_ORIG_RAW_PKTCOUNT].flags |= ULOGD_RETF_VALID;
 
-       ret[NFCT_REPLY_RAW_PKTLEN].u.value.ui32 = nfct_get_attr_u32(ct, ATTR_REPL_COUNTER_BYTES);;
+       ret[NFCT_REPLY_RAW_PKTLEN].u.value.ui32 =
+               nfct_get_attr_u32(ct, ATTR_REPL_COUNTER_BYTES);;
        ret[NFCT_REPLY_RAW_PKTLEN].flags |= ULOGD_RETF_VALID;
 
-       ret[NFCT_REPLY_RAW_PKTCOUNT].u.value.ui32 = nfct_get_attr_u32(ct, ATTR_REPL_COUNTER_PACKETS);
+       ret[NFCT_REPLY_RAW_PKTCOUNT].u.value.ui32 =
+               nfct_get_attr_u32(ct, ATTR_REPL_COUNTER_PACKETS);
        ret[NFCT_REPLY_RAW_PKTCOUNT].flags |= ULOGD_RETF_VALID;
 
        ret[NFCT_CT_MARK].u.value.ui32 = nfct_get_attr_u32(ct, ATTR_MARK);
@@ -535,10 +570,13 @@ static int propagate_ct(struct ulogd_pluginstance *upi,
        if (ts) {
                ret[NFCT_FLOW_START_SEC].u.value.ui32 = ts->time[START].tv_sec;
                ret[NFCT_FLOW_START_SEC].flags |= ULOGD_RETF_VALID;
+
                ret[NFCT_FLOW_START_USEC].u.value.ui32 = ts->time[START].tv_usec;
                ret[NFCT_FLOW_START_USEC].flags |= ULOGD_RETF_VALID;
+
                ret[NFCT_FLOW_END_SEC].u.value.ui32 = ts->time[STOP].tv_sec;
                ret[NFCT_FLOW_END_SEC].flags |= ULOGD_RETF_VALID;
+
                ret[NFCT_FLOW_END_USEC].u.value.ui32 = ts->time[STOP].tv_usec;
                ret[NFCT_FLOW_END_USEC].flags |= ULOGD_RETF_VALID;
        }