Skip to content

Commit 181b3b2

Browse files
committed
flow: check ip family when comparing
Ticket: 8558 Do not accept an IPv6 as an IPv4 (even if the hash is likely different in the first place) Do the check also for ESP, and ebpf (cherry picked from commit bc41dcc)
1 parent 5cde93d commit 181b3b2

1 file changed

Lines changed: 12 additions & 4 deletions

File tree

src/flow-hash.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,9 @@ static inline bool CmpFlowPacket(const Flow *f, const Packet *p)
412412
const uint32_t *p_dst = p->dst.address.address_un_data32;
413413
return CmpAddrsAndPorts(f_src, f_dst, f->sp, f->dp, p_src, p_dst, p->sp, p->dp) &&
414414
f->proto == p->proto && f->recursion_level == p->recursion_level &&
415-
CmpVlanIds(f->vlan_id, p->vlan_id) && (f->livedev == p->livedev || g_livedev_mask == 0);
415+
CmpVlanIds(f->vlan_id, p->vlan_id) &&
416+
((p->src.family == AF_INET) == FLOW_IS_IPV4(f)) &&
417+
(f->livedev == p->livedev || g_livedev_mask == 0);
416418
}
417419

418420
static inline bool CmpFlowKey(const Flow *f, const FlowKey *k)
@@ -423,7 +425,9 @@ static inline bool CmpFlowKey(const Flow *f, const FlowKey *k)
423425
const uint32_t *k_dst = k->dst.address.address_un_data32;
424426
return CmpAddrsAndPorts(f_src, f_dst, f->sp, f->dp, k_src, k_dst, k->sp, k->dp) &&
425427
f->proto == k->proto && f->recursion_level == k->recursion_level &&
426-
CmpVlanIds(f->vlan_id, k->vlan_id) && CmpLiveDevIds(f->livedev, k->livedev_id);
428+
CmpVlanIds(f->vlan_id, k->vlan_id) &&
429+
((k->src.family == AF_INET) == FLOW_IS_IPV4(f)) &&
430+
CmpLiveDevIds(f->livedev, k->livedev_id);
427431
}
428432

429433
static inline bool CmpAddrsAndICMPTypes(const uint32_t src1[4],
@@ -471,7 +475,9 @@ static inline int FlowCompareICMPv4(Flow *f, const Packet *p)
471475
if ((f->src.addr_data32[0] == IPV4_GET_RAW_IPSRC_U32(ICMPV4_GET_EMB_IPV4(p))) &&
472476
(f->dst.addr_data32[0] == IPV4_GET_RAW_IPDST_U32(ICMPV4_GET_EMB_IPV4(p))) &&
473477
f->sp == p->icmpv4vars.emb_sport && f->dp == p->icmpv4vars.emb_dport &&
474-
f->proto == ICMPV4_GET_EMB_PROTO(p) && f->recursion_level == p->recursion_level &&
478+
f->proto == ICMPV4_GET_EMB_PROTO(p) &&
479+
((p->src.family == AF_INET) == FLOW_IS_IPV4(f)) &&
480+
f->recursion_level == p->recursion_level &&
475481
CmpVlanIds(f->vlan_id, p->vlan_id) &&
476482
(f->livedev == p->livedev || g_livedev_mask == 0)) {
477483
return 1;
@@ -482,6 +488,7 @@ static inline int FlowCompareICMPv4(Flow *f, const Packet *p)
482488
(f->src.addr_data32[0] == IPV4_GET_RAW_IPDST_U32(ICMPV4_GET_EMB_IPV4(p))) &&
483489
f->dp == p->icmpv4vars.emb_sport && f->sp == p->icmpv4vars.emb_dport &&
484490
f->proto == ICMPV4_GET_EMB_PROTO(p) &&
491+
((p->src.family == AF_INET) == FLOW_IS_IPV4(f)) &&
485492
f->recursion_level == p->recursion_level && CmpVlanIds(f->vlan_id, p->vlan_id) &&
486493
(f->livedev == p->livedev || g_livedev_mask == 0)) {
487494
return 1;
@@ -514,7 +521,8 @@ static inline int FlowCompareESP(Flow *f, const Packet *p)
514521

515522
return CmpAddrs(f_src, p_src) && CmpAddrs(f_dst, p_dst) && f->proto == p->proto &&
516523
f->recursion_level == p->recursion_level && CmpVlanIds(f->vlan_id, p->vlan_id) &&
517-
f->esp.spi == ESP_GET_SPI(p) && (f->livedev == p->livedev || g_livedev_mask == 0);
524+
((p->src.family == AF_INET) == FLOW_IS_IPV4(f)) && f->esp.spi == ESP_GET_SPI(p) &&
525+
(f->livedev == p->livedev || g_livedev_mask == 0);
518526
}
519527

520528
void FlowSetupPacket(Packet *p)

0 commit comments

Comments
 (0)