fix possible crash on user deletion
[srvx.git] / src / ioset-epoll.c
index e09f83fa6b3049836c6d57a10d826b4ee4a0aac5..40e30ba3285bc1d5306ae259167f02a025f3d7c2 100644 (file)
@@ -46,7 +46,7 @@ static int
 ioset_epoll_events(struct io_fd *fd)
 {
     return EPOLLHUP
-        | (fd_wants_reads(fd) ? EPOLLIN : 0)
+        | EPOLLIN
         | (fd_wants_writes(fd) ? EPOLLOUT : 0)
         ;
 }
@@ -65,10 +65,11 @@ ioset_epoll_add(struct io_fd *fd)
 }
 
 static void
-ioset_epoll_remove(struct io_fd *fd)
+ioset_epoll_remove(struct io_fd *fd, int closed)
 {
     static struct epoll_event evt;
-    (void)epoll_ctl(epoll_fd, EPOLL_CTL_DEL, fd->fd, &evt);
+    if (!closed)
+        (void)epoll_ctl(epoll_fd, EPOLL_CTL_DEL, fd->fd, &evt);
 }
 
 static void
@@ -102,6 +103,7 @@ ioset_epoll_loop(struct timeval *timeout)
     msec = timeout ? (timeout->tv_sec * 1000 + timeout->tv_usec / 1000) : -1;
 
     res = epoll_wait(epoll_fd, evts, ArrayLength(evts), msec);
+    now = time(NULL) + clock_skew;
     if (res < 0) {
         if (errno != EINTR) {
             log_module(MAIN_LOG, LOG_ERROR, "epoll_wait() error %d: %s", errno, strerror(errno));