summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryangwei <[email protected]>2023-07-24 10:52:04 +0800
committeryangwei <[email protected]>2023-07-24 10:52:04 +0800
commitc97be84ec7cc4847ace846bb96a8714ad201f2f2 (patch)
treeceeb69dfe66c8cfc1116b344614c05e851553296
parentdd2b93361c967bfb8b3a623fefa3b493ea709e1a (diff)
🐞 fix(checkstreamorder_for_gtp_tunnel): GTP隧道地址比较时,增加待比较地址长度的快速判断,避免内存越界
-rw-r--r--src/dealpkt/stream_manage.c87
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��,