]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
daemon/session: fix an issue with timers obs-knot-resolver-8xyvhu/deployments/1793
authorVladimír Čunát <vladimir.cunat@nic.cz>
Thu, 22 Jul 2021 16:23:37 +0000 (18:23 +0200)
committerVladimír Čunát <vladimir.cunat@nic.cz>
Thu, 22 Jul 2021 16:27:07 +0000 (18:27 +0200)
The practical problem was also mitigated by libuv >= 1.32.0 (2ee2d46)

daemon/session.c

index a0bf23f3f966678a80b1f465a89a7d288e248dcc..668295ca0ea24284fd9f2aa6567219ad3962bd8e 100644 (file)
@@ -503,18 +503,24 @@ int session_timer_start(struct session *session, uv_timer_cb cb,
                        uint64_t timeout, uint64_t repeat)
 {
        uv_timer_t *timer = &session->timeout;
+       // Session might be closing and get here e.g. through a late on_send callback.
+       const bool is_closing = uv_is_closing((uv_handle_t *)timer);
+       if (is_closing || kr_fails_assert(is_closing == session->sflags.closing))
+               return kr_error(EINVAL);
+
        if (kr_fails_assert(timer->data == session))
                return kr_error(EINVAL);
        int ret = uv_timer_start(timer, cb, timeout, repeat);
        if (ret != 0) {
                uv_timer_stop(timer);
-               return kr_error(ENOMEM);
+               return kr_error(ret);
        }
-       return 0;
+       return kr_ok();
 }
 
 int session_timer_restart(struct session *session)
 {
+       kr_require(!uv_is_closing((uv_handle_t *)&session->timeout));
        return uv_timer_again(&session->timeout);
 }