]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Minor] Check for socket error before reusing keep-alive connection
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 31 Mar 2020 11:09:24 +0000 (12:09 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 31 Mar 2020 11:09:24 +0000 (12:09 +0100)
src/libserver/http/http_context.c

index 2863c0fbc19bb085f51040e4673290ab6952e923..761760b5aeffe20b9fcada73740a5468c34b5c53 100644 (file)
@@ -415,12 +415,32 @@ rspamd_http_context_check_keepalive (struct rspamd_http_context *ctx,
                if (g_queue_get_length (conns) > 0) {
                        struct rspamd_http_keepalive_cbdata *cbd;
                        struct rspamd_http_connection *conn;
+                       gint err;
+                       socklen_t len = sizeof (gint);
 
                        cbd = g_queue_pop_head (conns);
                        rspamd_ev_watcher_stop (ctx->event_loop, &cbd->ev);
                        conn = cbd->conn;
                        g_free (cbd);
 
+                       if (getsockopt(conn->fd, SOL_SOCKET, SO_ERROR, (void *) &err, &len) == -1) {
+                               err = errno;
+                       }
+
+                       if (err != 0) {
+                               rspamd_http_connection_unref (conn);
+
+                               msg_debug_http_context ("invalid reused keepalive element %s (%s); "
+                                                       "%s error; "
+                                                       "%d connections queued",
+                                               rspamd_inet_address_to_string_pretty (phk->addr),
+                                               phk->host,
+                                               g_strerror (err),
+                                               conns->length);
+
+                               return NULL;
+                       }
+
                        msg_debug_http_context ("reused keepalive element %s (%s), %d connections queued",
                                        rspamd_inet_address_to_string_pretty (phk->addr),
                                        phk->host, conns->length);