summaryrefslogtreecommitdiffstats
path: root/src/detect-requires.c
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 17:39:49 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 17:39:49 +0000
commita0aa2307322cd47bbf416810ac0292925e03be87 (patch)
tree37076262a026c4b48c8a0e84f44ff9187556ca35 /src/detect-requires.c
parentInitial commit. (diff)
downloadsuricata-a0aa2307322cd47bbf416810ac0292925e03be87.tar.xz
suricata-a0aa2307322cd47bbf416810ac0292925e03be87.zip
Adding upstream version 1:7.0.3.upstream/1%7.0.3
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/detect-requires.c')
-rw-r--r--src/detect-requires.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/detect-requires.c b/src/detect-requires.c
new file mode 100644
index 0000000..4d7f916
--- /dev/null
+++ b/src/detect-requires.c
@@ -0,0 +1,50 @@
+/* Copyright (C) 2023 Open Information Security Foundation
+ *
+ * You can copy, redistribute or modify this Program under the terms of
+ * the GNU General Public License version 2 as published by the Free
+ * Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * version 2 along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+#include "detect-requires.h"
+#include "suricata-common.h"
+#include "detect-engine.h"
+#include "rust.h"
+
+static int DetectRequiresSetup(DetectEngineCtx *de_ctx, Signature *s, const char *rawstr)
+{
+ if (de_ctx->requirements == NULL) {
+ de_ctx->requirements = (void *)SCDetectRequiresStatusNew();
+ BUG_ON(de_ctx->requirements == NULL);
+ }
+
+ const char *errmsg = NULL;
+ int res = SCDetectCheckRequires(rawstr, PROG_VER, &errmsg, de_ctx->requirements);
+ if (res == -1) {
+ // The requires expression is bad, log an error.
+ SCLogError("%s: %s", errmsg, rawstr);
+ de_ctx->sigerror = errmsg;
+ } else if (res < -1) {
+ // This Suricata instance didn't meet the requirements.
+ SCLogInfo("Suricata did not meet the rule requirements: %s: %s", errmsg, rawstr);
+ return -4;
+ }
+ return res;
+}
+
+void DetectRequiresRegister(void)
+{
+ sigmatch_table[DETECT_REQUIRES].name = "requires";
+ sigmatch_table[DETECT_REQUIRES].desc = "require Suricata version or features";
+ sigmatch_table[DETECT_REQUIRES].url = "/rules/meta-keywords.html#requires";
+ sigmatch_table[DETECT_REQUIRES].Setup = DetectRequiresSetup;
+}