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