From 031019670cdbd5fcb330ee69e4dce4449b8e9e8c Mon Sep 17 00:00:00 2001
From: "daniil.frolov" <daniil.frolov@demlabs.net>
Date: Tue, 20 Aug 2024 11:00:35 +0000
Subject: [PATCH] Hotfix 12176

---
 modules/service/vpn/dap_chain_net_srv_vpn.c   | 26 +++++++++----------
 .../service/vpn/dap_chain_net_vpn_client.c    |  4 +--
 .../vpn/dap_chain_net_vpn_client_tun.c        | 10 +++----
 .../vpn/include/dap_chain_net_srv_vpn.h       | 24 +++++++----------
 .../include/dap_chain_net_vpn_client_tun.h    |  2 +-
 5 files changed, 31 insertions(+), 35 deletions(-)

diff --git a/modules/service/vpn/dap_chain_net_srv_vpn.c b/modules/service/vpn/dap_chain_net_srv_vpn.c
index bcc4144f8e..9ba8db186f 100644
--- a/modules/service/vpn/dap_chain_net_srv_vpn.c
+++ b/modules/service/vpn/dap_chain_net_srv_vpn.c
@@ -123,7 +123,7 @@ typedef struct vpn_local_network {
 #endif
     bool auto_cpu_reassignment;
 
-    ch_vpn_pkt_t * pkt_out[400];
+    dap_stream_ch_vpn_pkt_t * pkt_out[400];
     size_t pkt_out_size;
     size_t pkt_out_rindex;
     size_t pkt_out_windex;
@@ -159,7 +159,7 @@ typedef struct tun_socket_msg{
             struct in_addr addr;
         } ip_unassigment;
         struct{ // CH VPN send operation
-            ch_vpn_pkt_t * pkt;
+            dap_stream_ch_vpn_pkt_t * pkt;
         } ch_vpn_send;
     };
 } tun_socket_msg_t;
@@ -241,10 +241,10 @@ static int s_tun_attach_queue(int fd);
 #endif
 
 static bool s_tun_client_send_data(dap_chain_net_srv_ch_vpn_info_t * a_ch_vpn_info, const void * a_data, size_t a_data_size);
-static bool s_tun_client_send_data_unsafe(dap_chain_net_srv_ch_vpn_t * l_ch_vpn, ch_vpn_pkt_t * l_pkt_out);
+static bool s_tun_client_send_data_unsafe(dap_chain_net_srv_ch_vpn_t * l_ch_vpn, dap_stream_ch_vpn_pkt_t * l_pkt_out);
 
 
-static bool s_tun_client_send_data_unsafe(dap_chain_net_srv_ch_vpn_t * l_ch_vpn, ch_vpn_pkt_t * l_pkt_out)
+static bool s_tun_client_send_data_unsafe(dap_chain_net_srv_ch_vpn_t * l_ch_vpn, dap_stream_ch_vpn_pkt_t * l_pkt_out)
 {
     dap_chain_net_srv_stream_session_t *l_srv_session = DAP_CHAIN_NET_SRV_STREAM_SESSION(l_ch_vpn->ch->stream->session);
     dap_chain_net_srv_usage_t *l_usage = l_srv_session->usage_active;// dap_chain_net_srv_usage_find_unsafe(l_srv_session, l_ch_vpn->usage_id);
@@ -272,7 +272,7 @@ static bool s_tun_client_send_data_unsafe(dap_chain_net_srv_ch_vpn_t * l_ch_vpn,
  * @param a_pkt_out
  * @return
  */
-static bool s_tun_client_send_data_inter(dap_events_socket_t * a_es_input, dap_chain_net_srv_ch_vpn_t  * a_ch_vpn, ch_vpn_pkt_t * a_pkt_out)
+static bool s_tun_client_send_data_inter(dap_events_socket_t * a_es_input, dap_chain_net_srv_ch_vpn_t  * a_ch_vpn, dap_stream_ch_vpn_pkt_t * a_pkt_out)
 {
     dap_chain_net_srv_stream_session_t * l_srv_session = DAP_CHAIN_NET_SRV_STREAM_SESSION (a_ch_vpn->ch->stream->session );
     dap_chain_net_srv_usage_t * l_usage = l_srv_session->usage_active;// dap_chain_net_srv_usage_find_unsafe(l_srv_session,  a_ch_vpn->usage_id);
@@ -297,7 +297,7 @@ static bool s_tun_client_send_data_inter(dap_events_socket_t * a_es_input, dap_c
 static bool s_tun_client_send_data(dap_chain_net_srv_ch_vpn_info_t * l_ch_vpn_info, const void * a_data, size_t a_data_size)
 {
     assert(a_data_size > sizeof (dap_os_iphdr_t));
-    ch_vpn_pkt_t *l_pkt_out             = DAP_NEW_Z_SIZE(ch_vpn_pkt_t, sizeof(l_pkt_out->header) + a_data_size);
+    dap_stream_ch_vpn_pkt_t *l_pkt_out             = DAP_NEW_Z_SIZE(dap_stream_ch_vpn_pkt_t, sizeof(l_pkt_out->header) + a_data_size);
     if (!l_pkt_out) {
         log_it(L_CRITICAL, "%s", c_error_memory_alloc);
         return false;
@@ -1523,7 +1523,7 @@ static void s_update_limits(dap_stream_ch_t * a_ch ,
 static void send_pong_pkt(dap_stream_ch_t* a_ch)
 {
 //    log_it(L_DEBUG,"---------------------------------- PONG!");
-    ch_vpn_pkt_t *pkt_out = (ch_vpn_pkt_t*) calloc(1, sizeof(pkt_out->header));
+    dap_stream_ch_vpn_pkt_t *pkt_out = (dap_stream_ch_vpn_pkt_t*) calloc(1, sizeof(pkt_out->header));
     if (!pkt_out) {
         log_it(L_CRITICAL, "%s", c_error_memory_alloc);
         return;
@@ -1552,7 +1552,7 @@ static void s_ch_packet_in_vpn_address_request(dap_stream_ch_t *a_ch, dap_chain_
 
     if ( l_ch_vpn->addr_ipv4.s_addr ) {
         log_it(L_WARNING, "IP address is already leased");
-        ch_vpn_pkt_t* pkt_out           = DAP_NEW_STACK_SIZE(ch_vpn_pkt_t, sizeof(pkt_out->header));
+        dap_stream_ch_vpn_pkt_t* pkt_out           = DAP_NEW_STACK_SIZE(dap_stream_ch_vpn_pkt_t, sizeof(pkt_out->header));
         if (!pkt_out) {
             log_it(L_CRITICAL, "%s", c_error_memory_alloc);
             return;
@@ -1584,7 +1584,7 @@ static void s_ch_packet_in_vpn_address_request(dap_stream_ch_t *a_ch, dap_chain_
         HASH_ADD(hh, s_ch_vpn_addrs, addr_ipv4, sizeof (l_ch_vpn->addr_ipv4), l_ch_vpn);
         pthread_rwlock_unlock( &s_clients_rwlock );
 
-        ch_vpn_pkt_t *l_pkt_out = DAP_NEW_STACK_SIZE(ch_vpn_pkt_t,
+        dap_stream_ch_vpn_pkt_t *l_pkt_out = DAP_NEW_STACK_SIZE(dap_stream_ch_vpn_pkt_t,
                 sizeof(l_pkt_out->header) + sizeof(l_ch_vpn->addr_ipv4) + sizeof(s_raw_server->ipv4_network_addr));
         l_pkt_out->header.sock_id           = s_raw_server->tun_fd;
         l_pkt_out->header.op_code           = VPN_PACKET_OP_CODE_VPN_ADDR_REPLY;
@@ -1687,7 +1687,7 @@ static void s_ch_packet_in_vpn_address_request(dap_stream_ch_t *a_ch, dap_chain_
             HASH_ADD(hh, s_ch_vpn_addrs, addr_ipv4, sizeof (l_ch_vpn->addr_ipv4), l_ch_vpn);
             pthread_rwlock_unlock( &s_clients_rwlock );
 
-            ch_vpn_pkt_t *pkt_out = DAP_NEW_STACK_SIZE(ch_vpn_pkt_t,
+            dap_stream_ch_vpn_pkt_t *pkt_out = DAP_NEW_STACK_SIZE(dap_stream_ch_vpn_pkt_t,
                     sizeof(pkt_out->header) + sizeof(l_ch_vpn->addr_ipv4) + sizeof(s_raw_server->ipv4_gw));
             pkt_out->header.sock_id             = s_raw_server->tun_fd;
             pkt_out->header.op_code             = VPN_PACKET_OP_CODE_VPN_ADDR_REPLY;
@@ -1713,7 +1713,7 @@ static void s_ch_packet_in_vpn_address_request(dap_stream_ch_t *a_ch, dap_chain_
             }
         } else { // All the network is filled with clients, can't lease a new address
             log_it(L_ERROR, "No free IP address left, can't lease one...");
-            ch_vpn_pkt_t* pkt_out           = DAP_NEW_STACK_SIZE(ch_vpn_pkt_t, sizeof(pkt_out->header));
+            dap_stream_ch_vpn_pkt_t* pkt_out           = DAP_NEW_STACK_SIZE(dap_stream_ch_vpn_pkt_t, sizeof(pkt_out->header));
             pkt_out->header.sock_id         = s_raw_server->tun_fd;
             pkt_out->header.op_code         = VPN_PACKET_OP_CODE_PROBLEM;
             pkt_out->header.usage_id        = a_usage->id;
@@ -1741,7 +1741,7 @@ static void s_ch_packet_in_vpn_address_request(dap_stream_ch_t *a_ch, dap_chain_
 static bool s_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
 {
     dap_stream_ch_pkt_t * l_pkt = (dap_stream_ch_pkt_t *) a_arg;
-    ch_vpn_pkt_t *l_vpn_pkt = (ch_vpn_pkt_t*)l_pkt->data;
+    dap_stream_ch_vpn_pkt_t *l_vpn_pkt = (dap_stream_ch_vpn_pkt_t*)l_pkt->data;
     if (l_pkt->hdr.data_size < sizeof(l_vpn_pkt->header)) {
         log_it(L_WARNING, "Data size of stream channel packet %u is lesser than size of VPN packet header %zu",
                                                               l_pkt->hdr.data_size, sizeof(l_vpn_pkt->header));
@@ -1942,7 +1942,7 @@ static bool s_es_tun_write(dap_events_socket_t *a_es, void *arg)
     size_t l_shift = 0;
     debug_if(s_debug_more, L_DEBUG, "Write %lu bytes to tun", l_tun->es->buf_out_size);
     for (ssize_t l_pkt_size = 0, l_bytes_written = 0; l_tun->es->buf_out_size; ) {
-        ch_vpn_pkt_t *l_vpn_pkt = (ch_vpn_pkt_t *)(l_tun->es->buf_out + l_shift);
+        dap_stream_ch_vpn_pkt_t *l_vpn_pkt = (dap_stream_ch_vpn_pkt_t *)(l_tun->es->buf_out + l_shift);
         l_pkt_size = l_vpn_pkt->header.op_data.data_size;
         debug_if(s_debug_more, L_DEBUG, "Packet: op_code 0x%02x, data size %ld",
                  l_vpn_pkt->header.op_code, l_pkt_size);
diff --git a/modules/service/vpn/dap_chain_net_vpn_client.c b/modules/service/vpn/dap_chain_net_vpn_client.c
index 03ea305bfa..753da5a726 100644
--- a/modules/service/vpn/dap_chain_net_vpn_client.c
+++ b/modules/service/vpn/dap_chain_net_vpn_client.c
@@ -181,7 +181,7 @@ static int s_callback_client_success(dap_chain_net_srv_t * a_srv, uint32_t a_usa
 
     if(l_ch) { // Is present in hash table such destination address
         size_t l_ipv4_str_len = 0; //dap_strlen(a_ipv4_str);
-        ch_vpn_pkt_t *pkt_out = (ch_vpn_pkt_t*) calloc(1, sizeof(pkt_out->header) + l_ipv4_str_len);
+        dap_stream_ch_vpn_pkt_t *pkt_out = (dap_stream_ch_vpn_pkt_t*) calloc(1, sizeof(pkt_out->header) + l_ipv4_str_len);
         if (!pkt_out) {
             log_it(L_CRITICAL, "%s", c_error_memory_alloc);
             dap_stream_session_unlock();
@@ -682,7 +682,7 @@ dap_chain_net_vpn_client_status_t dap_chain_net_vpn_client_status(void)
  */
 void dap_chain_net_vpn_client_pkt_in(dap_stream_ch_t* a_ch, dap_stream_ch_pkt_t* a_pkt)
 {
-    ch_vpn_pkt_t * l_sf_pkt = (ch_vpn_pkt_t *) a_pkt->data;
+    dap_stream_ch_vpn_pkt_t * l_sf_pkt = (dap_stream_ch_vpn_pkt_t *) a_pkt->data;
     size_t l_sf_pkt_data_size = a_pkt->hdr.data_size - sizeof(l_sf_pkt->header);
 
     if(!a_pkt->hdr.data_size) {
diff --git a/modules/service/vpn/dap_chain_net_vpn_client_tun.c b/modules/service/vpn/dap_chain_net_vpn_client_tun.c
index f5de32b36f..0b3da1c064 100644
--- a/modules/service/vpn/dap_chain_net_vpn_client_tun.c
+++ b/modules/service/vpn/dap_chain_net_vpn_client_tun.c
@@ -384,7 +384,7 @@ static void m_client_tun_read(dap_events_socket_t * a_es, void * arg)
             log_it(L_ERROR, "No remote client for incoming ip packet %s -> %s", l_str_saddr, l_str_daddr);
             break;
         }
-        ch_vpn_pkt_t* pkt_out = DAP_NEW_STACK_SIZE(ch_vpn_pkt_t, sizeof(pkt_out->header) + l_read_bytes);
+        dap_stream_ch_vpn_pkt_t* pkt_out = DAP_NEW_STACK_SIZE(dap_stream_ch_vpn_pkt_t, sizeof(pkt_out->header) + l_read_bytes);
         pkt_out->header.op_code = VPN_PACKET_OP_CODE_VPN_SEND;
         pkt_out->header.sock_id = s_fd_tun;
         pkt_out->header.op_data.data_size = l_read_bytes;
@@ -617,7 +617,7 @@ int dap_chain_net_vpn_client_tun_status(void)
 
 static void ch_sf_pkt_send(dap_stream_ch_t * a_ch, void * a_data, size_t a_data_size)
 {
-    ch_vpn_pkt_t *l_pkt_out;
+    dap_stream_ch_vpn_pkt_t *l_pkt_out;
     size_t l_pkt_out_size = sizeof(l_pkt_out->header) + a_data_size;
     //log_it(L_DEBUG,"Peer for addr %s found (pkt_size %d)"
     //       ,inet_ntoa(in_daddr), read_ret);
@@ -625,7 +625,7 @@ static void ch_sf_pkt_send(dap_stream_ch_t * a_ch, void * a_data, size_t a_data_
         log_it(L_ERROR, "Try to send to NULL channel");
        return;
     }
-    l_pkt_out = DAP_NEW_SIZE(ch_vpn_pkt_t, l_pkt_out_size);
+    l_pkt_out = DAP_NEW_SIZE(dap_stream_ch_vpn_pkt_t, l_pkt_out_size);
     memset(&l_pkt_out->header,0,sizeof(l_pkt_out->header));
     l_pkt_out->header.op_code = VPN_PACKET_OP_CODE_VPN_RECV;
     l_pkt_out->header.sock_id = a_ch->stream->esocket->socket;
@@ -669,7 +669,7 @@ void ch_sf_tun_client_send(dap_chain_net_srv_ch_vpn_t * ch_sf, void * pkt_data,
         //    if((ret = write(raw_server->tun_fd, sf_pkt->data, sf_pkt->header.op_data.data_size))<0){
         log_it(L_ERROR, "write() error %d : \"%s\"", errno, dap_strerror(errno));
         //log_it(ERROR,"raw socket ring buffer overflowed");
-        ch_vpn_pkt_t *pkt_out = (ch_vpn_pkt_t*) calloc(1, sizeof(pkt_out->header));
+        dap_stream_ch_vpn_pkt_t *pkt_out = (dap_stream_ch_vpn_pkt_t*) calloc(1, sizeof(pkt_out->header));
         if (!pkt_out) {
             log_it(L_CRITICAL, "%s", c_error_memory_alloc);
             if(in_daddr_str)
@@ -702,7 +702,7 @@ void ch_sf_tun_client_send(dap_chain_net_srv_ch_vpn_t * ch_sf, void * pkt_data,
  * @param a_pkt
  * @param a_pkt_data_size
  */
-int ch_sf_tun_addr_leased(dap_chain_net_srv_ch_vpn_t * a_sf, ch_vpn_pkt_t * a_pkt, size_t a_pkt_data_size)
+int ch_sf_tun_addr_leased(dap_chain_net_srv_ch_vpn_t * a_sf, dap_stream_ch_vpn_pkt_t * a_pkt, size_t a_pkt_data_size)
 {
     if(a_pkt_data_size < (2 * sizeof(struct in_addr))) {
         log_it(L_ERROR, "Too small ADDR_REPLY packet (%zu bytes, need at least %zu", a_pkt_data_size, 2 * sizeof(struct in_addr));
diff --git a/modules/service/vpn/include/dap_chain_net_srv_vpn.h b/modules/service/vpn/include/dap_chain_net_srv_vpn.h
index a60b0fe719..fdbae70031 100644
--- a/modules/service/vpn/include/dap_chain_net_srv_vpn.h
+++ b/modules/service/vpn/include/dap_chain_net_srv_vpn.h
@@ -62,7 +62,7 @@
 
 #define TUN_MTU 0xFFFF
 
-typedef struct ch_vpn_pkt {
+typedef struct dap_stream_ch_vpn_pkt {
     struct {
         int sock_id; // Client's socket id
         uint32_t op_code; // Operation code
@@ -70,25 +70,21 @@ typedef struct ch_vpn_pkt {
         union {
             struct { // L4 connect operation
                 uint32_t addr_size;
-                uint16_t port;
-                uint16_t padding;
-            } DAP_ALIGN_PACKED op_connect;
+                uint16_t port DAP_ALIGNED(4);
+            } DAP_PACKED op_connect;
             struct { // For data transmission, usualy for I/O functions
-                uint32_t data_size;
-                uint32_t padding;
-            } DAP_ALIGN_PACKED op_data;
+                uint32_t data_size DAP_ALIGNED(8);
+            } DAP_PACKED op_data;
             struct { // We have a problem and we know that!
-                uint32_t code; // I hope we'll have no more than 4B+ problems, not I??
-                uint32_t padding_padding_padding_damned_padding_nobody_nowhere_uses_this_fild_but_if_wil_change_me_pls_with_an_auto_rename;
-            } DAP_ALIGN_PACKED op_problem;
+                uint32_t code DAP_ALIGNED(8); // I hope we'll have no more than 4B+ problems, not I??
+            } DAP_PACKED op_problem;
             struct {
-                uint32_t padding1;
-                uint32_t padding2;
-            } DAP_ALIGN_PACKED raw; // Raw access to OP bytes
+                uint64_t op_data_raw DAP_ALIGNED(8);
+            } DAP_PACKED raw; // Raw access to OP bytes
         };
     } DAP_ALIGN_PACKED header;
     byte_t data[]; // Binary data nested by packet
-}DAP_ALIGN_PACKED ch_vpn_pkt_t;
+}DAP_ALIGN_PACKED dap_stream_ch_vpn_pkt_t;
 
 typedef struct dap_chain_net_srv_vpn_tun_socket dap_chain_net_srv_vpn_tun_socket_t;
 typedef struct dap_chain_net_srv_ch_vpn dap_chain_net_srv_ch_vpn_t;
diff --git a/modules/service/vpn/include/dap_chain_net_vpn_client_tun.h b/modules/service/vpn/include/dap_chain_net_vpn_client_tun.h
index e1c84a307e..1d5022b564 100644
--- a/modules/service/vpn/include/dap_chain_net_vpn_client_tun.h
+++ b/modules/service/vpn/include/dap_chain_net_vpn_client_tun.h
@@ -31,5 +31,5 @@ int dap_chain_net_vpn_client_tun_create(const char *a_ipv4_addr_str, const char
 int dap_chain_net_vpn_client_tun_delete(void);
 int dap_chain_net_vpn_client_tun_status(void);
 
-int ch_sf_tun_addr_leased(dap_chain_net_srv_ch_vpn_t * a_sf, ch_vpn_pkt_t * a_pkt, size_t a_pkt_data_size);
+int ch_sf_tun_addr_leased(dap_chain_net_srv_ch_vpn_t * a_sf, dap_stream_ch_vpn_pkt_t * a_pkt, size_t a_pkt_data_size);
 void ch_sf_tun_client_send(dap_chain_net_srv_ch_vpn_t * ch_sf, void * pkt_data, size_t pkt_data_size);
-- 
GitLab