Project

General

Profile

Actions

Bug #851

closed

src/defrag-hash.c : improper struct member use for DefragHashKey4 and DefragHashKey6

Added by Mark Solaris almost 11 years ago. Updated over 6 years ago.

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

Description

Solaris 10 & 11 with Sun Studio 12.3 compiler

Some bad coding snuck into defrag-hash.c:

    312 typedef struct DefragHashKey4_ {
    313     union {
    314         struct {
    315             uint32_t src, dst;
    316             uint32_t id;
    317         };
    318         uint32_t u32[3];
    319     };
    320 } DefragHashKey4;

    344         DefragHashKey4 dhk;
    345         if (p->src.addr_data32[0] > p->dst.addr_data32[0]) {
    346             dhk.src = p->src.addr_data32[0];
    347             dhk.dst = p->dst.addr_data32[0];

Causes these errors:

"defrag-hash.c", line 346: improper member use: src
"defrag-hash.c", line 346: assignment type mismatch:
        array[4] of unsigned int "=" unsigned int
"defrag-hash.c", line 347: improper member use: dst
"defrag-hash.c", line 347: assignment type mismatch:
        array[4] of unsigned int "=" unsigned int
"defrag-hash.c", line 349: improper member use: src
"defrag-hash.c", line 349: assignment type mismatch:
        array[4] of unsigned int "=" unsigned int
"defrag-hash.c", line 350: improper member use: dst
"defrag-hash.c", line 350: assignment type mismatch:
        array[4] of unsigned int "=" unsigned int
"defrag-hash.c", line 352: improper member use: id
"defrag-hash.c", line 359: improper member use: src
"defrag-hash.c", line 360: improper member use: src
"defrag-hash.c", line 361: improper member use: src
"defrag-hash.c", line 362: improper member use: src
"defrag-hash.c", line 363: improper member use: dst
"defrag-hash.c", line 364: improper member use: dst
"defrag-hash.c", line 365: improper member use: dst
"defrag-hash.c", line 366: improper member use: dst
"defrag-hash.c", line 368: improper member use: src
"defrag-hash.c", line 369: improper member use: src
"defrag-hash.c", line 370: improper member use: src
"defrag-hash.c", line 371: improper member use: src
"defrag-hash.c", line 372: improper member use: dst
"defrag-hash.c", line 373: improper member use: dst
"defrag-hash.c", line 374: improper member use: dst
"defrag-hash.c", line 375: improper member use: dst
"defrag-hash.c", line 377: improper member use: id

This diff fixes it:

--- suricata-1.4.3/src/defrag-hash.c.orig       Sat Jul  6 14:57:48 2013
+++ suricata-1.4.3/src/defrag-hash.c    Sat Jul  6 14:57:57 2013
@@ -312,9 +312,9 @@
 typedef struct DefragHashKey4_ {
     union {
         struct {
-            uint32_t src, dst;
-            uint32_t id;
-        };
+            uint32_t dhk4src, dhk4dst;
+            uint32_t dhk4id;
+        } dhk4address;
         uint32_t u32[3];
     };
 } DefragHashKey4;
@@ -322,9 +322,9 @@
 typedef struct DefragHashKey6_ {
     union {
         struct {
-            uint32_t src[4], dst[4];
-            uint32_t id;
-        };
+            uint32_t dhk6src[4], dhk6dst[4];
+            uint32_t dhk6id;
+        } dhk6address;
         uint32_t u32[9];
     };
 } DefragHashKey6;
@@ -341,42 +341,42 @@
     uint32_t key;

     if (p->ip4h != NULL) {
-        DefragHashKey4 dhk;
+        DefragHashKey4 dhk4;
         if (p->src.addr_data32[0] > p->dst.addr_data32[0]) {
-            dhk.src = p->src.addr_data32[0];
-            dhk.dst = p->dst.addr_data32[0];
+            dhk4.dhk4address.dhk4src = (uint32_t) p->src.addr_data32[0];
+            dhk4.dhk4address.dhk4dst = (uint32_t) p->dst.addr_data32[0];
         } else {
-            dhk.src = p->dst.addr_data32[0];
-            dhk.dst = p->src.addr_data32[0];
+            dhk4.dhk4address.dhk4src = p->dst.addr_data32[0];
+            dhk4.dhk4address.dhk4dst = p->src.addr_data32[0];
         }
-        dhk.id = (uint32_t)IPV4_GET_IPID(p);
+        dhk4.dhk4address.dhk4id = (uint32_t)IPV4_GET_IPID(p);

-        uint32_t hash = hashword(dhk.u32, 3, defrag_config.hash_rand);
+        uint32_t hash = hashword(dhk4.u32, 3, defrag_config.hash_rand);
         key = hash % defrag_config.hash_size;
     } else if (p->ip6h != NULL) {
-        DefragHashKey6 dhk;
+        DefragHashKey6 dhk6;
         if (DefragHashRawAddressIPv6GtU32(p->src.addr_data32, p->dst.addr_data32)) {
-            dhk.src[0] = p->src.addr_data32[0];
-            dhk.src[1] = p->src.addr_data32[1];
-            dhk.src[2] = p->src.addr_data32[2];
-            dhk.src[3] = p->src.addr_data32[3];
-            dhk.dst[0] = p->dst.addr_data32[0];
-            dhk.dst[1] = p->dst.addr_data32[1];
-            dhk.dst[2] = p->dst.addr_data32[2];
-            dhk.dst[3] = p->dst.addr_data32[3];
+            dhk6.dhk6address.dhk6src[0] = p->src.addr_data32[0];
+            dhk6.dhk6address.dhk6src[1] = p->src.addr_data32[1];
+            dhk6.dhk6address.dhk6src[2] = p->src.addr_data32[2];
+            dhk6.dhk6address.dhk6src[3] = p->src.addr_data32[3];
+            dhk6.dhk6address.dhk6dst[0] = p->dst.addr_data32[0];
+            dhk6.dhk6address.dhk6dst[1] = p->dst.addr_data32[1];
+            dhk6.dhk6address.dhk6dst[2] = p->dst.addr_data32[2];
+            dhk6.dhk6address.dhk6dst[3] = p->dst.addr_data32[3];
         } else {
-            dhk.src[0] = p->dst.addr_data32[0];
-            dhk.src[1] = p->dst.addr_data32[1];
-            dhk.src[2] = p->dst.addr_data32[2];
-            dhk.src[3] = p->dst.addr_data32[3];
-            dhk.dst[0] = p->src.addr_data32[0];
-            dhk.dst[1] = p->src.addr_data32[1];
-            dhk.dst[2] = p->src.addr_data32[2];
-            dhk.dst[3] = p->src.addr_data32[3];
+            dhk6.dhk6address.dhk6src[0] = p->dst.addr_data32[0];
+            dhk6.dhk6address.dhk6src[1] = p->dst.addr_data32[1];
+            dhk6.dhk6address.dhk6src[2] = p->dst.addr_data32[2];
+            dhk6.dhk6address.dhk6src[3] = p->dst.addr_data32[3];
+            dhk6.dhk6address.dhk6dst[0] = p->src.addr_data32[0];
+            dhk6.dhk6address.dhk6dst[1] = p->src.addr_data32[1];
+            dhk6.dhk6address.dhk6dst[2] = p->src.addr_data32[2];
+            dhk6.dhk6address.dhk6dst[3] = p->src.addr_data32[3];
         }
-        dhk.id = IPV6_EXTHDR_GET_FH_ID(p);
+        dhk6.dhk6address.dhk6id = IPV6_EXTHDR_GET_FH_ID(p);

-        uint32_t hash = hashword(dhk.u32, 9, defrag_config.hash_rand);
+        uint32_t hash = hashword(dhk6.u32, 9, defrag_config.hash_rand);
         key = hash % defrag_config.hash_size;
     } else
         key = 0;


Files

defrag-hash.c.diff (4.01 KB) defrag-hash.c.diff Mark Solaris, 07/06/2013 12:17 AM
Actions #2

Updated by Victor Julien almost 11 years ago

  • Target version deleted (1.4.3)
Actions #3

Updated by Victor Julien over 10 years ago

  • Target version set to TBD
Actions #4

Updated by Andreas Herz over 8 years ago

  • Status changed from New to Closed
Actions #5

Updated by Victor Julien over 6 years ago

  • Target version deleted (TBD)
Actions

Also available in: Atom PDF