From 1bd4525ae4cdb78e9f1f86806ccb5752296a6ea7 Mon Sep 17 00:00:00 2001
From: "Dmitriy A. Gerasimov" <dmitriy.gerasimov@demlabs.net>
Date: Thu, 10 Sep 2020 00:06:45 +0700
Subject: [PATCH] [*] Fixed situation with non-empty buffer for output when
 remote client disconnected

---
 dap-sdk/net/core/dap_events_socket.c | 13 +++++++++++--
 dap-sdk/net/core/dap_worker.c        | 14 +++++++++++++-
 2 files changed, 24 insertions(+), 3 deletions(-)

diff --git a/dap-sdk/net/core/dap_events_socket.c b/dap-sdk/net/core/dap_events_socket.c
index 542be22e87..5bd377d924 100644
--- a/dap-sdk/net/core/dap_events_socket.c
+++ b/dap-sdk/net/core/dap_events_socket.c
@@ -187,6 +187,7 @@ dap_events_socket_t * s_create_type_pipe(dap_worker_t * a_w, dap_events_socket_c
     int l_pipe[2];
     int l_errno;
     char l_errbuf[128];
+    l_errbuf[0]=0;
     if( pipe(l_pipe) < 0 ){
         l_errno = errno;
         strerror_r(l_errno, l_errbuf, sizeof (l_errbuf));
@@ -253,6 +254,7 @@ dap_events_socket_t * s_create_type_queue_ptr(dap_worker_t * a_w, dap_events_soc
     int l_pipe[2];
     int l_errno;
     char l_errbuf[128];
+    l_errbuf[0]=0;
     if( pipe2(l_pipe,O_DIRECT | O_NONBLOCK ) < 0 ){
         l_errno = errno;
         strerror_r(l_errno, l_errbuf, sizeof (l_errbuf));
@@ -290,7 +292,8 @@ dap_events_socket_t * s_create_type_queue_ptr(dap_worker_t * a_w, dap_events_soc
     l_es->mqd = mq_open(l_mq_name,O_CREAT|O_RDWR,S_IRWXU, &l_mq_attr);
     if (l_es->mqd == -1 ){
         int l_errno = errno;
-        char l_errbuf[128]={0};
+        char l_errbuf[128];
+        l_errbuf[0]=0;
         strerror_r(l_errno,l_errbuf,sizeof (l_errbuf) );
         DAP_DELETE(l_es);
         l_es = NULL;
@@ -357,7 +360,8 @@ int dap_events_socket_queue_proc_input_unsafe(dap_events_socket_t * a_esocket)
             ssize_t l_ret = mq_timedreceive(a_esocket->mqd,(char*) &l_queue_ptr, sizeof (l_queue_ptr),NULL,&s_timeout );
             if (l_ret == -1){
                 int l_errno = errno;
-                char l_errbuf[128]={0};
+                char l_errbuf[128];
+                l_errbuf[0]=0;
                 strerror_r(l_errno, l_errbuf, sizeof (l_errbuf));
                 log_it(L_ERROR, "Error in esocket queue_ptr:\"%s\" code %d", l_errbuf, l_errno);
                 return -1;
@@ -398,6 +402,7 @@ dap_events_socket_t * s_create_type_event(dap_worker_t * a_w, dap_events_socket_
     if((l_es->fd = eventfd(0,0) ) < 0 ){
         int l_errno = errno;
         char l_errbuf[128];
+        l_errbuf[0]=0;
         strerror_r(l_errno, l_errbuf, sizeof (l_errbuf));
         switch (l_errno) {
             case EINVAL: log_it(L_CRITICAL, "An unsupported value was specified in flags: \"%s\" (%d)", l_errbuf, l_errno); break;
@@ -459,6 +464,7 @@ void dap_events_socket_event_proc_input_unsafe(dap_events_socket_t *a_esocket)
         }else if ( (errno != EAGAIN) && (errno != EWOULDBLOCK) ){  // we use blocked socket for now but who knows...
             int l_errno = errno;
             char l_errbuf[128];
+            l_errbuf[0]=0;
             strerror_r(l_errno, l_errbuf, sizeof (l_errbuf));
             log_it(L_WARNING, "Can't read packet from event fd: \"%s\"(%d)", l_errbuf, l_errno);
         }else
@@ -484,6 +490,7 @@ int dap_events_socket_queue_ptr_send( dap_events_socket_t * a_es, void* a_arg)
         return  0;
     else{
         char l_errbuf[128];
+        l_errbuf[0]=0;
         strerror_r(l_errno, l_errbuf, sizeof (l_errbuf));
         log_it(L_ERROR, "Can't send ptr to queue:\"%s\" code %d", l_errbuf, l_errno);
         return l_errno;
@@ -623,6 +630,7 @@ void dap_events_socket_set_readable_unsafe( dap_events_socket_t *sc, bool is_rea
     if ( epoll_ctl(sc->worker->epoll_fd, EPOLL_CTL_MOD, sc->socket, &sc->ev) == -1 ){
         int l_errno = errno;
         char l_errbuf[128];
+        l_errbuf[0]=0;
         strerror_r( l_errno, l_errbuf, sizeof (l_errbuf));
         log_it( L_ERROR,"Can't update read client socket state in the epoll_fd: \"%s\" (%d)", l_errbuf, l_errno );
     }
@@ -659,6 +667,7 @@ void dap_events_socket_set_writable_unsafe( dap_events_socket_t *sc, bool a_is_r
         if ( epoll_ctl(sc->worker->epoll_fd, EPOLL_CTL_MOD, sc->socket, &sc->ev) ){
             int l_errno = errno;
             char l_errbuf[128];
+            l_errbuf[0]=0;
             strerror_r(l_errno, l_errbuf, sizeof (l_errbuf));
             log_it(L_ERROR,"Can't update write client socket state in the epoll_fd %d: \"%s\" (%d)",
                    sc->worker->epoll_fd, l_errbuf, l_errno);
diff --git a/dap-sdk/net/core/dap_worker.c b/dap-sdk/net/core/dap_worker.c
index ea14d3a1fe..6a2081799a 100644
--- a/dap-sdk/net/core/dap_worker.c
+++ b/dap-sdk/net/core/dap_worker.c
@@ -134,6 +134,9 @@ void *dap_worker_thread(void *arg)
                         //if(!(events[n].events & EPOLLIN))
                         //cur->no_close = false;
                         if (l_sock_err) {
+                            dap_events_socket_set_readable_unsafe(l_cur, false);
+                            dap_events_socket_set_writable_unsafe(l_cur, false);
+                            l_cur->buf_out_size = 0;
                             l_cur->flags |= DAP_SOCK_SIGNAL_CLOSE;
                             log_it(L_INFO, "Socket shutdown (EPOLLHUP): %s", strerror(l_sock_err));
                         }
@@ -150,6 +153,9 @@ void *dap_worker_thread(void *arg)
                         log_it(L_ERROR, "Socket error: %s", strerror(l_sock_err));
                     default: ;
                 }
+                dap_events_socket_set_readable_unsafe(l_cur, false);
+                dap_events_socket_set_writable_unsafe(l_cur, false);
+                l_cur->buf_out_size = 0;
                 l_cur->flags |= DAP_SOCK_SIGNAL_CLOSE;
                 l_cur->callbacks.error_callback(l_cur, 0); // Call callback to process error event
             }
@@ -157,7 +163,10 @@ void *dap_worker_thread(void *arg)
             if (l_epoll_events[n].events & EPOLLRDHUP) {
                 log_it(L_INFO, "Client socket disconnected");
                 dap_events_socket_set_readable_unsafe(l_cur, false);
+                dap_events_socket_set_writable_unsafe(l_cur, false);
+                l_cur->buf_out_size = 0;
                 l_cur->flags |= DAP_SOCK_SIGNAL_CLOSE;
+
             }
 
             if(l_epoll_events[n].events & EPOLLIN) {
@@ -244,6 +253,7 @@ void *dap_worker_thread(void *arg)
                             log_it(L_ERROR, "Some error occured in recv() function: %s", strerror(errno));
                             dap_events_socket_set_readable_unsafe(l_cur, false);
                             l_cur->flags |= DAP_SOCK_SIGNAL_CLOSE;
+                            l_cur->buf_out_size = 0;
                         }
                     }
                     else if (!(l_epoll_events[n].events & EPOLLRDHUP) || !(l_epoll_events[n].events & EPOLLERR)) {
@@ -308,6 +318,8 @@ void *dap_worker_thread(void *arg)
                     if (l_errno != EAGAIN && l_errno != EWOULDBLOCK ){ // If we have non-blocking socket
                         log_it(L_ERROR, "Some error occured in send(): %s", strerror(errno));
                         l_cur->flags |= DAP_SOCK_SIGNAL_CLOSE;
+                        l_cur->buf_out_size = 0;
+
                     }
                 }else{
 
@@ -349,7 +361,7 @@ void *dap_worker_thread(void *arg)
         }
 
     } // while
-
+    log_it(L_NOTICE,"Exiting thread #%u", l_worker->id);
     return NULL;
 }
 
-- 
GitLab