When opening 2 sessions on an agentx connection and registering 2
authormartijn <martijn@openbsd.org>
Tue, 24 Oct 2023 14:02:52 +0000 (14:02 +0000)
committermartijn <martijn@openbsd.org>
Tue, 24 Oct 2023 14:02:52 +0000 (14:02 +0000)
overlapping regions on the different sessions, e.g. by differing in
priority and we close the underlying connection with an outstanding
request to the dominant region we will call appl_agentx_free(), which
sequentially closes all sessions. If the session with the outstanding
request is closed before the second session the request is retried
before said session is cleaned up and it will try to send it over a
conn_ax which at that point has been set to NULL, resulting in a
SIGSEGV.

Simply return early and let this second request be cancelled by the
cleanup of the second session.

OK tb@

usr.sbin/snmpd/application_agentx.c

index 98a7c57..594ef09 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: application_agentx.c,v 1.10 2023/10/24 13:41:16 martijn Exp $ */
+/*     $OpenBSD: application_agentx.c,v 1.11 2023/10/24 14:02:52 martijn Exp $ */
 /*
  * Copyright (c) 2022 Martijn van Duren <martijn@openbsd.org>
  *
@@ -712,6 +712,9 @@ appl_agentx_get(struct appl_backend *backend, int32_t transactionid,
        struct ax_searchrange *srl;
        size_t i, j, nsr;
 
+       if (session->sess_conn->conn_ax == NULL)
+               return;
+
        for (nsr = 0, vb = vblist; vb != NULL; vb = vb->av_next)
                nsr++;
 
@@ -760,6 +763,9 @@ appl_agentx_getnext(struct appl_backend *backend, int32_t transactionid,
        struct ax_searchrange *srl;
        size_t i, j, nsr;
 
+       if (session->sess_conn->conn_ax == NULL)
+               return;
+
        for (nsr = 0, vb = vblist; vb != NULL; vb = vb->av_next)
                nsr++;