diff --git a/stream/stream.c b/stream/stream.c index e81a9d7106cb2ac1996e03266a831fc5dfbd3549..a7b5e1f77de8206fad03675dcb31478a6cc504ce 100644 --- a/stream/stream.c +++ b/stream/stream.c @@ -345,29 +345,75 @@ void stream_dap_data_read(dap_client_remote_t* sh, void * arg){ int * ret = (int *) arg; int bytes_ready = 0; - if(sid->pkt_buf_in){ - size_t read_bytes_to=( ((sid->pkt_buf_in->hdr.size-sid->pkt_buf_in_data_size) > sid->conn->buf_in_size ) + // ЕÑли имеем Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ целый заголовок + if(sid->pkt_buf_in && sid->pkt_buf_in_data_size >= sizeof(stream_pkt_hdr_t)){ + //Ищем в полученном куÑке данных Ñледующий пакет + stream_pkt_t* packet_test = stream_pkt_detect( sh->buf_in, sid->conn->buf_in_size); + if(packet_test){ + // ЕÑли нашли - раÑÑчитываем размер блока памÑти до найденного пакета + int offset = (uint8_t*)packet_test - (uint8_t*)sh->buf_in; + // ЕÑли Ñтот размер Ñовпал Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð¾Ð¼ недоÑтающего куÑка - будем Ñчитать что мы получили нужный пакет + if(offset != sid->pkt_buf_in->hdr.size+sizeof(stream_pkt_hdr_t)-sid->pkt_buf_in_data_size){ + // ЕÑли не Ñовпал - выбраÑываем предыдущий пакет и переходим к Ñледующему + log_it(L_WARNING,"WRONG NEXT PACKET, OFFSET IS %i, BUT NEED %i",offset,sid->pkt_buf_in->hdr.size+sizeof(stream_pkt_hdr_t)-sid->pkt_buf_in_data_size); + sid->pkt_buf_in_data_size = 0; + sid->pkt_buf_in = NULL; + return; + } + else + log_it(L_DEBUG,"Next packet true"); + } + // ЕÑли вÑÑ‘ верно - читаем Ñледующий блок + size_t read_bytes_to=( ((sid->pkt_buf_in->hdr.size+sizeof(stream_pkt_hdr_t)-sid->pkt_buf_in_data_size) > sid->conn->buf_in_size ) ? sid->conn->buf_in_size - :(sid->pkt_buf_in->hdr.size-sid->pkt_buf_in_data_size)); - memcpy(sid->pkt_buf_in->data+sid->pkt_buf_in_data_size,sh->buf_in,read_bytes_to); + :(sid->pkt_buf_in->hdr.size+sizeof(stream_pkt_hdr_t)-sid->pkt_buf_in_data_size)); + memcpy((uint8_t*)sid->pkt_buf_in+sid->pkt_buf_in_data_size,sh->buf_in,read_bytes_to); sid->pkt_buf_in_data_size+=read_bytes_to; - if(sid->pkt_buf_in_data_size>=(sid->pkt_buf_in->hdr.size) ){ + if(sid->pkt_buf_in_data_size>=(sid->pkt_buf_in->hdr.size+sizeof(stream_pkt_hdr_t)) ){ stream_proc_pkt_in(sid); } + bytes_ready+=read_bytes_to; + // ЕÑли имеем только чаÑÑ‚ÑŒ заголовка + }else if(sid->pkt_buf_in){ + // ЕÑли имеетÑÑ Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ размер пакета - делаем аналогичную проверку + stream_pkt_t* packet_test = stream_pkt_detect( sh->buf_in, sid->conn->buf_in_size); + if(packet_test){ + int offset = (uint8_t*)packet_test - (uint8_t*)sh->buf_in; + // Ðто уÑловие также будет Ñрабатывать еÑли полученный куÑок не Ñодержит поле size (из-за Ñтого проиÑходило падение) + if(offset != sid->pkt_buf_in->hdr.size+sizeof(stream_pkt_hdr_t)-sid->pkt_buf_in_data_size){ + log_it(L_WARNING,"WRONG NEXT PACKET, OFFSET IS %i, BUT NEED %i",offset,sid->pkt_buf_in->hdr.size+sizeof(stream_pkt_hdr_t)-sid->pkt_buf_in_data_size); + sid->pkt_buf_in_data_size = 0; + sid->pkt_buf_in = NULL; + return; + } + else + log_it(L_DEBUG,"Next packet true"); + } + // ЕÑли вÑÑ‘ верно - читаем только заголовок + size_t read_bytes_to=(sizeof(stream_pkt_hdr_t) - sid->pkt_buf_in_data_size > sid->conn->buf_in_size + ? sid->conn->buf_in_size + :sizeof(stream_pkt_hdr_t) - sid->pkt_buf_in_data_size); + log_it(L_WARNING,"Special condition used, additionla part: %u",read_bytes_to); + memcpy((uint8_t*)sid->pkt_buf_in+sid->pkt_buf_in_data_size,sh->buf_in,read_bytes_to); + sid->pkt_buf_in_data_size+=read_bytes_to; + bytes_ready+=read_bytes_to; }else{ stream_pkt_t * pkt; + // Try to detect packet header in dap_client buf while(pkt=stream_pkt_detect( sh->buf_in + bytes_ready, (sh->buf_in_size - ((size_t) bytes_ready) ))){ size_t read_bytes_to=( (pkt->hdr.size+sizeof(stream_pkt_hdr_t)) > sid->conn->buf_in_size ?sid->conn->buf_in_size :(pkt->hdr.size+sizeof(stream_pkt_hdr_t) ) ); if(read_bytes_to){ - sid->pkt_buf_in=(stream_pkt_t *) calloc(1,pkt->hdr.size+sizeof(stream_pkt_hdr_t)); + sid->pkt_buf_in=(stream_pkt_t *) calloc(1,pkt->hdr.size+sizeof(stream_pkt_hdr_t)); memcpy(sid->pkt_buf_in,pkt,read_bytes_to); bytes_ready = (bytes_ready)+ read_bytes_to; - sid->pkt_buf_in_data_size=read_bytes_to-sizeof(stream_pkt_hdr_t); + if(read_bytes_to < sizeof(stream_pkt_hdr_t)) + log_it(L_WARNING,"Packet size less than header"); + sid->pkt_buf_in_data_size=read_bytes_to; - if(read_bytes_to>=(pkt->hdr.size)){ + if(read_bytes_to>=(pkt->hdr.size + sizeof(stream_pkt_hdr_t))){ stream_proc_pkt_in(sid); }else{ log_it(L_DEBUG,"Input: Not all stream packet in input (hdr.size=%u read_bytes_to=%u)",sid->pkt_buf_in->hdr.size,read_bytes_to); @@ -377,7 +423,7 @@ void stream_dap_data_read(dap_client_remote_t* sh, void * arg){ }else break; } - bytes_ready += sh->buf_in_size; + bytes_ready += sh->buf_in_size; // Ðта Ñтрочка по-моему также невернаÑ, еÑли придут два ÑлипшихÑÑ Ð¿Ð°ÐºÐµÑ‚Ð° - прочитаем только один } if(ret) *ret = bytes_ready; @@ -447,7 +493,7 @@ void stream_proc_pkt_in(stream_t * sid) { if(sid->pkt_buf_in->hdr.type == DATA_PACKET) { - stream_ch_pkt_t * ch_pkt= (stream_ch_pkt_t*) calloc(1,sid->pkt_buf_in->hdr.size+sizeof(stream_ch_pkt_hdr_t)+16 ); + stream_ch_pkt_t * ch_pkt= (stream_ch_pkt_t*) calloc(1,sid->pkt_buf_in->hdr.size); stream_pkt_read(sid,sid->pkt_buf_in, ch_pkt); stream_ch_t * ch = NULL; size_t i;