diff --git a/nfq/protocol.c b/nfq/protocol.c index fd4ce038..74659ea9 100644 --- a/nfq/protocol.c +++ b/nfq/protocol.c @@ -866,7 +866,7 @@ bool QUICDefragCrypto(const uint8_t *clean,size_t clean_len, uint8_t *defrag,siz uint64_t offset,sz,szmax=0,zeropos=0,pos=0; bool found=false; struct range64 ranges[MAX_DEFRAG_PIECES]; - int i,range=0; + int i,j,range=0; while(pos zeropos) zeropos=offset+sz; + memcpy(defrag_data+offset,clean+pos,sz); if ((offset+sz) > szmax) szmax = offset+sz; found=true; pos+=sz; + // remove exact duplicates early to save cpu + for(i=0;i0) + { + for (j=0,i=1; i < range; i++) + { + uint64_t current_end = ranges[j].offset + ranges[j].len; + uint64_t next_start = ranges[i].offset; + uint64_t next_end = ranges[i].offset + ranges[i].len; + + if (next_start <= current_end) + ranges[j].len = MAX(next_end,current_end) - ranges[j].offset; + else + ranges[++j] = ranges[i]; + } + range = j+1; + } + +// for(i=0 ; i QUIC_MAX_CID_LENGTH) return false; offset += 1 + data[offset]; + if (offset>=len) return false; + // SCID if (data[offset] > QUIC_MAX_CID_LENGTH) return false; offset += 1 + data[offset];