summaryrefslogtreecommitdiff
path: root/infra
diff options
context:
space:
mode:
authorluwenpeng <[email protected]>2024-10-23 18:24:10 +0800
committerluwenpeng <[email protected]>2024-10-23 15:46:02 +0800
commit5c5a50929b54483480b058a27683fd37fedf11d0 (patch)
tree8c35b12dbbfc2cbc1f744e6cb4e2dfbf494fdc77 /infra
parent08b5ecd72811aedf01eccf4f567a1584718ac981 (diff)
bugfix: packet_push_frag() order
Diffstat (limited to 'infra')
-rw-r--r--infra/ip_reassembly/ip_reassembly.c31
1 files changed, 17 insertions, 14 deletions
diff --git a/infra/ip_reassembly/ip_reassembly.c b/infra/ip_reassembly/ip_reassembly.c
index c0d3e10..3ea4e3a 100644
--- a/infra/ip_reassembly/ip_reassembly.c
+++ b/infra/ip_reassembly/ip_reassembly.c
@@ -412,9 +412,9 @@ error_out:
static struct packet *ip_reassembly_defrag_fq(struct ip_reassembly *ip_reass, struct frag_queue *fq)
{
+ struct frag *frag = NULL;
struct frag *first = &fq->frags[IP_FIRST_FRAG_IDX];
struct frag *last = &fq->frags[IP_LAST_FRAG_IDX];
- struct frag *temp = NULL;
uint32_t loop = 0;
uint16_t last_offset = last->offset;
@@ -458,19 +458,19 @@ static struct packet *ip_reassembly_defrag_fq(struct ip_reassembly *ip_reass, st
*/
for (uint32_t i = fq->next_fill - 1; i >= IP_MIN_FRAG_NUM; i--)
{
- temp = &fq->frags[i];
- if (temp->offset + temp->len == last_offset)
+ frag = &fq->frags[i];
+ if (frag->offset + frag->len == last_offset)
{
- if (temp->len > end - ptr)
+ if (frag->len > end - ptr)
{
IP_DEFRAG_ERROR_WITH_KEY("middle frag length not match expected reassembled length", &fq->key);
STAT_INC(&ip_reass->stat, frags_invalid_length, &fq->key)
goto error_out;
}
- end -= temp->len;
- memcpy(end, temp->data, temp->len);
- last_offset = temp->offset;
+ end -= frag->len;
+ memcpy(end, frag->data, frag->len);
+ last_offset = frag->offset;
break;
}
}
@@ -530,15 +530,18 @@ static struct packet *ip_reassembly_defrag_fq(struct ip_reassembly *ip_reass, st
packet_parse(pkt, ptr, total_len);
packet_set_defraged(pkt);
- for (uint32_t i = 0; i < fq->next_fill; i++)
+ frag = &fq->frags[IP_FIRST_FRAG_IDX];
+ packet_push_frag(pkt, frag->pkt);
+ frag->pkt = NULL;
+ for (uint32_t i = IP_MIN_FRAG_NUM; i < fq->next_fill; i++)
{
- struct frag *frag = &fq->frags[i];
- if (frag->pkt)
- {
- packet_push_frag(pkt, frag->pkt);
- frag->pkt = NULL;
- }
+ frag = &fq->frags[i];
+ packet_push_frag(pkt, frag->pkt);
+ frag->pkt = NULL;
}
+ frag = &fq->frags[IP_LAST_FRAG_IDX];
+ packet_push_frag(pkt, frag->pkt);
+ frag->pkt = NULL;
STAT_INC(&ip_reass->stat, defrags_succeed, &fq->key)
ip_reassembly_del_fq(ip_reass, fq);