return 0;
 #elif defined(HAVE_SYS_EVENT_H)
-   struct kevent ev[2] = {0};
+   struct kevent ev[2];
    struct kevent ev_out[2];
    struct timespec timeout = {0};
    int         nev = 0;
    int         res;
 
+   /*
+    * We don't know which of the events is currently registered, perhaps
+    * both, so we always try to remove unneeded events. This means we need to
+    * tolerate ENOENT below.
+    */
    switch (what)
    {
        case CURL_POLL_IN:
            EV_SET(&ev[nev], socket, EVFILT_READ, EV_ADD | EV_RECEIPT, 0, 0, 0);
            nev++;
+           EV_SET(&ev[nev], socket, EVFILT_WRITE, EV_DELETE | EV_RECEIPT, 0, 0, 0);
+           nev++;
            break;
 
        case CURL_POLL_OUT:
            EV_SET(&ev[nev], socket, EVFILT_WRITE, EV_ADD | EV_RECEIPT, 0, 0, 0);
            nev++;
+           EV_SET(&ev[nev], socket, EVFILT_READ, EV_DELETE | EV_RECEIPT, 0, 0, 0);
+           nev++;
            break;
 
        case CURL_POLL_INOUT:
            break;
 
        case CURL_POLL_REMOVE:
-
-           /*
-            * We don't know which of these is currently registered, perhaps
-            * both, so we try to remove both.  This means we need to tolerate
-            * ENOENT below.
-            */
            EV_SET(&ev[nev], socket, EVFILT_READ, EV_DELETE | EV_RECEIPT, 0, 0, 0);
            nev++;
            EV_SET(&ev[nev], socket, EVFILT_WRITE, EV_DELETE | EV_RECEIPT, 0, 0, 0);
            return -1;
    }
 
-   res = kevent(actx->mux, ev, nev, ev_out, lengthof(ev_out), &timeout);
+   Assert(nev <= lengthof(ev));
+   Assert(nev <= lengthof(ev_out));
+
+   res = kevent(actx->mux, ev, nev, ev_out, nev, &timeout);
    if (res < 0)
    {
        actx_error(actx, "could not modify kqueue: %m");