From 0b34239c280cd3427b765a13b74ba7f89183052f Mon Sep 17 00:00:00 2001 From: Anatolii Kurotych <akurotych@gmail.com> Date: Sat, 23 Feb 2019 16:24:53 +0200 Subject: [PATCH] [*] revert changes in stream_proc_pkt_in --- stream/dap_stream.c | 105 ++++++++++++++++++++++++++------------------ 1 file changed, 63 insertions(+), 42 deletions(-) diff --git a/stream/dap_stream.c b/stream/dap_stream.c index da8c294..6f4967e 100644 --- a/stream/dap_stream.c +++ b/stream/dap_stream.c @@ -399,116 +399,137 @@ size_t dap_stream_data_proc_read (dap_stream_t *a_stream) bool proc_data_defrag=false; // We are or not in defrag buffer size_t read_bytes_to=0; size_t bytes_left_to_read=a_stream->conn->buf_in_size; - - //log_it(L_DEBUG, "---> Stream data read %u bytes", bytes_left_to_read); - // Process prebuffered packets or glue defragmented data with the current input + if(pkt=a_stream->pkt_buf_in){ // Packet signature detected + if(a_stream->pkt_buf_in_data_size < sizeof(stream_pkt_hdr_t)) + { + //At first read header + dap_stream_pkt_t* check_pkt = dap_stream_pkt_detect( proc_data , sizeof(stream_pkt_hdr_t) - a_stream->pkt_buf_in_data_size); + if(check_pkt){ + // Got duplication of packet header several times + //log_it(L_DEBUG, "Drop incorrect header part"); + a_stream->pkt_buf_in = NULL; + a_stream->pkt_buf_in_data_size=0; + return 0; + } + if(sizeof(stream_pkt_hdr_t) - a_stream->pkt_buf_in_data_size > bytes_left_to_read) + read_bytes_to = bytes_left_to_read; + else + read_bytes_to = sizeof(stream_pkt_hdr_t) - a_stream->pkt_buf_in_data_size; + memcpy((uint8_t*)a_stream->pkt_buf_in+a_stream->pkt_buf_in_data_size,proc_data,read_bytes_to); + bytes_left_to_read-=read_bytes_to; + a_stream->pkt_buf_in_data_size += read_bytes_to; + proc_data += read_bytes_to; + read_bytes_to = 0; + } - if(pkt=a_stream->pkt_buf_in){ // Complete prebuffered packet - if ((pkt->hdr.size-a_stream->pkt_buf_in_data_size) < bytes_left_to_read ) { // Looks the all packet is present in buffer - read_bytes_to=(a_stream->pkt_buf_in->hdr.size-a_stream->pkt_buf_in_data_size); - }else + if ((pkt->hdr.size + sizeof(stream_pkt_hdr_t) -a_stream->pkt_buf_in_data_size) < bytes_left_to_read ) { // Looks the all packet is present in buffer + read_bytes_to=(a_stream->pkt_buf_in->hdr.size + sizeof(stream_pkt_hdr_t) -a_stream->pkt_buf_in_data_size); + }else{ read_bytes_to=bytes_left_to_read; - - memcpy(a_stream->pkt_buf_in->data+a_stream->pkt_buf_in_data_size,proc_data,read_bytes_to); + } + memcpy((uint8_t*)a_stream->pkt_buf_in+a_stream->pkt_buf_in_data_size,proc_data,read_bytes_to); a_stream->pkt_buf_in_data_size+=read_bytes_to; bytes_left_to_read-=read_bytes_to; - //log_it(DEBUG, "Prefilled packet buffer on %u bytes", read_bytes_to); + //log_it(L_DEBUG, "Prefilled packet buffer on %u bytes", read_bytes_to); read_bytes_to=0; - if(a_stream->pkt_buf_in_data_size>=(a_stream->pkt_buf_in->hdr.size) ){ // If we have all the packet in packet buffer - if(a_stream->pkt_buf_in_data_size>a_stream->pkt_buf_in->hdr.size){ // If we have little more data then we need for packet buffer - log_it(L_WARNING,"Prefilled packet buffer has %u bytes more than we need, they're lost",a_stream->pkt_buf_in_data_size-a_stream->pkt_buf_in->hdr.size); + if(a_stream->pkt_buf_in_data_size>=(a_stream->pkt_buf_in->hdr.size + sizeof(stream_pkt_hdr_t)) ){ // If we have all the packet in packet buffer + if(a_stream->pkt_buf_in_data_size > a_stream->pkt_buf_in->hdr.size + sizeof(stream_pkt_hdr_t)){ // If we have little more data then we need for packet buffer + //log_it(L_WARNING,"Prefilled packet buffer has %u bytes more than we need, they're lost",a_stream->pkt_buf_in_data_size-a_stream->pkt_buf_in->hdr.size); + a_stream->pkt_buf_in_data_size = 0; + a_stream->pkt_buf_in = NULL; + } + else{ + stream_proc_pkt_in(a_stream); } - stream_proc_pkt_in(a_stream); } proc_data=(a_stream->conn->buf_in + a_stream->conn->buf_in_size - bytes_left_to_read); + }else if( a_stream->buf_defrag_size>0){ // If smth is present in defrag buffer - we glue everything together in it if( bytes_left_to_read > 0){ // If there is smth to process in input buffer read_bytes_to=bytes_left_to_read; - if( (read_bytes_to+ a_stream->buf_defrag_size) > sizeof(a_stream->buf_defrag) ){ - log_it(L_WARNING,"Defrag buffer is overfilled, drop that" ); + if( (read_bytes_to + a_stream->buf_defrag_size) > sizeof(a_stream->buf_defrag) ){ + //log_it(L_WARNING,"Defrag buffer is overfilled, drop that" ); if(read_bytes_to>sizeof(a_stream->buf_defrag)) read_bytes_to=sizeof(a_stream->buf_defrag); a_stream->buf_defrag_size=0; } - // log_it(DEBUG,"Glue together defrag %u bytes and current %u bytes", sid->buf_defrag_size, read_bytes_to); + //log_it(L_DEBUG,"Glue together defrag %u bytes and current %u bytes", a_stream->buf_defrag_size, read_bytes_to); memcpy(a_stream->buf_defrag+a_stream->buf_defrag_size,proc_data,read_bytes_to ); bytes_left_to_read=a_stream->buf_defrag_size+read_bytes_to; // Then we have to read em all read_bytes_to=0; }else{ bytes_left_to_read=a_stream->buf_defrag_size; - // log_it(DEBUG,"Nothing to glue with defrag buffer, going to process just that (%u bytes)", bytes_left_to_read); + //log_it(L_DEBUG,"Nothing to glue with defrag buffer, going to process just that (%u bytes)", bytes_left_to_read); } + //log_it(L_WARNING,"Switch to defrag buffer"); proc_data=a_stream->buf_defrag; proc_data_defrag=true; }//else // log_it(DEBUG,"No prefill or defrag buffer, process directly buf_in"); - // Now lets see how many packets we have in buffer now while(pkt=dap_stream_pkt_detect( proc_data , bytes_left_to_read)){ if(pkt->hdr.size > STREAM_PKT_SIZE_MAX ){ - log_it(L_ERROR, "stream_pkt_detect() Too big packet size %u", - pkt->hdr.size); + //log_it(L_ERROR, "stream_pkt_detect() Too big packet size %u", + // pkt->hdr.size); bytes_left_to_read=0; break; } size_t pkt_offset=( ((uint8_t*)pkt)- proc_data ); bytes_left_to_read -= pkt_offset ; found_sig=true; + dap_stream_pkt_t* temp_pkt = dap_stream_pkt_detect( (uint8_t*)pkt + 1 ,pkt->hdr.size+sizeof(stream_pkt_hdr_t) ); if(bytes_left_to_read <(pkt->hdr.size+sizeof(stream_pkt_hdr_t) )){ // Is all the packet in da buf? read_bytes_to=bytes_left_to_read; }else{ read_bytes_to=pkt->hdr.size+sizeof(stream_pkt_hdr_t); } - //log_it(L_DEBUG, "Detected packet signature pkt->hdr.size=%u pkt->hdr.seq_id=%u read_bytes_to=%u bytes_left_to_read=%u pkt_offset=%u" - // ,pkt->hdr.size,pkt->hdr.seq_id , read_bytes_to, bytes_left_to_read,pkt_offset); - - if(read_bytes_to>0){ // We have smth to read, right? + //log_it(L_DEBUG, "Detected packet signature pkt->hdr.size=%u read_bytes_to=%u bytes_left_to_read=%u pkt_offset=%u" + // ,pkt->hdr.size, read_bytes_to, bytes_left_to_read,pkt_offset); + if(read_bytes_to > HEADER_WITH_SIZE_FIELD){ // If we have size field, we can allocate memory a_stream->pkt_buf_in_size_expected =( pkt->hdr.size+sizeof(stream_pkt_hdr_t)); size_t pkt_buf_in_size_expected=a_stream->pkt_buf_in_size_expected; - a_stream->pkt_buf_in=(dap_stream_pkt_t *) malloc(pkt_buf_in_size_expected); if(read_bytes_to>(pkt->hdr.size+sizeof(stream_pkt_hdr_t) )){ - log_it(L_WARNING,"For some strange reasons we have read_bytes_to=%u is bigger than expected pkt length(%u bytes). Dropped %u bytes", - pkt->hdr.size+sizeof(stream_pkt_hdr_t),read_bytes_to- pkt->hdr.size+sizeof(stream_pkt_hdr_t)); + //log_it(L_WARNING,"For some strange reasons we have read_bytes_to=%u is bigger than expected pkt length(%u bytes). Dropped %u bytes", + // pkt->hdr.size+sizeof(stream_pkt_hdr_t),read_bytes_to- pkt->hdr.size+sizeof(stream_pkt_hdr_t)); read_bytes_to=(pkt->hdr.size+sizeof(stream_pkt_hdr_t)); } if(read_bytes_to>bytes_left_to_read){ - log_it(L_WARNING,"For some strange reasons we have read_bytes_to=%u is bigger that's left in input buffer (%u bytes). Dropped %u bytes", - read_bytes_to,bytes_left_to_read); + //log_it(L_WARNING,"For some strange reasons we have read_bytes_to=%u is bigger that's left in input buffer (%u bytes). Dropped %u bytes", + // read_bytes_to,bytes_left_to_read); read_bytes_to=bytes_left_to_read; } memcpy(a_stream->pkt_buf_in,pkt,read_bytes_to); - proc_data+=read_bytes_to; + proc_data+=(read_bytes_to + pkt_offset); bytes_left_to_read-=read_bytes_to; - a_stream->pkt_buf_in_data_size=(read_bytes_to-sizeof(pkt->hdr)); - if(a_stream->pkt_buf_in_data_size==(pkt->hdr.size)){ + a_stream->pkt_buf_in_data_size=(read_bytes_to); + if(a_stream->pkt_buf_in_data_size==(pkt->hdr.size + sizeof(stream_pkt_hdr_t))){ // log_it(INFO,"All the packet is present in da buffer (hdr.size=%u read_bytes_to=%u buf_in_size=%u)" // ,sid->pkt_buf_in->hdr.size,read_bytes_to,sid->conn->buf_in_size); stream_proc_pkt_in(a_stream); - }else if(a_stream->pkt_buf_in_data_size>pkt->hdr.size){ - log_it(L_WARNING,"Input: packet buffer has %u bytes more than we need, they're lost",a_stream->pkt_buf_in_data_size-pkt->hdr.size); + }else if(a_stream->pkt_buf_in_data_size>pkt->hdr.size + sizeof(stream_pkt_hdr_t)){ + //log_it(L_WARNING,"Input: packet buffer has %u bytes more than we need, they're lost",a_stream->pkt_buf_in_data_size-pkt->hdr.size); }else{ - // log_it(DEBUG,"Input: Not all stream packet in input (hdr.size=%u read_bytes_to=%u)",sid->pkt_buf_in->hdr.size,read_bytes_to); + //log_it(L_DEBUG,"Input: Not all stream packet in input (hdr.size=%u read_bytes_to=%u)",a_stream->pkt_buf_in->hdr.size,read_bytes_to); } }else{ - //log_it(DEBUG,"Input: read_bytes_to is zero inside the process loop, going to breaking out that"); + break; } } if(!found_sig){ -// log_it(L_DEBUG,"Input: Not found signature in the incomming data ( client->buf_in_size = %u)", -// a_stream->conn->buf_in_size); + //log_it(DEBUG,"Input: Not found signature in the incomming data ( client->buf_in_size = %u *ret = %u )", + // sh->client->buf_in_size, *ret); } - if(bytes_left_to_read>0){ if(proc_data_defrag){ memmove(a_stream->buf_defrag, proc_data, bytes_left_to_read); a_stream->buf_defrag_size=bytes_left_to_read; - // log_it(INFO,"Fragment of %u bytes shifted in the begining the defrag buffer",bytes_left_to_read); + //log_it(L_INFO,"Fragment of %u bytes shifted in the begining the defrag buffer",bytes_left_to_read); }else{ memcpy(a_stream->buf_defrag, proc_data, bytes_left_to_read); a_stream->buf_defrag_size=bytes_left_to_read; - // log_it(INFO,"Fragment of %u bytes stored in defrag buffer",bytes_left_to_read); + //log_it(L_INFO,"Fragment of %u bytes stored in defrag buffer",bytes_left_to_read); } }else if(proc_data_defrag){ a_stream->buf_defrag_size=0; -- GitLab