From bb1e454769c35855af957e3a80214944cf3fb1ba Mon Sep 17 00:00:00 2001
From: "aleksei.voronin" <aleksei.voronin@demlabs.net>
Date: Sun, 19 Jul 2020 21:01:57 +0300
Subject: [PATCH] [*] attempt to fix node crash on client disconnect

---
 dap-sdk/net/server-udp/dap_udp_server.c        |  2 ++
 dap-sdk/net/stream/ch/dap_stream_ch.c          |  6 +++---
 modules/service/vpn/dap_chain_net_srv_vpn.c    | 10 +++++-----
 modules/service/vpn/dap_chain_net_vpn_client.c |  6 +++---
 4 files changed, 13 insertions(+), 11 deletions(-)

diff --git a/dap-sdk/net/server-udp/dap_udp_server.c b/dap-sdk/net/server-udp/dap_udp_server.c
index 280a6746f4..e75b837c4e 100644
--- a/dap-sdk/net/server-udp/dap_udp_server.c
+++ b/dap-sdk/net/server-udp/dap_udp_server.c
@@ -348,6 +348,8 @@ void dap_udp_server_loop( dap_server_t *d_server )
   struct epoll_event  pev;
   struct epoll_event  events[ 16 ];
 
+  memset(&pev, 0, sizeof (pev));
+
   pev.events = EPOLLIN | EPOLLERR;
   pev.data.fd = d_server->socket_listener;
 
diff --git a/dap-sdk/net/stream/ch/dap_stream_ch.c b/dap-sdk/net/stream/ch/dap_stream_ch.c
index 6ce73a49d4..417204c08e 100644
--- a/dap-sdk/net/stream/ch/dap_stream_ch.c
+++ b/dap-sdk/net/stream/ch/dap_stream_ch.c
@@ -120,7 +120,7 @@ bool dap_stream_ch_valid(dap_stream_ch_t *a_ch)
     if(!a_ch)
         return false;
     pthread_mutex_lock(&s_ch_table_lock);
-    HASH_FIND_PTR(s_ch_table, a_ch, l_ret);
+    HASH_FIND_PTR(s_ch_table, &a_ch, l_ret);
     pthread_mutex_unlock(&s_ch_table_lock);
     return l_ret;
 }
@@ -132,8 +132,8 @@ bool dap_stream_ch_valid(dap_stream_ch_t *a_ch)
 void dap_stream_ch_delete(dap_stream_ch_t *a_ch)
 {
     pthread_mutex_lock(&s_ch_table_lock);
-    struct dap_stream_ch_table_t *l_ret;;
-    HASH_FIND_PTR(s_ch_table, a_ch, l_ret);
+    struct dap_stream_ch_table_t *l_ret;
+    HASH_FIND_PTR(s_ch_table, &a_ch, l_ret);
     HASH_DEL(s_ch_table, l_ret);
     pthread_mutex_unlock(&s_ch_table_lock);
 
diff --git a/modules/service/vpn/dap_chain_net_srv_vpn.c b/modules/service/vpn/dap_chain_net_srv_vpn.c
index 10db028050..2f92c76950 100644
--- a/modules/service/vpn/dap_chain_net_srv_vpn.c
+++ b/modules/service/vpn/dap_chain_net_srv_vpn.c
@@ -1139,7 +1139,7 @@ void s_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
                             HASH_DELETE(hh2, sf_socks, sf_sock);
                             HASH_DELETE(hh_sock, sf_socks_client, sf_sock);
 
-                            struct epoll_event ev;
+                            struct epoll_event ev = {0, {0}};
                             ev.data.fd = sf_sock->sock;
                             ev.events = EPOLLIN;
                             if(epoll_ctl(sf_socks_epoll_fd, EPOLL_CTL_DEL, sf_sock->sock, &ev) < 0) {
@@ -1170,7 +1170,7 @@ void s_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
                         pthread_mutex_lock(&s_sf_socks_mutex);
                         HASH_DELETE(hh2, sf_socks, sf_sock);
                         HASH_DELETE(hh_sock, sf_socks_client, sf_sock);
-                        struct epoll_event ev;
+                        struct epoll_event ev  = {0, {0}};;
                         ev.data.fd = sf_sock->sock;
                         ev.events = EPOLLIN;
                         if(epoll_ctl(sf_socks_epoll_fd, EPOLL_CTL_DEL, sf_sock->sock, &ev) < 0) {
@@ -1244,7 +1244,7 @@ void s_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
                                 pthread_mutex_unlock(&s_sf_socks_mutex);
                                 pthread_mutex_unlock(&( CH_VPN(a_ch)->mutex));
 
-                                struct epoll_event ev;
+                                struct epoll_event ev = {0, {0}};
                                 ev.data.fd = s;
                                 ev.events = EPOLLIN | EPOLLERR;
 
@@ -1380,7 +1380,7 @@ static void s_ch_packet_out(dap_stream_ch_t* a_ch, void* a_arg)
  */
 void srv_stream_sf_disconnect(ch_vpn_socket_proxy_t * sf_sock)
 {
-    struct epoll_event ev;
+    struct epoll_event ev = {0, {0}};
     ev.data.fd = sf_sock->sock;
     ev.events = EPOLLIN | EPOLLERR;
     if(epoll_ctl(sf_socks_epoll_fd, EPOLL_CTL_DEL, sf_sock->sock, &ev) == -1) {
@@ -1409,7 +1409,7 @@ void srv_stream_sf_disconnect(ch_vpn_socket_proxy_t * sf_sock)
 void * srv_ch_sf_thread(void * a_arg)
 {
     UNUSED(a_arg);
-    struct epoll_event ev, events[SF_MAX_EVENTS] = { 0 };
+    struct epoll_event ev = {0, {0}}, events[SF_MAX_EVENTS] = { {0, {0}} };
     //pthread_mutex_lock(&sf_socks_mutex);
     sf_socks_epoll_fd = epoll_create(SF_MAX_EVENTS);
     sigset_t sf_sigmask;
diff --git a/modules/service/vpn/dap_chain_net_vpn_client.c b/modules/service/vpn/dap_chain_net_vpn_client.c
index 9109e9320c..ef7b2d77df 100644
--- a/modules/service/vpn/dap_chain_net_vpn_client.c
+++ b/modules/service/vpn/dap_chain_net_vpn_client.c
@@ -492,7 +492,7 @@ void dap_chain_net_vpn_client_pkt_in(dap_stream_ch_t* a_ch, dap_stream_ch_pkt_t*
                         HASH_DELETE(hh2, sf_socks, sf_sock);
                         HASH_DELETE(hh_sock, sf_socks_client, sf_sock);
 
-                        struct epoll_event ev;
+                        struct epoll_event ev = {0, {0}};
                         ev.data.fd = sf_sock->sock;
                         ev.events = EPOLLIN;
                         if(epoll_ctl(sf_socks_epoll_fd, EPOLL_CTL_DEL, sf_sock->sock, &ev) < 0) {
@@ -525,7 +525,7 @@ void dap_chain_net_vpn_client_pkt_in(dap_stream_ch_t* a_ch, dap_stream_ch_pkt_t*
                     HASH_DELETE(hh2, sf_socks, sf_sock);
                     HASH_DELETE(hh_sock, sf_socks_client, sf_sock);
 
-                    struct epoll_event ev;
+                    struct epoll_event ev = {0, {0}};
                     ev.data.fd = sf_sock->sock;
                     ev.events = EPOLLIN;
                     if(epoll_ctl(sf_socks_epoll_fd, EPOLL_CTL_DEL, sf_sock->sock, &ev) < 0) {
@@ -612,7 +612,7 @@ void dap_chain_net_vpn_client_pkt_in(dap_stream_ch_t* a_ch, dap_stream_ch_pkt_t*
                             pthread_mutex_unlock(&( CH_VPN(a_ch)->mutex));
                             pthread_mutex_unlock(&sf_socks_mutex);
 
-                            struct epoll_event ev;
+                            struct epoll_event ev = { 0, {0} };
                             ev.data.fd = s;
                             ev.events = EPOLLIN | EPOLLERR;
 
-- 
GitLab