Certain error codes are only intended for certain request-types. Add an appl_error_valid() function to test for this.
OK? martijn@ diff --git a/application.c b/application.c index 6ddeb39..53e793d 100644 --- a/application.c +++ b/application.c @@ -130,6 +130,7 @@ void appl_request_downstream_timeout(int, short, void *); void appl_request_upstream_reply(struct appl_request_upstream *); int appl_varbind_valid(struct appl_varbind *, struct appl_varbind_internal *, int, int, int, const char **); +int appl_error_valid(enum appl_error, enum snmp_pdutype); int appl_varbind_backend(struct appl_varbind_internal *); void appl_varbind_error(struct appl_varbind_internal *, enum appl_error); void appl_report(struct snmp_message *, int32_t, struct ber_oid *, @@ -1069,6 +1070,11 @@ appl_response(struct appl_backend *backend, int32_t requestid, next = pdutype == SNMP_C_GETNEXTREQ || pdutype == SNMP_C_GETBULKREQ; origvb = dreq->ard_vblist; + if (!appl_error_valid(error, dreq->ard_requesttype)) { + log_warnx("%s: %"PRIu32" Invalid error", + backend->ab_name, requestid); + invalid = 1; + } } vb = vblist; @@ -1295,6 +1301,37 @@ appl_varbind_valid(struct appl_varbind *varbind, return 1; } +int +appl_error_valid(enum appl_error error, enum snmp_pdutype type) +{ + switch (error) { + case APPL_ERROR_NOERROR: + case APPL_ERROR_TOOBIG: + case APPL_ERROR_NOSUCHNAME: + case APPL_ERROR_GENERR: + return 1; + case APPL_ERROR_BADVALUE: + case APPL_ERROR_READONLY: + case APPL_ERROR_NOACCESS: + case APPL_ERROR_WRONGTYPE: + case APPL_ERROR_WRONGLENGTH: + case APPL_ERROR_WRONGENCODING: + case APPL_ERROR_WRONGVALUE: + case APPL_ERROR_NOCREATION: + case APPL_ERROR_INCONSISTENTVALUE: + case APPL_ERROR_RESOURCEUNAVAILABLE: + case APPL_ERROR_COMMITFAILED: + case APPL_ERROR_UNDOFAILED: + case APPL_ERROR_NOTWRITABLE: + case APPL_ERROR_INCONSISTENTNAME: + return type == SNMP_C_SETREQ; + case APPL_ERROR_AUTHORIZATIONERROR: + return type == SNMP_C_GETREQ || type == SNMP_C_SETREQ; + default: + return 0; + } +} + int appl_varbind_backend(struct appl_varbind_internal *ivb) {