fix possible crash on user deletion
[srvx.git] / src / ioset-kevent.c
index 02a85111d61875ab15a3d52fd0ff08ee459ee928..d657082257b72aa0b01e8141affaf5c898359146 100644 (file)
@@ -75,7 +75,16 @@ ioset_kevent_remove(struct io_fd *fd, int closed)
 static void
 ioset_kevent_update(struct io_fd *fd)
 {
-    ioset_kevent_add(fd);
+    struct kevent changes[2];
+    int nchanges = 0;
+    int res;
+
+    EV_SET(&changes[nchanges++], fd->fd, EVFILT_READ, EV_ADD, 0, 0, fd);
+    EV_SET(&changes[nchanges++], fd->fd, EVFILT_WRITE, fd_wants_writes(fd) ? EV_ADD : EV_DELETE, 0, 0, fd);
+    res = kevent(kq_fd, changes, nchanges, NULL, 0, NULL);
+    if (res < 0) {
+       log_module(MAIN_LOG, LOG_ERROR, "kevent() add failed: %s", strerror(errno));
+    }
 }
 
 static void
@@ -104,10 +113,11 @@ ioset_kevent_loop(struct timeval *timeout)
        pts = NULL;
     }
     res = kevent(kq_fd, NULL, 0, events, MAX_EVENTS, pts);
-    if (res < 0) {
+    if ((res < 0) && (errno != EINTR)) {
        log_module(MAIN_LOG, LOG_ERROR, "kevent() poll failed: %s", strerror(errno));
        return 1;
     }
+    now = time(NULL) + clock_skew;
 
     /* Process the events we got. */
     for (ii = 0; ii < res; ++ii) {