suricata
util-var.c
Go to the documentation of this file.
1/* Copyright (C) 2007-2024 Open Information Security Foundation
2 *
3 * You can copy, redistribute or modify this Program under the terms of
4 * the GNU General Public License version 2 as published by the Free
5 * Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 * You should have received a copy of the GNU General Public License
13 * version 2 along with this program; if not, write to the Free Software
14 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
15 * 02110-1301, USA.
16 */
17
18/**
19 * \file
20 *
21 * \author Victor Julien <victor@inliniac.net>
22 *
23 * Generic variable utility functions
24 */
25
26#include "suricata-common.h"
27#include "detect.h"
29
30#include "util-var.h"
31
32#include "flow-var.h"
33#include "flow-bit.h"
34#include "pkt-var.h"
35#include "host-bit.h"
36#include "ippair-bit.h"
37#include "util-validate.h"
38#include "util-debug.h"
39
40void XBitFree(XBit *fb)
41{
42 if (fb == NULL)
43 return;
44
45 SCFree(fb);
46}
47
49{
50 if (gv == NULL)
51 return;
52
53 SCLogDebug("gv %p, gv->type %" PRIu32 "", gv, gv->type);
54 GenericVar *next_gv = gv->next;
55
56 switch (gv->type) {
57 case DETECT_FLOWBITS:
58 {
59 FlowBit *fb = (FlowBit *)gv;
60 //printf("GenericVarFree: fb %p, removing\n", fb);
61 FlowBitFree(fb);
62 break;
63 }
64 case DETECT_XBITS:
65 {
66 XBit *fb = (XBit *)gv;
67 //printf("GenericVarFree: fb %p, removing\n", fb);
68 XBitFree(fb);
69 break;
70 }
71 case DETECT_THRESHOLD: {
73 break;
74 }
75 case DETECT_FLOWVAR:
76 {
77 FlowVar *fv = (FlowVar *)gv;
78 FlowVarFree(fv);
79 break;
80 }
81 case DETECT_PKTVAR:
82 {
83 PktVar *pv = (PktVar *)gv;
84 PktVarFree(pv);
85 break;
86 }
87 default:
88 {
89 SCLogDebug("GenericVarFree unknown type %" PRIu32, gv->type);
91 break;
92 }
93 }
94
95 GenericVarFree(next_gv);
96}
97
99{
100 gv->next = NULL;
101
102 if (*list == NULL) {
103 *list = gv;
104 } else {
105 GenericVar *tgv = *list;
106 while(tgv) {
107 if (tgv->next == NULL) {
108 tgv->next = gv;
109 return;
110 }
111
112 tgv = tgv->next;
113 }
114 }
115}
116
118{
119 if (*list == NULL)
120 return;
121
122 GenericVar *listgv = *list, *prevgv = NULL;
123 while (listgv != NULL) {
124 if (listgv == gv) {
125 if (prevgv == NULL)
126 *list = gv->next;
127 else
128 prevgv->next = gv->next;
129
130 return;
131 }
132
133 prevgv = listgv;
134 listgv = listgv->next;
135 }
136}
137
138// Checks if a variable is already in a resolve list and if it's not, adds it.
139int AddVariableToResolveList(ResolvedVariablesList *list, const char *var)
140{
141 ResolvedVariable *p_item;
142
143 if (list == NULL || var == NULL)
144 return 0;
145
146 if (var[0] != '$') {
147 return 0;
148 }
149
150 TAILQ_FOREACH(p_item, list, next) {
151 if (!strcmp(p_item->var_name, var)) {
152 return -1;
153 }
154 }
155
156 p_item = SCMalloc(sizeof(ResolvedVariable));
157
158 if (unlikely(p_item == NULL)) {
159 return -1;
160 }
161
162 strlcpy(p_item->var_name, var, sizeof(p_item->var_name) - 1);
163 TAILQ_INSERT_TAIL(list, p_item, next);
164
165 return 0;
166}
167
168void CleanVariableResolveList(ResolvedVariablesList *var_list)
169{
170 if (var_list == NULL) {
171 return;
172 }
173
174 ResolvedVariable *p_item;
175
176 while ((p_item = TAILQ_FIRST(var_list))) {
177 TAILQ_REMOVE(var_list, p_item, next);
178 SCFree(p_item);
179 }
180}
struct HtpBodyChunk_ * next
@ DETECT_THRESHOLD
@ DETECT_FLOWBITS
void FlowBitFree(FlowBit *fb)
Definition flow-bit.c:143
void FlowVarFree(FlowVar *fv)
Definition flow-var.c:188
void FlowThresholdVarFree(void *ptr)
void PktVarFree(PktVar *pv)
Definition pkt-var.c:111
#define TAILQ_FOREACH(var, head, field)
Definition queue.h:252
#define TAILQ_INSERT_TAIL(head, elm, field)
Definition queue.h:294
#define TAILQ_FIRST(head)
Definition queue.h:250
#define TAILQ_REMOVE(head, elm, field)
Definition queue.h:312
uint16_t type
Definition util-var.h:54
struct GenericVar_ * next
Definition util-var.h:57
char var_name[256]
Definition util-var.h:73
size_t strlcpy(char *dst, const char *src, size_t siz)
#define SCLogDebug(...)
Definition util-debug.h:275
#define SCMalloc(sz)
Definition util-mem.h:47
#define SCFree(p)
Definition util-mem.h:61
#define unlikely(expr)
#define DEBUG_VALIDATE_BUG_ON(exp)
void GenericVarAppend(GenericVar **list, GenericVar *gv)
Definition util-var.c:98
void GenericVarFree(GenericVar *gv)
Definition util-var.c:48
void XBitFree(XBit *fb)
Definition util-var.c:40
void CleanVariableResolveList(ResolvedVariablesList *var_list)
Definition util-var.c:168
int AddVariableToResolveList(ResolvedVariablesList *list, const char *var)
Definition util-var.c:139
void GenericVarRemove(GenericVar **list, GenericVar *gv)
Definition util-var.c:117