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