Re: snmpd [7/16]: Treat agentx-close-pdu with reasonByManager as a parseerror

2023-10-24 Thread Theo Buehler
On Tue, Oct 17, 2023 at 03:03:16PM +0200, Martijn van Duren wrote:
> 
> RFC2741 section 6.2.2 says that reasonByManager can only be used by the
> agentx master. Treat this reason as a parseerror.

ok tb



snmpd [7/16]: Treat agentx-close-pdu with reasonByManager as a parseerror

2023-10-17 Thread Martijn van Duren


RFC2741 section 6.2.2 says that reasonByManager can only be used by the
agentx master. Treat this reason as a parseerror.

OK?

martijn@

diff --git a/application_agentx.c b/application_agentx.c
index d1efae2..2231d4c 100644
--- a/application_agentx.c
+++ b/application_agentx.c
@@ -576,16 +576,29 @@ appl_agentx_close(struct appl_agentx_session *session, 
struct ax_pdu *pdu)
 {
struct appl_agentx_connection *conn = session->sess_conn;
char name[100];
+   enum appl_error error = APPL_ERROR_NOERROR;
 
strlcpy(name, session->sess_backend.ab_name, sizeof(name));
-   appl_agentx_session_free(session);
-   log_info("%s: Closed by subagent (%s)", name,
-   ax_closereason2string(pdu->ap_payload.ap_close.ap_reason));
+   if (pdu->ap_payload.ap_close.ap_reason == AX_CLOSE_BYMANAGER) {
+   log_warnx("%s: Invalid close reason", name);
+   error = APPL_ERROR_PARSEERROR;
+   } else {
+   appl_agentx_session_free(session);
+   log_info("%s: Closed by subagent (%s)", name,
+   ax_closereason2string(pdu->ap_payload.ap_close.ap_reason));
+   }
 
ax_response(conn->conn_ax, pdu->ap_header.aph_sessionid,
pdu->ap_header.aph_transactionid, pdu->ap_header.aph_packetid,
-   smi_getticks(), APPL_ERROR_NOERROR, 0, NULL, 0);
+   smi_getticks(), error, 0, NULL, 0);
appl_agentx_send(-1, EV_WRITE, conn);
+   if (error == APPL_ERROR_NOERROR)
+   return;
+
+   appl_agentx_forceclose(&(session->sess_backend),
+   APPL_CLOSE_REASONPARSEERROR);
+   if (TAILQ_EMPTY(&(conn->conn_sessions)))
+   appl_agentx_free(conn, APPL_CLOSE_REASONOTHER);
 }
 
 void