From 20483e7325f2c478a8318550425f5c8468451422 Mon Sep 17 00:00:00 2001
From: "aleksei.voronin" <aleksei.voronin@demlabs.net>
Date: Thu, 3 Sep 2020 03:50:09 +0300
Subject: [PATCH] [*] fixed /'Too big size/' error in packet write

---
 dap-sdk/net/stream/ch/dap_stream_ch_pkt.c      | 16 +++++++++-------
 dap-sdk/net/stream/ch/include/dap_stream_ch.h  |  2 --
 dap-sdk/net/stream/stream/dap_stream_pkt.c     | 14 ++++++++------
 dap-sdk/net/stream/stream/include/dap_stream.h |  1 -
 4 files changed, 17 insertions(+), 16 deletions(-)

diff --git a/dap-sdk/net/stream/ch/dap_stream_ch_pkt.c b/dap-sdk/net/stream/ch/dap_stream_ch_pkt.c
index 3086c895e9..398ec38ed0 100644
--- a/dap-sdk/net/stream/ch/dap_stream_ch_pkt.c
+++ b/dap-sdk/net/stream/ch/dap_stream_ch_pkt.c
@@ -164,16 +164,18 @@ size_t dap_stream_ch_pkt_write_unsafe(dap_stream_ch_t * a_ch,  uint8_t a_type, c
             (char) l_hdr.id, l_hdr.size, l_hdr.type, l_hdr.seq_id , l_hdr.enc_type );
     }
 
-
-    if(a_data_size+sizeof(l_hdr)> sizeof(a_ch->buf) ){
-        log_it(L_ERROR,"Too big data size %lu, bigger than encryption buffer size %lu", a_data_size, sizeof(a_ch->buf));
-        a_data_size=sizeof(a_ch->buf)-sizeof(l_hdr);
+    if(a_data_size > 250000){
+        printf("bazinga");
     }
-    memcpy(a_ch->buf,&l_hdr,sizeof(l_hdr) );
+
+    uint8_t * l_ch_buf = DAP_NEW_SIZE(uint8_t, a_data_size+sizeof(l_hdr));
+    assert(l_ch_buf);
+    memcpy(l_ch_buf,&l_hdr,sizeof(l_hdr) );
     if( a_data_size )
-        memcpy(a_ch->buf+sizeof(l_hdr),a_data,a_data_size );
+        memcpy(l_ch_buf+sizeof(l_hdr),a_data,a_data_size );
 
-    size_t l_ret=dap_stream_pkt_write_unsafe(a_ch->stream,a_ch->buf,a_data_size+sizeof(l_hdr));
+    size_t l_ret=dap_stream_pkt_write_unsafe(a_ch->stream,l_ch_buf,a_data_size+sizeof(l_hdr));
+    DAP_DELETE(l_ch_buf);
     a_ch->stat.bytes_write+=a_data_size;
     a_ch->ready_to_write=true;
     return l_ret;
diff --git a/dap-sdk/net/stream/ch/include/dap_stream_ch.h b/dap-sdk/net/stream/ch/include/dap_stream_ch.h
index dc1e862802..6c48a6ccb5 100644
--- a/dap-sdk/net/stream/ch/include/dap_stream_ch.h
+++ b/dap-sdk/net/stream/ch/include/dap_stream_ch.h
@@ -46,8 +46,6 @@ typedef struct dap_stream_ch{
         uint64_t bytes_read;
     } stat;
 
-    uint8_t buf[500000];
-
     dap_stream_ch_proc_t * proc;
     void * internal;
     struct dap_stream_ch *me;
diff --git a/dap-sdk/net/stream/stream/dap_stream_pkt.c b/dap-sdk/net/stream/stream/dap_stream_pkt.c
index 1f1357e25a..99dcfe2cd8 100644
--- a/dap-sdk/net/stream/stream/dap_stream_pkt.c
+++ b/dap-sdk/net/stream/stream/dap_stream_pkt.c
@@ -121,6 +121,7 @@ size_t dap_stream_pkt_read_unsafe( dap_stream_t * a_stream, dap_stream_pkt_t * a
 }
 
 
+#define DAP_STREAM_PKT_ENCRYPTION_OVERHEAD 200 //intended overkill, it's about ~2*16+15 for oaes
 
 /**
  * @brief stream_ch_pkt_write
@@ -135,22 +136,23 @@ size_t dap_stream_pkt_write_unsafe(dap_stream_t * a_stream, const void * a_data,
     size_t ret=0;
     stream_pkt_hdr_t pkt_hdr;
 
-    if(a_data_size > STREAM_BUF_SIZE_MAX ){
-        log_it(L_ERROR,"Too big data size %lu, bigger than encryption buffer size %lu",a_data_size,sizeof(a_stream->buf));
-        a_data_size=sizeof(a_stream->buf);
-    }
+    size_t l_stream_buf_size = a_data_size + DAP_STREAM_PKT_ENCRYPTION_OVERHEAD;
+    uint8_t * l_stream_buf = DAP_NEW_SIZE(uint8_t, l_stream_buf_size);
+    assert(l_stream_buf);
 
     memset(&pkt_hdr,0,sizeof(pkt_hdr));
     memcpy(pkt_hdr.sig,c_dap_stream_sig,sizeof(pkt_hdr.sig));
 
-    pkt_hdr.size =(uint32_t) a_stream->session->key->enc_na(a_stream->session->key, a_data,a_data_size,a_stream->buf, STREAM_BUF_SIZE_MAX);
+    pkt_hdr.size =(uint32_t) a_stream->session->key->enc_na(a_stream->session->key, a_data,a_data_size,l_stream_buf,l_stream_buf_size);
+    assert(pkt_hdr.size > 0 && pkt_hdr.size <= l_stream_buf_size);
 //    printf("*[dap_stream_pkt_write] size=%d key=0x%x _inheritor_size=%d\n", pkt_hdr.size, sid->session->key,
 //            sid->session->key->_inheritor_size);
 
     ret+=dap_events_socket_write_unsafe(a_stream->esocket,&pkt_hdr,sizeof(pkt_hdr));
-    ret+=dap_events_socket_write_unsafe(a_stream->esocket,a_stream->buf,pkt_hdr.size);
+    ret+=dap_events_socket_write_unsafe(a_stream->esocket,l_stream_buf,pkt_hdr.size);
     dap_events_socket_set_writable_unsafe(a_stream->esocket, true);
 
+    DAP_DELETE(l_stream_buf);
     return ret;
 }
 
diff --git a/dap-sdk/net/stream/stream/include/dap_stream.h b/dap-sdk/net/stream/stream/include/dap_stream.h
index 888be346b5..d57a211b87 100644
--- a/dap-sdk/net/stream/stream/include/dap_stream.h
+++ b/dap-sdk/net/stream/stream/include/dap_stream.h
@@ -73,7 +73,6 @@ typedef struct dap_stream {
     uint8_t buf_defrag[STREAM_BUF_SIZE_MAX];
     uint64_t buf_defrag_size;
 
-    uint8_t buf[STREAM_BUF_SIZE_MAX];
     uint8_t pkt_cache[STREAM_BUF_SIZE_MAX];
 
     dap_stream_ch_t *channel[255]; // TODO reduce channels to 16 to economy memory
-- 
GitLab