• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

OISF / suricata / 23374838686

21 Mar 2026 07:29AM UTC coverage: 59.341% (-20.0%) from 79.315%
23374838686

Pull #15075

github

web-flow
Merge 90b4e834f into 6587e363a
Pull Request #15075: Stack 8001 v16.4

38 of 70 new or added lines in 10 files covered. (54.29%)

34165 existing lines in 563 files now uncovered.

119621 of 201584 relevant lines covered (59.34%)

650666.92 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

68.25
/src/packet-queue.c
1
/* Copyright (C) 2007-2019 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
 * Packet Queue portion of the engine.
24
 */
25

26
#include "suricata-common.h"
27
#include "decode.h"
28
#include "packet-queue.h"
29
#include "threads.h"
30
#include "suricata.h"
31
#include "util-var.h"
32
#include "pkt-var.h"
33
#include "util-validate.h"
34

35
#ifdef DEBUG
36
void PacketQueueValidateDebug(PacketQueue *q);
37
void PacketQueueValidate(PacketQueue *q);
38

39
void PacketQueueValidateDebug(PacketQueue *q)
40
{
41
    SCLogDebug("q->len %u, q->top %p, q->bot %p", q->len, q->top, q->bot);
42

43
    if (q->len == 0) {
44
        BUG_ON(q->top != NULL);
45
        BUG_ON(q->bot != NULL);
46
    } else if(q->len == 1) {
47
        SCLogDebug("q->top->next %p, q->top->prev %p", q->top->next, q->top->prev);
48
        SCLogDebug("q->bot->next %p, q->bot->prev %p", q->bot->next, q->bot->prev);
49

50
        BUG_ON(q->top != q->bot);
51
        BUG_ON(q->top->next != NULL);
52
        BUG_ON(q->bot->next != NULL);
53
        BUG_ON(q->top->prev != NULL);
54
        BUG_ON(q->bot->prev != NULL);
55
    } else if (q->len == 2) {
56
        SCLogDebug("q->top->next %p, q->top->prev %p", q->top->next, q->top->prev);
57
        SCLogDebug("q->bot->next %p, q->bot->prev %p", q->bot->next, q->bot->prev);
58

59
        BUG_ON(q->top == NULL);
60
        BUG_ON(q->bot == NULL);
61

62
        BUG_ON(q->top == q->bot);
63

64
        BUG_ON(q->top->prev != NULL);
65
        BUG_ON(q->top->next != q->bot);
66

67
        BUG_ON(q->bot->prev != q->top);
68
        BUG_ON(q->bot->next != NULL);
69
    } else {
70
        BUG_ON(q->top == NULL);
71
        BUG_ON(q->bot == NULL);
72

73
        SCLogDebug("q->top->next %p, q->top->prev %p", q->top->next, q->top->prev);
74
        SCLogDebug("q->bot->next %p, q->bot->prev %p", q->bot->next, q->bot->prev);
75

76
        BUG_ON(q->top == q->bot);
77
        BUG_ON(q->top->prev != NULL);
78
        BUG_ON(q->bot->next != NULL);
79

80
        BUG_ON(q->top->next == q->bot);
81
        BUG_ON(q->bot->prev == q->top);
82

83
        Packet *p, *pp;
84
        for (p = q->top, pp = p->prev; p != NULL; pp = p, p = p->next) {
85
            SCLogDebug("p %p, pp %p, p->next %p, p->prev %p", p, pp, p->next, p->prev);
86
            BUG_ON(pp != p->prev);
87
        }
88

89
    }
90
}
91

92
#define BUGGER_ON(cond) { \
93
    if ((cond)) { \
94
        PacketQueueValidateDebug(q); \
95
    } \
96
}
97

98
void PacketQueueValidate(PacketQueue *q)
99
{
100
    if (q->len == 0) {
101
        BUGGER_ON(q->top != NULL);
102
        BUGGER_ON(q->bot != NULL);
103
    } else if(q->len == 1) {
104
        BUGGER_ON(q->top != q->bot);
105
        BUGGER_ON(q->top->next != NULL);
106
        BUGGER_ON(q->bot->next != NULL);
107
        BUGGER_ON(q->top->prev != NULL);
108
        BUGGER_ON(q->bot->prev != NULL);
109
    } else if (q->len == 2) {
110
        BUGGER_ON(q->top == NULL);
111
        BUGGER_ON(q->bot == NULL);
112

113
        BUGGER_ON(q->top == q->bot);
114

115
        BUGGER_ON(q->top->prev != NULL);
116
        BUGGER_ON(q->top->next != q->bot);
117

118
        BUGGER_ON(q->bot->prev != q->top);
119
        BUGGER_ON(q->bot->next != NULL);
120
    } else {
121
        BUGGER_ON(q->top == NULL);
122
        BUGGER_ON(q->bot == NULL);
123

124
        BUGGER_ON(q->top == q->bot);
125
        BUGGER_ON(q->top->prev != NULL);
126
        BUGGER_ON(q->bot->next != NULL);
127

128
        BUGGER_ON(q->top->next == q->bot);
129
        BUGGER_ON(q->bot->prev == q->top);
130

131
        Packet *p, *pp;
132
        for (p = q->top, pp = p->prev; p != NULL; pp = p, p = p->next) {
133
            BUGGER_ON(pp != p->prev);
134
        }
135

136
    }
137
}
138
#endif /* DEBUG */
139

140
static inline void PacketEnqueueDo(PacketQueue *q, Packet *p)
141
{
41,513✔
142
    //PacketQueueValidateDebug(q);
143

144
    if (p == NULL)
41,513✔
145
        return;
×
146

147
    /* more packets in queue */
148
    if (q->top != NULL) {
41,513✔
149
        p->prev = NULL;
5,118✔
150
        p->next = q->top;
5,118✔
151
        q->top->prev = p;
5,118✔
152
        q->top = p;
5,118✔
153
    /* only packet */
154
    } else {
36,395✔
155
        p->prev = NULL;
36,395✔
156
        p->next = NULL;
36,395✔
157
        q->top = p;
36,395✔
158
        q->bot = p;
36,395✔
159
    }
36,395✔
160
    q->len++;
41,513✔
161
#ifdef DBG_PERF
162
    if (q->len > q->dbg_maxlen)
163
        q->dbg_maxlen = q->len;
164
#endif /* DBG_PERF */
165
    //PacketQueueValidateDebug(q);
166
}
41,513✔
167

168
void PacketEnqueueNoLock(PacketQueueNoLock *qnl, Packet *p)
169
{
41,513✔
170
    DEBUG_VALIDATE_BUG_ON(p->pkt_src == 0);
41,513✔
171
    PacketQueue *q = (PacketQueue *)qnl;
41,513✔
172
    PacketEnqueueDo(q, p);
41,513✔
173
}
41,513✔
174

175
void PacketEnqueue (PacketQueue *q, Packet *p)
UNCOV
176
{
×
UNCOV
177
    PacketEnqueueDo(q, p);
×
UNCOV
178
}
×
179

180
static inline Packet *PacketDequeueDo (PacketQueue *q)
181
{
4,060,718✔
182
    //PacketQueueValidateDebug(q);
183
    /* if the queue is empty there are no packets left. */
184
    if (q->len == 0) {
4,060,718✔
185
        return NULL;
4,019,205✔
186
    }
4,019,205✔
187
    q->len--;
41,513✔
188

189
    /* pull the bottom packet from the queue */
190
    Packet *p = q->bot;
41,513✔
191

192
    /* more packets in queue */
193
    if (q->bot->prev != NULL) {
41,513✔
194
        q->bot = q->bot->prev;
5,118✔
195
        q->bot->next = NULL;
5,118✔
196
        /* just the one we remove, so now empty */
197
    } else {
36,395✔
198
        q->top = NULL;
36,395✔
199
        q->bot = NULL;
36,395✔
200
    }
36,395✔
201

202
    //PacketQueueValidateDebug(q);
203
    p->next = NULL;
41,513✔
204
    p->prev = NULL;
41,513✔
205
    return p;
41,513✔
206
}
4,060,718✔
207

208
Packet *PacketDequeueNoLock (PacketQueueNoLock *qnl)
209
{
4,060,718✔
210
    PacketQueue *q = (PacketQueue *)qnl;
4,060,718✔
211
    Packet *p = PacketDequeueDo(q);
4,060,718✔
212
    DEBUG_VALIDATE_BUG_ON(p != NULL && p->pkt_src == 0);
4,060,718✔
213
    return p;
4,060,718✔
214
}
4,060,718✔
215

216
Packet *PacketDequeue (PacketQueue *q)
UNCOV
217
{
×
UNCOV
218
    return PacketDequeueDo(q);
×
UNCOV
219
}
×
220

221
PacketQueue *PacketQueueAlloc(void)
UNCOV
222
{
×
UNCOV
223
    PacketQueue *pq = SCCalloc(1, sizeof(*pq));
×
UNCOV
224
    if (pq == NULL)
×
225
        return NULL;
×
UNCOV
226
    SCMutexInit(&pq->mutex_q, NULL);
×
UNCOV
227
    SCCondInit(&pq->cond_q, NULL);
×
UNCOV
228
    return pq;
×
UNCOV
229
}
×
230

231
void PacketQueueFree(PacketQueue *pq)
UNCOV
232
{
×
UNCOV
233
    SCCondDestroy(&pq->cond_q);
×
UNCOV
234
    SCMutexDestroy(&pq->mutex_q);
×
UNCOV
235
    SCFree(pq);
×
UNCOV
236
}
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc