From 1774ff18a6ab28233f7b31e0fb6b799d81abf34d Mon Sep 17 00:00:00 2001 From: Juliana Fajardini Date: Thu, 28 Jul 2022 12:04:45 -0300 Subject: [PATCH] decode: make PacketDrop use action as parameter A Packet may be dropped due to several different reasons. This change adds action as a parameter, so we can update the packet action when we drop it, instead of setting it to drop. Related to Bug #5458 --- src/decode.h | 24 ++++++++++++------------ src/detect-engine-alert.c | 2 +- src/detect-engine-threshold.c | 2 +- src/detect.c | 2 +- src/stream-tcp.c | 4 ++-- src/util-exception-policy.c | 2 +- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/decode.h b/src/decode.h index cc8ee21d84..5f08c37ef5 100644 --- a/src/decode.h +++ b/src/decode.h @@ -922,12 +922,22 @@ static inline void PacketSetAction(Packet *p, const uint8_t a) #define PACKET_TEST_ACTION(p, a) (p)->action &(a) -static inline void PacketDrop(Packet *p, enum PacketDropReason r) +#define PACKET_UPDATE_ACTION(p, a) (p)->action |= (a) +static inline void PacketUpdateAction(Packet *p, const uint8_t a) +{ + if (likely(p->root == NULL)) { + PACKET_UPDATE_ACTION(p, a); + } else { + PACKET_UPDATE_ACTION(p->root, a); + } +} + +static inline void PacketDrop(Packet *p, const uint8_t action, enum PacketDropReason r) { if (p->drop_reason == PKT_DROP_REASON_NOT_SET) p->drop_reason = (uint8_t)r; - PACKET_SET_ACTION(p, ACTION_DROP); + PACKET_UPDATE_ACTION(p, action); } static inline void PacketPass(Packet *p) @@ -944,16 +954,6 @@ static inline uint8_t PacketTestAction(const Packet *p, const uint8_t a) } } -#define PACKET_UPDATE_ACTION(p, a) (p)->action |= (a) -static inline void PacketUpdateAction(Packet *p, const uint8_t a) -{ - if (likely(p->root == NULL)) { - PACKET_UPDATE_ACTION(p, a); - } else { - PACKET_UPDATE_ACTION(p->root, a); - } -} - #define TUNNEL_INCR_PKT_RTV_NOLOCK(p) do { \ ((p)->root ? (p)->root->tunnel_rtv_cnt++ : (p)->tunnel_rtv_cnt++); \ } while (0) diff --git a/src/detect-engine-alert.c b/src/detect-engine-alert.c index 5ba5ae630d..f6da8201ca 100644 --- a/src/detect-engine-alert.c +++ b/src/detect-engine-alert.c @@ -184,7 +184,7 @@ static void PacketApplySignatureActions(Packet *p, const Signature *s, const uin s->action, alert_flags); if (s->action & ACTION_DROP) { - PacketDrop(p, PKT_DROP_REASON_RULES); + PacketDrop(p, s->action, PKT_DROP_REASON_RULES); if (p->alerts.drop.action == 0) { p->alerts.drop.num = s->num; diff --git a/src/detect-engine-threshold.c b/src/detect-engine-threshold.c index d7d0ce50bb..e2a9019abf 100644 --- a/src/detect-engine-threshold.c +++ b/src/detect-engine-threshold.c @@ -300,7 +300,7 @@ static inline void RateFilterSetAction(Packet *p, PacketAlert *pa, uint8_t new_a pa->flags |= PACKET_ALERT_RATE_FILTER_MODIFIED; break; case TH_ACTION_DROP: - PacketDrop(p, PKT_DROP_REASON_RULES_THRESHOLD); + PacketDrop(p, new_action, PKT_DROP_REASON_RULES_THRESHOLD); pa->flags |= PACKET_ALERT_RATE_FILTER_MODIFIED; break; case TH_ACTION_REJECT: diff --git a/src/detect.c b/src/detect.c index 0a66628591..6baa9642b6 100644 --- a/src/detect.c +++ b/src/detect.c @@ -1684,7 +1684,7 @@ static void DetectFlow(ThreadVars *tv, /* if flow is set to drop, we enforce that here */ if (p->flow->flags & FLOW_ACTION_DROP) { - PacketDrop(p, PKT_DROP_REASON_FLOW_DROP); + PacketDrop(p, ACTION_DROP, PKT_DROP_REASON_FLOW_DROP); SCReturn; } diff --git a/src/stream-tcp.c b/src/stream-tcp.c index 1d354b0011..8303202079 100644 --- a/src/stream-tcp.c +++ b/src/stream-tcp.c @@ -4963,7 +4963,7 @@ int StreamTcpPacket (ThreadVars *tv, Packet *p, StreamTcpThread *stt, FlowSetNoPacketInspectionFlag(p->flow); DecodeSetNoPacketInspectionFlag(p); StreamTcpDisableAppLayer(p->flow); - PacketDrop(p, PKT_DROP_REASON_FLOW_DROP); + PacketDrop(p, ACTION_DROP, PKT_DROP_REASON_FLOW_DROP); /* return the segments to the pool */ StreamTcpSessionPktFree(p); SCReturnInt(0); @@ -5131,7 +5131,7 @@ error: * anyway. Doesn't disable all detection, so we can still * match on the stream event that was set. */ DecodeSetNoPayloadInspectionFlag(p); - PacketDrop(p, PKT_DROP_REASON_STREAM_ERROR); + PacketDrop(p, ACTION_DROP, PKT_DROP_REASON_STREAM_ERROR); } SCReturnInt(-1); } diff --git a/src/util-exception-policy.c b/src/util-exception-policy.c index da51fbd31a..a81f7660b1 100644 --- a/src/util-exception-policy.c +++ b/src/util-exception-policy.c @@ -41,7 +41,7 @@ void ExceptionPolicyApply(Packet *p, enum ExceptionPolicy policy, enum PacketDro SCLogDebug("EXCEPTION_POLICY_DROP_PACKET"); DecodeSetNoPayloadInspectionFlag(p); DecodeSetNoPacketInspectionFlag(p); - PacketDrop(p, drop_reason); + PacketDrop(p, ACTION_DROP, drop_reason); break; case EXCEPTION_POLICY_BYPASS_FLOW: PacketBypassCallback(p);