]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Fix] Use cumulative timeout when dealing with TCP connections 5251/head
authorVsevolod Stakhov <vsevolod@rspamd.com>
Mon, 9 Dec 2024 12:49:19 +0000 (12:49 +0000)
committerVsevolod Stakhov <vsevolod@rspamd.com>
Mon, 9 Dec 2024 12:49:19 +0000 (12:49 +0000)
src/libutil/libev_helper.c
src/libutil/libev_helper.h
src/lua/lua_tcp.c

index 203e1ed73fb89e3c0e0d6be6f544e2d98c489a90..82fead9bb97a8afdc17848f30f779ae4444d2825 100644 (file)
@@ -69,16 +69,21 @@ void rspamd_ev_watcher_start(struct ev_loop *loop,
        }
 }
 
-void rspamd_ev_watcher_stop(struct ev_loop *loop,
-                                                       struct rspamd_io_ev *ev)
+ev_tstamp rspamd_ev_watcher_stop(struct ev_loop *loop,
+                                                                struct rspamd_io_ev *ev)
 {
+       ev_tstamp elapsed = 0;
+
        if (ev_can_stop(&ev->io)) {
                ev_io_stop(EV_A, &ev->io);
        }
 
        if (ev->timeout > 0) {
+               elapsed = ev->timeout - ev_timer_remaining(EV_A, &ev->tm);
                ev_timer_stop(EV_A, &ev->tm);
        }
+
+       return elapsed;
 }
 
 void rspamd_ev_watcher_reschedule(struct ev_loop *loop,
index d68f179516d2cf0385aebf92e93cfcda8606b9ea..be991789129132285984a0963d6d9f8cea737bc2 100644 (file)
@@ -65,9 +65,10 @@ void rspamd_ev_watcher_start(struct ev_loop *loop,
  * Stops watcher and clean it up
  * @param loop
  * @param ev
+ * @return {ev_tstamp} elapsed time
  */
-void rspamd_ev_watcher_stop(struct ev_loop *loop,
-                                                       struct rspamd_io_ev *ev);
+ev_tstamp rspamd_ev_watcher_stop(struct ev_loop *loop,
+                                                                struct rspamd_io_ev *ev);
 
 /**
  * Convenience function to reschedule watcher with different events
index f498f9598a2ea5d4e58cc5bbbbd892294354d420..bea8d2ef9bffeefc063c646a0d92a9cfe8c515ce 100644 (file)
@@ -1099,11 +1099,17 @@ lua_tcp_handler(int fd, short what, gpointer ud)
        TCP_RETAIN(cbd);
 
        msg_debug_tcp("processed TCP event: %d", what);
+       ev_tstamp elapsed;
 
        struct lua_tcp_handler *rh = g_queue_peek_head(cbd->handlers);
        event_type = rh->type;
 
-       rspamd_ev_watcher_stop(cbd->event_loop, &cbd->ev);
+       elapsed = rspamd_ev_watcher_stop(cbd->event_loop, &cbd->ev);
+
+       /* Adjust timeout, as we have already spent time */
+       if (elapsed > 0 && elapsed < cbd->ev.timeout) {
+               cbd->ev.timeout -= elapsed;
+       }
 
        if (what == EV_READ) {
                if (cbd->ssl_conn) {