Skip to content
Snippets Groups Projects
Commit 1bd4525a authored by Dmitriy A. Gerasimov's avatar Dmitriy A. Gerasimov
Browse files

[*] Fixed situation with non-empty buffer for output when remote client disconnected

parent 0a195263
No related branches found
No related tags found
4 merge requests!251Master,!250Master,!193bugs-4442,!190Feature 4453
Pipeline #5067 passed with stage
in 15 seconds
......@@ -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);
......
......@@ -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;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment