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
Updated by Mark Solaris almost 11 years ago
This thread has more on anonymous structs in unions.
http://stackoverflow.com/questions/12653500/how-to-access-a-struct-member-inside-a-union-in-c
Actions