properly close disconnected sockets

git-svn-id: file:///var/lib/svn/clamav-devel/branches/clamd-proto@4674 77e5149b-7576-45b1-b177-96237e5ba77b
0.95
Török Edvin 17 years ago
parent 98dcb91ef0
commit ac30aff8ea
  1. 5
      ChangeLog
  2. 32
      clamd/others.c
  3. 2
      clamd/others.h
  4. 16
      clamd/server-th.c

@ -1,3 +1,8 @@
Wed Feb 4 16:12:27 EET 2009 (edwin)
------------------------------------
* clamd/others.c, clamd/others.h, clamd/server-th.c: properly close
disconnected sockets
Wed Feb 4 15:25:43 EET 2009 (edwin)
------------------------------------
* clamd/others.h, clamd/server-th.c, clamd/session.c: reject invalid

@ -306,7 +306,7 @@ static int read_fd_data(struct fd_buf *buf)
buf->got_newdata=1;
if (!buf->buffer) /* listen-only socket */
return 0;
return 1;
if (buf->off >= buf->bufsize)
return -1;
@ -420,6 +420,9 @@ void fds_remove(struct fd_data *data, int fd)
pthread_mutex_unlock(&data->buf_mutex);
}
#ifndef C_WINDOWS
#define closesocket(s) close(s)
#endif
#define BUFFSIZE 1024
/* Wait till data is available to be read on any of the fds,
* read available data on all fds, and mark them as appropriate.
@ -483,9 +486,12 @@ int fds_poll_recv(struct fd_data *data, int timeout, int check_signals)
}
revents = data->poll_data[i].revents;
if (revents & POLLIN) {
int ret = read_fd_data(&data->buf[i]);
/* Data available to be read */
if (read_fd_data(&data->buf[i]) == -1)
if (ret == -1)
revents |= POLLERR;
else if (!ret)
revents = POLLHUP;
}
if (revents & (POLLHUP | POLLERR | POLLNVAL)) {
@ -497,7 +503,7 @@ int fds_poll_recv(struct fd_data *data, int timeout, int check_signals)
logg("!poll_recv_fds: Error condition on fd %d\n",
data->poll_data[i].fd);
}
data->buf[i].fd = -1;
data->buf[i].got_newdata = -1;
} else {
fdsok++;
}
@ -535,15 +541,21 @@ int fds_poll_recv(struct fd_data *data, int timeout, int check_signals)
if (retval > 0) {
fdsok = data->nfds;
for (i=0; i < data->nfds; i++) {
if (data->buf[i].fd < 0)
if (data->buf[i].fd < 0) {
fdsok--;
continue;
if (FD_ISSET(data->buf[i].fd, &rfds))
if (read_fd_data(&data->buf[i]) == -1) {
logg("!poll_recv_fds: Error condition on fd %d\n",
data->buf[i].fd);
data->buf[i].fd = -1;
fdsok--;
}
if (FD_ISSET(data->buf[i].fd, &rfds)) {
int ret = read_fd_data(&data->buf[i]);
if (ret == -1 || !ret) {
if (ret == -1)
logg("!poll_recv_fds: Error condition on fd %d\n",
data->buf[i].fd);
else
logg("!poll_recv_fds: Client disconnected\n");
data->buf[i].got_newdata = -1;
}
}
}
}
if (retval < 0 && errno == EBADF) {

@ -32,7 +32,7 @@ struct fd_buf {
size_t bufsize;
size_t off;
int fd;
int got_newdata;
int got_newdata; /* 0: no, 1: yes, -1: error */
int recvfd;
/* TODO: these fields don't belong here */
int id;

@ -329,6 +329,12 @@ static void *acceptloop_th(void *arg)
}
continue;
}
if (buf->got_newdata == -1) {
shutdown(buf->fd, 2);
closesocket(buf->fd);
buf->fd = -1;
continue;
}
/* listen only socket */
new_sd = accept(fds->buf[i].fd, NULL, NULL);
if (new_sd >= 0) {
@ -362,7 +368,8 @@ static void *acceptloop_th(void *arg)
#else
logg("!accept() failed\n");
#endif
continue;
/* give the poll loop a chance to close disconnected FDs */
break;
}
}
@ -782,6 +789,13 @@ int recvloop_th(int *socketds, unsigned nsockets, struct cl_engine *engine, unsi
continue;
}
if (buf->got_newdata == -1) {
shutdown(buf->fd, 2);
closesocket(buf->fd);
buf->fd = -1;
continue;
}
if (buf->fd != -1 && buf->buffer) {
client_conn_t conn;
const unsigned char *cmd;

Loading…
Cancel
Save