Re: snmpd [3/16]: Distinguish between parseerror and openfailed for agentx-open-pdu

2023-10-17 Thread Theo Buehler
On Tue, Oct 17, 2023 at 02:51:03PM +0200, Martijn van Duren wrote:
> RFC2741 section 7.1.1 tells us that if a pdu can't be parsed we must
> return a parseerror. Section 7.1 gives an example of "An unrecognized
> value is encountered". The spec is vague is a bit vague on what
> constitutes a parseerror, vs a protocol error, so I don't want to
> muddle too much with that part, but let's at least return an
> appropriate error when a client sends invalid data in the open request.
> 
> The spec clearly states that any error, which is not a parseerror must
> be a openfailed error. So no processingerrors.
> 
> OK?

ok tb



snmpd [3/16]: Distinguish between parseerror and openfailed for agentx-open-pdu

2023-10-17 Thread Martijn van Duren
RFC2741 section 7.1.1 tells us that if a pdu can't be parsed we must
return a parseerror. Section 7.1 gives an example of "An unrecognized
value is encountered". The spec is vague is a bit vague on what
constitutes a parseerror, vs a protocol error, so I don't want to
muddle too much with that part, but let's at least return an
appropriate error when a client sends invalid data in the open request.

The spec clearly states that any error, which is not a parseerror must
be a openfailed error. So no processingerrors.

OK?

martijn@

diff --git a/application_agentx.c b/application_agentx.c
index 0d73e08..9cc98eb 100644
--- a/application_agentx.c
+++ b/application_agentx.c
@@ -411,9 +411,11 @@ appl_agentx_open(struct appl_agentx_connection *conn, 
struct ax_pdu *pdu)
struct appl_agentx_session *session;
struct ber_oid oid;
char oidbuf[1024];
+   enum appl_error error = APPL_ERROR_NOERROR;
 
if ((session = malloc(sizeof(*session))) == NULL) {
log_warn(NULL);
+   error = APPL_ERROR_OPENFAILED;
goto fail;
}
session->sess_descr.aos_string = NULL;
@@ -432,12 +434,14 @@ appl_agentx_open(struct appl_agentx_connection *conn, 
struct ax_pdu *pdu)
} else if (pdu->ap_payload.ap_open.ap_oid.aoi_idlen == 1) {
log_warnx("AgentX(%"PRIu32"): Invalid oid: Open Failed",
conn->conn_id);
+   error = APPL_ERROR_PARSEERROR;
goto fail;
}
/* RFC 2742 agentxSessionDescr */
if (pdu->ap_payload.ap_open.ap_descr.aos_slen > 255) {
log_warnx("AgentX(%"PRIu32"): Invalid descr (too long): Open "
"Failed", conn->conn_id);
+   error = APPL_ERROR_PARSEERROR;
goto fail;
}
/*
@@ -451,6 +455,7 @@ appl_agentx_open(struct appl_agentx_connection *conn, 
struct ax_pdu *pdu)
pdu->ap_payload.ap_open.ap_descr.aos_string, 0) == (size_t)-1) {
log_warnx("AgentX(%"PRIu32"): Invalid descr (not UTF-8): "
"Open Failed", conn->conn_id);
+   error = APPL_ERROR_PARSEERROR;
goto fail;
}
 
@@ -463,6 +468,7 @@ appl_agentx_open(struct appl_agentx_connection *conn, 
struct ax_pdu *pdu)
if (session->sess_descr.aos_string == NULL) {
log_warn("AgentX(%"PRIu32"): strdup: Open Failed",
conn->conn_id);
+   error = APPL_ERROR_OPENFAILED;
goto fail;
}
}
@@ -478,6 +484,7 @@ appl_agentx_open(struct appl_agentx_connection *conn, 
struct ax_pdu *pdu)
conn->conn_id, session->sess_id) == -1) {
log_warn("AgentX(%"PRIu32"): asprintf: Open Failed",
conn->conn_id);
+   error = APPL_ERROR_OPENFAILED;
goto fail;
}
session->sess_backend.ab_cookie = session;
@@ -499,7 +506,7 @@ appl_agentx_open(struct appl_agentx_connection *conn, 
struct ax_pdu *pdu)
return;
  fail:
ax_response(conn->conn_ax, 0, pdu->ap_header.aph_transactionid,
-   pdu->ap_header.aph_packetid, 0, APPL_ERROR_OPENFAILED, 0, NULL, 0);
+   pdu->ap_header.aph_packetid, 0, error, 0, NULL, 0);
appl_agentx_send(-1, EV_WRITE, conn);
if (session != NULL)
free(session->sess_descr.aos_string);