Actions
Bug #851
closedsrc/defrag-hash.c : improper struct member use for DefragHashKey4 and DefragHashKey6
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
Actions