diff options
| author | luwenpeng <[email protected]> | 2024-10-23 18:24:10 +0800 |
|---|---|---|
| committer | luwenpeng <[email protected]> | 2024-10-23 15:46:02 +0800 |
| commit | 5c5a50929b54483480b058a27683fd37fedf11d0 (patch) | |
| tree | 8c35b12dbbfc2cbc1f744e6cb4e2dfbf494fdc77 /infra | |
| parent | 08b5ecd72811aedf01eccf4f567a1584718ac981 (diff) | |
bugfix: packet_push_frag() order
Diffstat (limited to 'infra')
| -rw-r--r-- | infra/ip_reassembly/ip_reassembly.c | 31 |
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); |
