diff options
| author | yangwei <[email protected]> | 2023-07-24 10:52:04 +0800 |
|---|---|---|
| committer | yangwei <[email protected]> | 2023-07-24 10:52:04 +0800 |
| commit | c97be84ec7cc4847ace846bb96a8714ad201f2f2 (patch) | |
| tree | ceeb69dfe66c8cfc1116b344614c05e851553296 | |
| parent | dd2b93361c967bfb8b3a623fefa3b493ea709e1a (diff) | |
🐞 fix(checkstreamorder_for_gtp_tunnel): GTP隧道地址比较时,增加待比较地址长度的快速判断,避免内存越界
| -rw-r--r-- | src/dealpkt/stream_manage.c | 87 |
1 files changed, 45 insertions, 42 deletions
diff --git a/src/dealpkt/stream_manage.c b/src/dealpkt/stream_manage.c index ddf170e..9dd1d40 100644 --- a/src/dealpkt/stream_manage.c +++ b/src/dealpkt/stream_manage.c @@ -1070,56 +1070,59 @@ static int checkstreamorder_for_gtp_tunnel(const struct streaminfo_private *top_ /* ���ip��ַ��仯, ���ĸ�ip�����ܶ���һ��, �����ⷽ���ַ��ͬ, ������Ϊ������ͬһ��GTP���� TODO, �˴���ҪͬGTP-C���� ?? */ - if (pheap_stream->addr.addrtype == ADDR_TYPE_IPV4) + if (pheap_stream->addr.addrlen == pstack_stream->addr.addrlen) { - if (pheap_stream->addr.tuple4_v4->saddr == pstack_stream->addr.tuple4_v4->saddr) + if (pheap_stream->addr.addrtype == ADDR_TYPE_IPV4) { - this_layer_is_same = 1; - cur_pkt_dir = DIR_C2S; - } - else if (pheap_stream->addr.tuple4_v4->daddr == pstack_stream->addr.tuple4_v4->daddr) - { - this_layer_is_same = 1; - cur_pkt_dir = DIR_C2S; - } - else if (pheap_stream->addr.tuple4_v4->saddr == pstack_stream->addr.tuple4_v4->daddr) - { - this_layer_is_same = 1; - cur_pkt_dir = DIR_S2C; - } - else if (pheap_stream->addr.tuple4_v4->daddr == pstack_stream->addr.tuple4_v4->saddr) - { - this_layer_is_same = 1; - cur_pkt_dir = DIR_S2C; - } - } - else if(pheap_stream->addr.addrtype == ADDR_TYPE_IPV6) - { - if (0 == memcmp(pheap_stream->addr.tuple4_v6->saddr,pstack_stream->addr.tuple4_v6->saddr, IPV6_ADDR_LEN)) - { - this_layer_is_same = 1; - cur_pkt_dir = DIR_C2S; - } - else if (0 == memcmp(pheap_stream->addr.tuple4_v6->daddr,pstack_stream->addr.tuple4_v6->daddr, IPV6_ADDR_LEN)) - { - this_layer_is_same = 1; - cur_pkt_dir = DIR_C2S; - } - else if (0 == memcmp(pheap_stream->addr.tuple4_v6->saddr,pstack_stream->addr.tuple4_v6->daddr, IPV6_ADDR_LEN)) - { - this_layer_is_same = 1; - cur_pkt_dir = DIR_S2C; + if (pheap_stream->addr.tuple4_v4->saddr == pstack_stream->addr.tuple4_v4->saddr) + { + this_layer_is_same = 1; + cur_pkt_dir = DIR_C2S; + } + else if (pheap_stream->addr.tuple4_v4->daddr == pstack_stream->addr.tuple4_v4->daddr) + { + this_layer_is_same = 1; + cur_pkt_dir = DIR_C2S; + } + else if (pheap_stream->addr.tuple4_v4->saddr == pstack_stream->addr.tuple4_v4->daddr) + { + this_layer_is_same = 1; + cur_pkt_dir = DIR_S2C; + } + else if (pheap_stream->addr.tuple4_v4->daddr == pstack_stream->addr.tuple4_v4->saddr) + { + this_layer_is_same = 1; + cur_pkt_dir = DIR_S2C; + } } - else if (0 == memcmp(pheap_stream->addr.tuple4_v6->daddr,pstack_stream->addr.tuple4_v6->saddr, IPV6_ADDR_LEN)) + else if (pheap_stream->addr.addrtype == ADDR_TYPE_IPV6) { - this_layer_is_same = 1; - cur_pkt_dir = DIR_S2C; + if (0 == memcmp(pheap_stream->addr.tuple4_v6->saddr, pstack_stream->addr.tuple4_v6->saddr, IPV6_ADDR_LEN)) + { + this_layer_is_same = 1; + cur_pkt_dir = DIR_C2S; + } + else if (0 == memcmp(pheap_stream->addr.tuple4_v6->daddr, pstack_stream->addr.tuple4_v6->daddr, IPV6_ADDR_LEN)) + { + this_layer_is_same = 1; + cur_pkt_dir = DIR_C2S; + } + else if (0 == memcmp(pheap_stream->addr.tuple4_v6->saddr, pstack_stream->addr.tuple4_v6->daddr, IPV6_ADDR_LEN)) + { + this_layer_is_same = 1; + cur_pkt_dir = DIR_S2C; + } + else if (0 == memcmp(pheap_stream->addr.tuple4_v6->daddr, pstack_stream->addr.tuple4_v6->saddr, IPV6_ADDR_LEN)) + { + this_layer_is_same = 1; + cur_pkt_dir = DIR_S2C; + } } } else { sapp_runtime_log(RLOG_LV_FATAL, "stream:%s, curdir:%d, addrtype:%d for GTP tunnel, heap stream tuple4 addr not IPv4 or IPv6", - printaddr(&top_stream_pr->stream_public.addr, top_stream_pr->stream_public.threadnum), cur_pkt_dir, pheap_stream->addr.addrtype); + printaddr(&top_stream_pr->stream_public.addr, top_stream_pr->stream_public.threadnum), cur_pkt_dir, pheap_stream->addr.addrtype); } if(0 == this_layer_is_same){ /* �����ַȫ��һ��, ��Ϊ��������һ������, ֱ�ӷ��ش��� */ @@ -1129,7 +1132,7 @@ static int checkstreamorder_for_gtp_tunnel(const struct streaminfo_private *top_ /* �����Ƚ���һ���ַ */ ret=checkstreamorder(top_stream_pr, (struct streaminfo_private *)(pheap_ip_stream_pr->pfather_pr), (struct streaminfo_private *)(pstack_ip_stream_pr->pfather_pr), - heap_streaminfo_skip_layer_num, stack_streaminfo_skip_layer_num); + heap_streaminfo_skip_layer_num, stack_streaminfo_skip_layer_num); if(0 == ret){ /* ִ�е���, ���е�ַ����ͬ, �����Dz����ڵ�ַ�Ƚ�, ˵����ǰ��pheap_stream_pr,pstack_stream_pr��ͬ����һ���ϲ�TCP/UDP��, |
