diff --git a/src/detect-engine-address.c b/src/detect-engine-address.c index 89de8ac918..fbd4624f76 100644 --- a/src/detect-engine-address.c +++ b/src/detect-engine-address.c @@ -39,7 +39,9 @@ static int DetectAddressCut(DetectAddressData *, DetectAddressData *, DetectAddr static int DetectAddressCutNot(DetectAddressData *, DetectAddressData **); static int DetectAddressGroupCut(DetectEngineCtx *, DetectAddressGroup *, DetectAddressGroup *, DetectAddressGroup **); -/* memory usage counters */ +/** memory usage counters + * \todo not MT safe */ +#ifdef DEBUG static uint32_t detect_address_group_memory = 0; static uint32_t detect_address_group_init_cnt = 0; static uint32_t detect_address_group_free_cnt = 0; @@ -51,6 +53,7 @@ static uint32_t detect_address_group_head_free_cnt = 0; static uint32_t detect_address_memory = 0; static uint32_t detect_address_init_cnt = 0; static uint32_t detect_address_free_cnt = 0; +#endif DetectAddressGroup *DetectAddressGroupInit(void) { DetectAddressGroup *ag = malloc(sizeof(DetectAddressGroup)); @@ -58,10 +61,10 @@ DetectAddressGroup *DetectAddressGroupInit(void) { return NULL; } memset(ag,0,sizeof(DetectAddressGroup)); - +#ifdef DEBUG detect_address_group_memory += sizeof(DetectAddressGroup); detect_address_group_init_cnt++; - +#endif return ag; } @@ -91,13 +94,15 @@ void DetectAddressGroupFree(DetectAddressGroup *ag) { } ag->port = NULL; } - +#ifdef DEBUG detect_address_group_memory -= sizeof(DetectAddressGroup); detect_address_group_free_cnt++; +#endif free(ag); } void DetectAddressGroupPrintMemory(void) { +#ifdef DEBUG printf(" * Address group memory stats (DetectAddressGroup %" PRIuMAX "):\n", (uintmax_t)sizeof(DetectAddressGroup)); printf(" - detect_address_group_memory %" PRIu32 "\n", detect_address_group_memory); printf(" - detect_address_group_init_cnt %" PRIu32 "\n", detect_address_group_init_cnt); @@ -117,6 +122,7 @@ void DetectAddressGroupPrintMemory(void) { printf(" - outstanding addresses %" PRIu32 "\n", detect_address_init_cnt - detect_address_free_cnt); printf(" * Address memory stats done\n"); printf(" X Total %" PRIu32 "\n", detect_address_group_memory + detect_address_group_head_memory + detect_address_memory); +#endif } /* used to see if the exact same address group exists in the list @@ -832,10 +838,10 @@ DetectAddressGroupsHead *DetectAddressGroupsHeadInit(void) { return NULL; } memset(gh,0,sizeof(DetectAddressGroupsHead)); - +#ifdef DEBUG detect_address_group_head_init_cnt++; detect_address_group_head_memory += sizeof(DetectAddressGroupsHead); - +#endif return gh; } @@ -854,9 +860,10 @@ void DetectAddressGroupsHeadFree(DetectAddressGroupsHead *gh) { if (gh != NULL) { DetectAddressGroupsHeadCleanup(gh); free(gh); - +#ifdef DEBUG detect_address_group_head_free_cnt++; detect_address_group_head_memory -= sizeof(DetectAddressGroupsHead); +#endif } } @@ -1124,10 +1131,10 @@ DetectAddressData *DetectAddressDataInit(void) { goto error; } memset(dd,0,sizeof(DetectAddressData)); - +#ifdef DEBUG detect_address_init_cnt++; detect_address_memory += sizeof(DetectAddressData); - +#endif return dd; error: @@ -1168,9 +1175,10 @@ int DetectAddressSetup (DetectEngineCtx * de_ctx, Signature *s, SigMatch *m, cha void DetectAddressDataFree(DetectAddressData *dd) { if (dd != NULL) { free(dd); - +#ifdef DEBUG detect_address_free_cnt++; detect_address_memory -= sizeof(DetectAddressData); +#endif } } diff --git a/src/eidps.c b/src/eidps.c index ccfcaa0262..668953ddcf 100644 --- a/src/eidps.c +++ b/src/eidps.c @@ -1553,7 +1553,6 @@ int main(int argc, char **argv) AlpDetectRegisterTests(); ConfRegisterTests(); TmqhFlowRegisterTests(); - StreamTcpRegisterTests(); FlowRegisterTests(); uint32_t failed = UtRunTests(); UtCleanup(); diff --git a/src/stream-tcp-reassemble.c b/src/stream-tcp-reassemble.c index fb5fc494f5..2d61fadaf7 100644 --- a/src/stream-tcp-reassemble.c +++ b/src/stream-tcp-reassemble.c @@ -37,6 +37,7 @@ #include "util-unittest.h" #include "util-print.h" +#include "stream-tcp.h" #include "stream-tcp-private.h" #include "stream-tcp-reassemble.h" @@ -113,7 +114,7 @@ static uint64_t segment_pool_cnt = 0; /* index to the right pool for all packet sizes. */ static uint16_t segment_pool_idx[65536]; /* O(1) lookups of the pool */ -int StreamTcpReassembleInit(void) { +int StreamTcpReassembleInit(char quiet) { StreamMsgQueuesInit(); #ifdef DEBUG pthread_mutex_init(&segment_pool_memuse_mutex, NULL); @@ -144,13 +145,16 @@ int StreamTcpReassembleInit(void) { return 0; } -void StreamTcpReassembleFree(void) { +void StreamTcpReassembleFree(char quiet) { uint16_t u16 = 0; for (u16 = 0; u16 < segment_pool_num; u16++) { - PoolPrintSaturation(segment_pool[u16]); - - printf("segment_pool[u16]->empty_list_size %"PRIu32", segment_pool[u16]->alloc_list_size %"PRIu32", alloced %"PRIu32"\n", segment_pool[u16]->empty_list_size, segment_pool[u16]->alloc_list_size, segment_pool[u16]->allocated); + if (quiet == FALSE) { + PoolPrintSaturation(segment_pool[u16]); + printf("segment_pool[u16]->empty_list_size %"PRIu32", segment_pool[u16]->alloc_list_size %"PRIu32", alloced %"PRIu32"\n", segment_pool[u16]->empty_list_size, segment_pool[u16]->alloc_list_size, segment_pool[u16]->allocated); + } PoolFree(segment_pool[u16]); + + pthread_mutex_destroy(&segment_pool_mutex[u16]); } #ifdef DEBUG @@ -159,7 +163,7 @@ void StreamTcpReassembleFree(void) { printf("segment_pool_memcnt %"PRIu64"\n", segment_pool_memcnt); #endif - StreamMsgQueuesDeinit(); + StreamMsgQueuesDeinit(quiet); } void PrintList2(TcpSegment *seg) { @@ -1966,15 +1970,19 @@ static int StreamTcpReassembleTest01(void) { 0x4c, 0x4d, 0x4d, 0x4d}; memset(&stream, 0, sizeof (TcpStream)); stream.os_policy = OS_POLICY_BSD; + + StreamTcpInitConfig(TRUE); + if (StreamTcpTestStartsBeforeListSegment(&stream) == 0) { printf("failed in segments reassembly!!\n"); return 0; } if (StreamTcpCheckStreamContents(stream_before_bsd,sizeof(stream_before_bsd), &stream) == 0) { printf("failed in stream matching!!\n"); -exit(1); return 0; } + + StreamTcpFreeConfig(TRUE); return 1; } @@ -1989,6 +1997,9 @@ static int StreamTcpReassembleTest02(void) { 0x49, 0x51}; memset(&stream, 0, sizeof (TcpStream)); stream.os_policy = OS_POLICY_BSD; + + StreamTcpInitConfig(TRUE); + if (StreamTcpTestStartsAtSameListSegment(&stream) == 0) { printf("failed in segments reassembly!!\n"); return 0; @@ -1997,6 +2008,7 @@ static int StreamTcpReassembleTest02(void) { printf("failed in stream matching!!\n"); return 0; } + StreamTcpFreeConfig(TRUE); return 1; } @@ -2011,6 +2023,9 @@ static int StreamTcpReassembleTest03(void) { 0x47, 0x47}; memset(&stream, 0, sizeof (TcpStream)); stream.os_policy = OS_POLICY_BSD; + + StreamTcpInitConfig(TRUE); + if (StreamTcpTestStartsAfterListSegment(&stream) == 0) { printf("failed in segments reassembly!!\n"); return 0; @@ -2019,6 +2034,7 @@ static int StreamTcpReassembleTest03(void) { printf("failed in stream matching!!\n"); return 0; } + StreamTcpFreeConfig(TRUE); return 1; } @@ -2034,6 +2050,7 @@ static int StreamTcpReassembleTest04(void) { 0x46, 0x46, 0x46, 0x47, 0x47, 0x48, 0x48, 0x49, 0x51}; memset(&stream, 0, sizeof (TcpStream)); stream.os_policy = OS_POLICY_BSD; + StreamTcpInitConfig(TRUE); if (StreamTcpReassembleStreamTest(&stream) == 0) { printf("failed in segments reassembly!!\n"); return 0; @@ -2042,6 +2059,7 @@ static int StreamTcpReassembleTest04(void) { printf("failed in stream matching!!\n"); return 0; } + StreamTcpFreeConfig(TRUE); return 1; } @@ -2056,6 +2074,7 @@ static int StreamTcpReassembleTest05(void) { 0x4c, 0x4d, 0x45, 0x45}; memset(&stream, 0, sizeof (TcpStream)); stream.os_policy = OS_POLICY_VISTA; + StreamTcpInitConfig(TRUE); if (StreamTcpTestStartsBeforeListSegment(&stream) == 0) { printf("failed in segments reassembly!!\n"); return 0; @@ -2064,6 +2083,7 @@ static int StreamTcpReassembleTest05(void) { printf("failed in stream matching!!\n"); return 0; } + StreamTcpFreeConfig(TRUE); return 1; } @@ -2078,6 +2098,9 @@ static int StreamTcpReassembleTest06(void) { 0x49, 0x51}; memset(&stream, 0, sizeof (TcpStream)); stream.os_policy = OS_POLICY_VISTA; + + StreamTcpInitConfig(TRUE); + if (StreamTcpTestStartsAtSameListSegment(&stream) == 0) { printf("failed in segments reassembly!!\n"); return 0; @@ -2086,6 +2109,7 @@ static int StreamTcpReassembleTest06(void) { printf("failed in stream matching!!\n"); return 0; } + StreamTcpFreeConfig(TRUE); return 1; } @@ -2100,6 +2124,9 @@ static int StreamTcpReassembleTest07(void) { 0x47, 0x47}; memset(&stream, 0, sizeof (TcpStream)); stream.os_policy = OS_POLICY_VISTA; + + StreamTcpInitConfig(TRUE); + if (StreamTcpTestStartsAfterListSegment(&stream) == 0) { printf("failed in segments reassembly!!\n"); return 0; @@ -2108,6 +2135,7 @@ static int StreamTcpReassembleTest07(void) { printf("failed in stream matching!!\n"); return 0; } + StreamTcpFreeConfig(TRUE); return 1; } @@ -2123,6 +2151,7 @@ static int StreamTcpReassembleTest08(void) { 0x46, 0x46, 0x46, 0x47, 0x47, 0x48, 0x48, 0x49, 0x51}; memset(&stream, 0, sizeof (TcpStream)); stream.os_policy = OS_POLICY_VISTA; + StreamTcpInitConfig(TRUE); if (StreamTcpReassembleStreamTest(&stream) == 0) { printf("failed in segments reassembly!!\n"); return 0; @@ -2131,6 +2160,7 @@ static int StreamTcpReassembleTest08(void) { printf("failed in stream matching!!\n"); return 0; } + StreamTcpFreeConfig(TRUE); return 1; } @@ -2145,6 +2175,7 @@ static int StreamTcpReassembleTest09(void) { 0x4c, 0x4d, 0x4d, 0x4d}; memset(&stream, 0, sizeof (TcpStream)); stream.os_policy = OS_POLICY_LINUX; + StreamTcpInitConfig(TRUE); if (StreamTcpTestStartsBeforeListSegment(&stream) == 0) { printf("failed in segments reassembly!!\n"); return 0; @@ -2153,6 +2184,7 @@ static int StreamTcpReassembleTest09(void) { printf("failed in stream matching!!\n"); return 0; } + StreamTcpFreeConfig(TRUE); return 1; } @@ -2167,6 +2199,7 @@ static int StreamTcpReassembleTest10(void) { 0x51, 0x51}; memset(&stream, 0, sizeof (TcpStream)); stream.os_policy = OS_POLICY_LINUX; + StreamTcpInitConfig(TRUE); if (StreamTcpTestStartsAtSameListSegment(&stream) == 0) { printf("failed in segments reassembly!!\n"); return 0; @@ -2175,6 +2208,7 @@ static int StreamTcpReassembleTest10(void) { printf("failed in stream matching!!\n"); return 0; } + StreamTcpFreeConfig(TRUE); return 1; } @@ -2189,6 +2223,7 @@ static int StreamTcpReassembleTest11(void) { 0x47, 0x47}; memset(&stream, 0, sizeof (TcpStream)); stream.os_policy = OS_POLICY_LINUX; + StreamTcpInitConfig(TRUE); if (StreamTcpTestStartsAfterListSegment(&stream) == 0) { printf("failed in segments reassembly!!\n"); return 0; @@ -2197,6 +2232,7 @@ static int StreamTcpReassembleTest11(void) { printf("failed in stream matching!!\n"); return 0; } + StreamTcpFreeConfig(TRUE); return 1; } @@ -2212,6 +2248,7 @@ static int StreamTcpReassembleTest12(void) { 0x46, 0x46, 0x46, 0x47, 0x47, 0x48, 0x48, 0x51, 0x51}; memset(&stream, 0, sizeof (TcpStream)); stream.os_policy = OS_POLICY_LINUX; + StreamTcpInitConfig(TRUE); if (StreamTcpReassembleStreamTest(&stream) == 0) { printf("failed in segments reassembly!!\n"); return 0; @@ -2220,6 +2257,7 @@ static int StreamTcpReassembleTest12(void) { printf("failed in stream matching!!\n"); return 0; } + StreamTcpFreeConfig(TRUE); return 1; } @@ -2234,6 +2272,7 @@ static int StreamTcpReassembleTest13(void) { 0x4c, 0x4d, 0x4d, 0x4d}; memset(&stream, 0, sizeof (TcpStream)); stream.os_policy = OS_POLICY_OLD_LINUX; + StreamTcpInitConfig(TRUE); if (StreamTcpTestStartsBeforeListSegment(&stream) == 0) { printf("failed in segments reassembly!!\n"); return 0; @@ -2242,6 +2281,7 @@ static int StreamTcpReassembleTest13(void) { printf("failed in stream matching!!\n"); return 0; } + StreamTcpFreeConfig(TRUE); return 1; } @@ -2256,6 +2296,7 @@ static int StreamTcpReassembleTest14(void) { 0x51, 0x51}; memset(&stream, 0, sizeof (TcpStream)); stream.os_policy = OS_POLICY_OLD_LINUX; + StreamTcpInitConfig(TRUE); if (StreamTcpTestStartsAtSameListSegment(&stream) == 0) { printf("failed in segments reassembly!!\n"); return 0; @@ -2264,6 +2305,7 @@ static int StreamTcpReassembleTest14(void) { printf("failed in stream matching!!\n"); return 0; } + StreamTcpFreeConfig(TRUE); return 1; } @@ -2278,6 +2320,7 @@ static int StreamTcpReassembleTest15(void) { 0x47, 0x47}; memset(&stream, 0, sizeof (TcpStream)); stream.os_policy = OS_POLICY_OLD_LINUX; + StreamTcpInitConfig(TRUE); if (StreamTcpTestStartsAfterListSegment(&stream) == 0) { printf("failed in segments reassembly!!\n"); return 0; @@ -2286,6 +2329,7 @@ static int StreamTcpReassembleTest15(void) { printf("failed in stream matching!!\n"); return 0; } + StreamTcpFreeConfig(TRUE); return 1; } @@ -2301,6 +2345,7 @@ static int StreamTcpReassembleTest16(void) { 0x46, 0x46, 0x46, 0x47, 0x47, 0x48, 0x48, 0x51, 0x51}; memset(&stream, 0, sizeof (TcpStream)); stream.os_policy = OS_POLICY_OLD_LINUX; + StreamTcpInitConfig(TRUE); if (StreamTcpReassembleStreamTest(&stream) == 0) { printf("failed in segments reassembly!!\n"); return 0; @@ -2309,6 +2354,7 @@ static int StreamTcpReassembleTest16(void) { printf("failed in stream matching!!\n"); return 0; } + StreamTcpFreeConfig(TRUE); return 1; } @@ -2323,6 +2369,7 @@ static int StreamTcpReassembleTest17(void) { 0x4c, 0x4d, 0x4d, 0x4d}; memset(&stream, 0, sizeof (TcpStream)); stream.os_policy = OS_POLICY_SOLARIS; + StreamTcpInitConfig(TRUE); if (StreamTcpTestStartsBeforeListSegment(&stream) == 0) { printf("failed in segments reassembly!!\n"); return 0; @@ -2331,6 +2378,7 @@ static int StreamTcpReassembleTest17(void) { printf("failed in stream matching!!\n"); return 0; } + StreamTcpFreeConfig(TRUE); return 1; } @@ -2345,6 +2393,7 @@ static int StreamTcpReassembleTest18(void) { 0x51, 0x51}; memset(&stream, 0, sizeof (TcpStream)); stream.os_policy = OS_POLICY_SOLARIS; + StreamTcpInitConfig(TRUE); if (StreamTcpTestStartsAtSameListSegment(&stream) == 0) { printf("failed in segments reassembly!!\n"); return 0; @@ -2353,6 +2402,7 @@ static int StreamTcpReassembleTest18(void) { printf("failed in stream matching!!\n"); return 0; } + StreamTcpFreeConfig(TRUE); return 1; } @@ -2367,6 +2417,7 @@ static int StreamTcpReassembleTest19(void) { 0x47, 0x47}; memset(&stream, 0, sizeof (TcpStream)); stream.os_policy = OS_POLICY_SOLARIS; + StreamTcpInitConfig(TRUE); if (StreamTcpTestStartsAfterListSegment(&stream) == 0) { printf("failed in segments reassembly!!\n"); return 0; @@ -2375,6 +2426,7 @@ static int StreamTcpReassembleTest19(void) { printf("failed in stream matching!!\n"); return 0; } + StreamTcpFreeConfig(TRUE); return 1; } @@ -2390,6 +2442,7 @@ static int StreamTcpReassembleTest20(void) { 0x46, 0x46, 0x46, 0x47, 0x47, 0x48, 0x48, 0x51, 0x51}; memset(&stream, 0, sizeof (TcpStream)); stream.os_policy = OS_POLICY_SOLARIS; + StreamTcpInitConfig(TRUE); if (StreamTcpReassembleStreamTest(&stream) == 0) { printf("failed in segments reassembly!!\n"); return 0; @@ -2398,6 +2451,7 @@ static int StreamTcpReassembleTest20(void) { printf("failed in stream matching!!\n"); return 0; } + StreamTcpFreeConfig(TRUE); return 1; } @@ -2412,6 +2466,7 @@ static int StreamTcpReassembleTest21(void) { 0x4c, 0x4d, 0x4d, 0x4d}; memset(&stream, 0, sizeof (TcpStream)); stream.os_policy = OS_POLICY_LAST; + StreamTcpInitConfig(TRUE); if (StreamTcpTestStartsBeforeListSegment(&stream) == 0) { printf("failed in segments reassembly!!\n"); return 0; @@ -2420,6 +2475,7 @@ static int StreamTcpReassembleTest21(void) { printf("failed in stream matching!!\n"); return 0; } + StreamTcpFreeConfig(TRUE); return 1; } @@ -2434,6 +2490,7 @@ static int StreamTcpReassembleTest22(void) { 0x51, 0x51}; memset(&stream, 0, sizeof (TcpStream)); stream.os_policy = OS_POLICY_LAST; + StreamTcpInitConfig(TRUE); if (StreamTcpTestStartsAtSameListSegment(&stream) == 0) { printf("failed in segments reassembly!!\n"); return 0; @@ -2442,6 +2499,7 @@ static int StreamTcpReassembleTest22(void) { printf("failed in stream matching!!\n"); return 0; } + StreamTcpFreeConfig(TRUE); return 1; } @@ -2455,6 +2513,7 @@ static int StreamTcpReassembleTest23(void) { memset(&stream, 0, sizeof (TcpStream)); stream.os_policy = OS_POLICY_LAST; + StreamTcpInitConfig(TRUE); if (StreamTcpTestStartsAfterListSegment(&stream) == 0) { printf("failed in segments reassembly!!\n"); @@ -2462,9 +2521,9 @@ static int StreamTcpReassembleTest23(void) { } if (StreamTcpCheckStreamContents(stream_after_last, sizeof(stream_after_last), &stream) == 0) { printf("failed in stream matching!!\n"); -exit(1); return 0; } + StreamTcpFreeConfig(TRUE); return 1; } @@ -2481,6 +2540,7 @@ static int StreamTcpReassembleTest24(void) { memset(&stream, 0, sizeof (TcpStream)); stream.os_policy = OS_POLICY_LAST; + StreamTcpInitConfig(TRUE); if (StreamTcpReassembleStreamTest(&stream) == 0) { printf("failed in segments reassembly: "); @@ -2490,6 +2550,7 @@ static int StreamTcpReassembleTest24(void) { printf("failed in stream matching: "); return 0; } + StreamTcpFreeConfig(TRUE); return 1; } @@ -2580,6 +2641,7 @@ static int StreamTcpReassembleTest25 (void) { flowflags = FLOW_PKT_TOSERVER; th_flag = TH_ACK|TH_PUSH; ack = 20; + StreamTcpInitConfig(TRUE); StreamTcpCreateTestPacket(payload, 0x42, 2); /*BB*/ seq = 10; @@ -2607,6 +2669,7 @@ static int StreamTcpReassembleTest25 (void) { return 0; } + StreamTcpFreeConfig(TRUE); return 1; } @@ -2630,6 +2693,7 @@ static int StreamTcpReassembleTest26 (void) { flowflags = FLOW_PKT_TOSERVER; th_flag = TH_ACK|TH_PUSH; ack = 20; + StreamTcpInitConfig(TRUE); StreamTcpCreateTestPacket(payload, 0x41, 3); /*AAA*/ seq = 10; @@ -2658,6 +2722,7 @@ static int StreamTcpReassembleTest26 (void) { } + StreamTcpFreeConfig(TRUE); return 1; } @@ -2681,6 +2746,7 @@ static int StreamTcpReassembleTest27 (void) { flowflags = FLOW_PKT_TOSERVER; th_flag = TH_ACK|TH_PUSH; ack = 20; + StreamTcpInitConfig(TRUE); StreamTcpCreateTestPacket(payload, 0x41, 3); /*AAA*/ seq = 10; @@ -2708,7 +2774,7 @@ static int StreamTcpReassembleTest27 (void) { return 0; } - + StreamTcpFreeConfig(TRUE); return 1; } @@ -2732,6 +2798,8 @@ static int StreamTcpReassembleTest28 (void) { uint8_t check_contents[5] = {0x41, 0x41, 0x42, 0x42, 0x42}; memset(&stream, 0, sizeof (TcpStream)); + StreamTcpInitConfig(TRUE); + flowflags = FLOW_PKT_TOSERVER; th_flag = TH_ACK|TH_PUSH; th_flags = TH_ACK; @@ -2782,6 +2850,7 @@ static int StreamTcpReassembleTest28 (void) { return 0; } + StreamTcpFreeConfig(TRUE); return 1; } @@ -2812,6 +2881,7 @@ static int StreamTcpReassembleTest29 (void) { stream.last_ack = 22; stream.ra_base_seq = 9; stream.isn = 9; + StreamTcpInitConfig(TRUE); StreamTcpCreateTestPacket(payload, 0x41, 2); /*AA*/ seq = 10; @@ -2855,6 +2925,7 @@ static int StreamTcpReassembleTest29 (void) { return 0; } + StreamTcpFreeConfig(TRUE); return 1; } @@ -2886,6 +2957,7 @@ static int StreamTcpReassembleTest30 (void) { stream.ra_base_seq = 9; stream.isn = 9; + StreamTcpInitConfig(TRUE); StreamTcpCreateTestPacket(payload, 0x41, 2); /*AA*/ seq = 10; ack = 20; @@ -2947,6 +3019,7 @@ static int StreamTcpReassembleTest30 (void) { return 0; } + StreamTcpFreeConfig(TRUE); return 1; } diff --git a/src/stream-tcp-reassemble.h b/src/stream-tcp-reassemble.h index e80c228234..f1fd66558b 100644 --- a/src/stream-tcp-reassemble.h +++ b/src/stream-tcp-reassemble.h @@ -30,8 +30,8 @@ enum #define OS_POLICY_DEFAULT OS_POLICY_BSD int StreamTcpReassembleHandleSegment(TcpSession *, TcpStream *, Packet *); -int StreamTcpReassembleInit(void); -void StreamTcpReassembleFree(void); +int StreamTcpReassembleInit(char); +void StreamTcpReassembleFree(char); void StreamTcpReassembleRegisterTests(void); void StreamTcpCreateTestPacket(u_int8_t *, u_int8_t, u_int8_t); diff --git a/src/stream-tcp.c b/src/stream-tcp.c index eaf958d626..7155aca8a7 100644 --- a/src/stream-tcp.c +++ b/src/stream-tcp.c @@ -61,7 +61,7 @@ int StreamTcpGetFlowState(void *); #define STREAMTCP_EMERG_EST_TIMEOUT 300 #define STREAMTCP_EMERG_CLOSED_TIMEOUT 20 -static Pool *ssn_pool; +static Pool *ssn_pool = NULL; static pthread_mutex_t ssn_pool_mutex; #ifdef DEBUG @@ -195,6 +195,7 @@ void StreamTcpInitConfig(char quiet) { printf("Initializing Stream:\n"); memset(&stream_config, 0, sizeof(stream_config)); + /** set config defaults */ stream_config.max_sessions = STREAMTCP_DEFAULT_SESSIONS; stream_config.prealloc_sessions = STREAMTCP_DEFAULT_PREALLOC; @@ -207,7 +208,7 @@ void StreamTcpInitConfig(char quiet) { pthread_mutex_init(&ssn_pool_mutex, NULL); - StreamTcpReassembleInit(); + StreamTcpReassembleInit(quiet); /* set the default TCP timeout, free function and flow state function values. */ FlowSetProtoTimeout(IPPROTO_TCP, STREAMTCP_NEW_TIMEOUT, STREAMTCP_EST_TIMEOUT, STREAMTCP_CLOSED_TIMEOUT); @@ -218,12 +219,19 @@ void StreamTcpInitConfig(char quiet) { } void StreamTcpFreeConfig(char quiet) { - StreamTcpReassembleFree(); + StreamTcpReassembleFree(quiet); - PoolFree(ssn_pool); + if (ssn_pool != NULL) { + PoolFree(ssn_pool); + ssn_pool = NULL; + } else { + printf("ERROR: ssn_pool is NULL\n"); + exit(1); + } #ifdef DEBUG printf("ssn_pool_cnt %"PRIu64"\n", ssn_pool_cnt); #endif + pthread_mutex_destroy(&ssn_pool_mutex); } /** \brief The function is used to to fetch a TCP session from the @@ -1032,7 +1040,6 @@ static int StreamTcpPacketStateFinWait1(ThreadVars *tv, Packet *p, StreamTcpThre printf("StreamTcpPacketStateFinWait1 (%p): Reset received state changed to TCP_CLOSED\n", ssn); #endif StreamTcpPacketSetState(p, ssn, TCP_CLOSED); - //StreamTcpSessionPktFree(p); } else return -1; @@ -1125,7 +1132,6 @@ static int StreamTcpPacketStateFinWait2(ThreadVars *tv, Packet *p, StreamTcpThre printf("StreamTcpPacketStateFinWait2 (%p): Reset received state changed to TCP_CLOSED\n", ssn); #endif StreamTcpPacketSetState(p, ssn, TCP_CLOSED); - //StreamTcpSessionPktFree(p); } else return -1; @@ -1429,7 +1435,6 @@ static int StreamTcpPacketStateTimeWait(ThreadVars *tv, Packet *p, StreamTcpThre printf("StreamTcpPacketStateTimeWait (%p): =+ next SEQ %" PRIu32 ", last ACK %" PRIu32 "\n", ssn, ssn->client.next_seq, ssn->server.last_ack); #endif - //StreamTcpSessionPktFree(p); } else { #ifdef DEBUG printf("StreamTcpPacketStateTimeWait (%p): pkt (%" PRIu32 ") is to client: SEQ %" PRIu32 ", ACK %" PRIu32 "\n", @@ -1456,7 +1461,6 @@ static int StreamTcpPacketStateTimeWait(ThreadVars *tv, Packet *p, StreamTcpThre printf("StreamTcpPacketStateTimeWait (%p): =+ next SEQ %" PRIu32 ", last ACK %" PRIu32 "\n", ssn, ssn->server.next_seq, ssn->client.last_ack); #endif - //StreamTcpSessionPktFree(p); } break; default: @@ -1760,30 +1764,35 @@ int StreamTcpGetFlowState(void *s) { static int StreamTcpTest01 (void) { Packet p; Flow f; - TcpSession ssn1; memset (&p, 0, sizeof(Packet)); memset (&f, 0, sizeof(Flow)); - memset(&ssn1, 0, sizeof (TcpSession)); - f.protoctx = &ssn1; p.flow = &f; + int ret = 0; StreamTcpInitConfig(TRUE); + TcpSession *ssn = StreamTcpNewSession(&p); if (ssn == NULL) { printf("Session can not be allocated \n"); - return 0; + goto end; } + f.protoctx = ssn; + if (ssn->aldata != NULL) { printf("AppLayer field not set to NULL \n"); - return 0; + goto end; } if (ssn->state != 0) { printf("TCP state field not set to 0 \n"); - return 0; + goto end; } StreamTcpSessionPktFree(&p); - return 1; + + ret = 1; +end: + StreamTcpFreeConfig(TRUE); + return ret; } /** @@ -1797,34 +1806,33 @@ static int StreamTcpTest01 (void) { static int StreamTcpTest02 (void) { Packet p; Flow f; - TcpSession ssn; ThreadVars tv; StreamTcpThread stt; u_int8_t payload[4]; TCPHdr tcph; memset (&p, 0, sizeof(Packet)); memset (&f, 0, sizeof(Flow)); - memset(&ssn, 0, sizeof (TcpSession)); memset(&tv, 0, sizeof (ThreadVars)); memset(&stt, 0, sizeof (StreamTcpThread)); memset(&tcph, 0, sizeof (TCPHdr)); - f.protoctx = &ssn; p.flow = &f; - tcph.th_win = htons(5480); tcph.th_flags = TH_SYN; p.tcph = &tcph; p.flowflags = FLOW_PKT_TOSERVER; + int ret = 0; + + StreamTcpInitConfig(TRUE); if (StreamTcpPacket(&tv, &p, &stt) == -1) - return 0; + goto end; p.tcph->th_ack = htonl(1); p.tcph->th_flags = TH_SYN | TH_ACK; p.flowflags = FLOW_PKT_TOCLIENT; if (StreamTcpPacket(&tv, &p, &stt) == -1) - return 0; + goto end; p.tcph->th_ack = htonl(1); p.tcph->th_seq = htonl(1); @@ -1832,7 +1840,7 @@ static int StreamTcpTest02 (void) { p.flowflags = FLOW_PKT_TOSERVER; if (StreamTcpPacket(&tv, &p, &stt) == -1) - return 0; + goto end; p.tcph->th_ack = htonl(1); p.tcph->th_seq = htonl(2); @@ -1844,11 +1852,11 @@ static int StreamTcpTest02 (void) { p.payload_len = 3; if (StreamTcpPacket(&tv, &p, &stt) == -1) - return 0; + goto end; p.flowflags = FLOW_PKT_TOCLIENT; if (StreamTcpPacket(&tv, &p, &stt) == -1) - return 0; + goto end; p.tcph->th_ack = htonl(1); p.tcph->th_seq = htonl(6); @@ -1860,16 +1868,20 @@ static int StreamTcpTest02 (void) { p.payload_len = 3; if (StreamTcpPacket(&tv, &p, &stt) == -1) - return 0; + goto end; p.flowflags = FLOW_PKT_TOCLIENT; if (StreamTcpPacket(&tv, &p, &stt) == -1) - return 0; + goto end; StreamTcpSessionPktFree(&p); if (p.flow->protoctx != NULL) - return 0; - return 1; + goto end; + + ret = 1; +end: + StreamTcpFreeConfig(TRUE); + return ret; } /** @@ -1883,27 +1895,27 @@ static int StreamTcpTest02 (void) { static int StreamTcpTest03 (void) { Packet p; Flow f; - TcpSession ssn; ThreadVars tv; StreamTcpThread stt; TCPHdr tcph; memset (&p, 0, sizeof(Packet)); memset (&f, 0, sizeof(Flow)); - memset(&ssn, 0, sizeof (TcpSession)); memset(&tv, 0, sizeof (ThreadVars)); memset(&stt, 0, sizeof (StreamTcpThread)); memset(&tcph, 0, sizeof (TCPHdr)); - f.protoctx = &ssn; p.flow = &f; + StreamTcpInitConfig(TRUE); + tcph.th_win = htons(5480); tcph.th_seq = htonl(10); tcph.th_ack = htonl(20); tcph.th_flags = TH_SYN|TH_ACK; p.tcph = &tcph; + int ret = 0; if (StreamTcpPacket(&tv, &p, &stt) == -1) - return 0; + goto end; p.tcph->th_seq = htonl(20); p.tcph->th_ack = htonl(11); @@ -1911,7 +1923,7 @@ static int StreamTcpTest03 (void) { p.flowflags = FLOW_PKT_TOSERVER; if (StreamTcpPacket(&tv, &p, &stt) == -1) - return 0; + goto end; p.tcph->th_seq = htonl(19); p.tcph->th_ack = htonl(11); @@ -1919,19 +1931,25 @@ static int StreamTcpTest03 (void) { p.flowflags = FLOW_PKT_TOSERVER; if (StreamTcpPacket(&tv, &p, &stt) == -1) - return 0; + goto end; - if (stream_config.midstream != TRUE) - return 1; + if (stream_config.midstream != TRUE) { + ret = 1; + goto end; + } if (((TcpSession *)(p.flow->protoctx))->state != TCP_ESTABLISHED) - return 0; + goto end; if (((TcpSession *)(p.flow->protoctx))->client.next_seq != 20 || ((TcpSession *)(p.flow->protoctx))->server.next_seq != 11) - return 0; + goto end; StreamTcpSessionPktFree(&p); - return 1; + + ret = 1; +end: + StreamTcpFreeConfig(TRUE); + return ret; } /** @@ -1945,27 +1963,28 @@ static int StreamTcpTest03 (void) { static int StreamTcpTest04 (void) { Packet p; Flow f; - TcpSession ssn; ThreadVars tv; StreamTcpThread stt; TCPHdr tcph; memset (&p, 0, sizeof(Packet)); memset (&f, 0, sizeof(Flow)); - memset(&ssn, 0, sizeof (TcpSession)); memset(&tv, 0, sizeof (ThreadVars)); memset(&stt, 0, sizeof (StreamTcpThread)); memset(&tcph, 0, sizeof (TCPHdr)); - f.protoctx = &ssn; p.flow = &f; + StreamTcpInitConfig(TRUE); + tcph.th_win = htons(5480); tcph.th_seq = htonl(10); tcph.th_ack = htonl(20); tcph.th_flags = TH_ACK; p.tcph = &tcph; + int ret = 0; + if (StreamTcpPacket(&tv, &p, &stt) == -1) - return 0; + goto end; p.tcph->th_seq = htonl(9); p.tcph->th_ack = htonl(19); @@ -1973,19 +1992,25 @@ static int StreamTcpTest04 (void) { p.flowflags = FLOW_PKT_TOSERVER; if (StreamTcpPacket(&tv, &p, &stt) == -1) - return 0; + goto end; - if (stream_config.midstream != TRUE) - return 1; + if (stream_config.midstream != TRUE) { + ret = 1; + goto end; + } if (((TcpSession *)(p.flow->protoctx))->state != TCP_ESTABLISHED) - return 0; + goto end; if (((TcpSession *)(p.flow->protoctx))->client.next_seq != 10 || ((TcpSession *)(p.flow->protoctx))->server.next_seq != 20) - return 0; + goto end; StreamTcpSessionPktFree(&p); - return 1; + + ret = 1; +end: + StreamTcpFreeConfig(TRUE); + return ret; } /** @@ -1999,19 +2024,19 @@ static int StreamTcpTest04 (void) { static int StreamTcpTest05 (void) { Packet p; Flow f; - TcpSession ssn; ThreadVars tv; StreamTcpThread stt; TCPHdr tcph; u_int8_t payload[4]; memset (&p, 0, sizeof(Packet)); memset (&f, 0, sizeof(Flow)); - memset(&ssn, 0, sizeof (TcpSession)); memset(&tv, 0, sizeof (ThreadVars)); memset(&stt, 0, sizeof (StreamTcpThread)); memset(&tcph, 0, sizeof (TCPHdr)); - f.protoctx = &ssn; p.flow = &f; + int ret = 0; + + StreamTcpInitConfig(TRUE); /* prevent L7 from kicking in */ StreamMsgQueueSetMinInitChunkLen(FLOW_PKT_TOSERVER, 4096); @@ -2030,7 +2055,7 @@ static int StreamTcpTest05 (void) { p.payload_len = 3; if (StreamTcpPacket(&tv, &p, &stt) == -1) - return 0; + goto end; p.tcph->th_seq = htonl(20); p.tcph->th_ack = htonl(13); @@ -2042,7 +2067,7 @@ static int StreamTcpTest05 (void) { p.payload_len = 3; if (StreamTcpPacket(&tv, &p, &stt) == -1) - return 0; + goto end; p.tcph->th_seq = htonl(13); p.tcph->th_ack = htonl(23); @@ -2054,7 +2079,7 @@ static int StreamTcpTest05 (void) { p.payload_len = 3; if (StreamTcpPacket(&tv, &p, &stt) == -1) - return 0; + goto end; p.tcph->th_seq = htonl(19); p.tcph->th_ack = htonl(16); @@ -2066,18 +2091,25 @@ static int StreamTcpTest05 (void) { p.payload_len = 3; if (StreamTcpPacket(&tv, &p, &stt) == -1) - return 0; + goto end; - if (stream_config.midstream != TRUE) - return 1; + if (stream_config.midstream != TRUE) { + ret = 1; + goto end; + } if (((TcpSession *)(p.flow->protoctx))->state != TCP_ESTABLISHED) - return 0; + goto end; if (((TcpSession *)(p.flow->protoctx))->client.next_seq != 16 || ((TcpSession *)(p.flow->protoctx))->server.next_seq != 23) - return 0; + goto end; + StreamTcpSessionPktFree(&p); - return 1; + + ret = 1; +end: + StreamTcpFreeConfig(TRUE); + return ret; } /** @@ -2102,23 +2134,30 @@ static int StreamTcpTest06 (void) { memset(&stt, 0, sizeof (StreamTcpThread)); memset(&tcph, 0, sizeof (TCPHdr)); p.flow = &f; + int ret = 0; + + StreamTcpInitConfig(TRUE); tcph.th_flags = TH_FIN; p.tcph = &tcph; if (StreamTcpPacket(&tv, &p, &stt) == -1) - return 0; + goto end; if (((TcpSession *)(p.flow->protoctx)) != NULL) - return 0; + goto end; p.tcph->th_flags = TH_RST; if (StreamTcpPacket(&tv, &p, &stt) == -1) - return 0; + goto end; if (((TcpSession *)(p.flow->protoctx)) != NULL) - return 0; - return 1; + goto end; + + ret = 1; +end: + StreamTcpFreeConfig(TRUE); + return ret; } #endif /* UNITTESTS */ diff --git a/src/stream.c b/src/stream.c index ca2fe78631..371e757250 100644 --- a/src/stream.c +++ b/src/stream.c @@ -144,19 +144,20 @@ void StreamMsgPutInQueue(StreamMsg *s) } void StreamMsgQueuesInit(void) { + pthread_mutex_init(&stream_pool_memuse_mutex, NULL); memset(&stream_q, 0, sizeof(stream_q)); stream_msg_pool = PoolInit(5000,250,StreamMsgAlloc,NULL,StreamMsgFree); if (stream_msg_pool == NULL) - exit(1); /* XXX */ - - pthread_mutex_init(&stream_pool_memuse_mutex, NULL); + exit(1); /* XXX */ } -void StreamMsgQueuesDeinit(void) { +void StreamMsgQueuesDeinit(char quiet) { PoolFree(stream_msg_pool); + pthread_mutex_destroy(&stream_pool_memuse_mutex); - printf("StreamMsgQueuesDeinit: stream_pool_memuse %"PRIu64", stream_pool_memcnt %"PRIu64"\n", stream_pool_memuse, stream_pool_memcnt); + if (quiet == FALSE) + printf("StreamMsgQueuesDeinit: stream_pool_memuse %"PRIu64", stream_pool_memcnt %"PRIu64"\n", stream_pool_memuse, stream_pool_memcnt); } StreamMsgQueue *StreamMsgQueueGetByPort(uint16_t port) { diff --git a/src/stream.h b/src/stream.h index 285b5f5031..4baa764e72 100644 --- a/src/stream.h +++ b/src/stream.h @@ -49,7 +49,7 @@ typedef struct StreamMsgQueue_ { /* prototypes */ void StreamMsgQueuesInit(void); -void StreamMsgQueuesDeinit(void); +void StreamMsgQueuesDeinit(char); StreamMsg *StreamMsgGetFromPool(void); void StreamMsgReturnToPool(StreamMsg *); diff --git a/src/util-pool.c b/src/util-pool.c index 4302761ab7..1b35fbd684 100644 --- a/src/util-pool.c +++ b/src/util-pool.c @@ -81,6 +81,7 @@ void PoolFree(Pool *p) { PoolBucket *pb = p->alloc_list; p->alloc_list = pb->next; p->Free(pb->data); + pb->data = NULL; free(pb); }