libagentx currently allows OIDs with a length of 0. This isn't wrong from an agentx protocol point of view, but ber encoding can't handle OIDs with less then 2 elements, which makes it unable to map the values back to SNMP. netsnmp maps a null-oid to 0.0, but I don't think we should do that.
This diff also adds the check to a couple of other places where there was no active length checking prior. This is not an issue with current code using it (relayd(8)), because all OIDs are static, so are not susceptible for manipulation. regress still passes. OK? Index: agentx.h =================================================================== RCS file: /cvs/src/lib/libagentx/agentx.h,v retrieving revision 1.5 diff -u -p -r1.5 agentx.h --- agentx.h 27 Oct 2020 18:24:01 -0000 1.5 +++ agentx.h 24 Oct 2021 17:39:16 -0000 @@ -36,6 +36,7 @@ enum agentx_request_type { }; #define AGENTX_MASTER_PATH "/var/agentx/master" +#define AGENTX_OID_MIN_LEN 2 #define AGENTX_OID_MAX_LEN 128 #define AGENTX_OID_INDEX_MAX_LEN 10 #define AGENTX_MIB2 1, 3, 6, 1, 2, 1 Index: agentx.c =================================================================== RCS file: /cvs/src/lib/libagentx/agentx.c,v retrieving revision 1.13 diff -u -p -r1.13 agentx.c --- agentx.c 23 Oct 2021 17:13:50 -0000 1.13 +++ agentx.c 24 Oct 2021 17:39:17 -0000 @@ -189,6 +189,8 @@ static int agentx_request(struct agentx static int agentx_request_cmp(struct agentx_request *, struct agentx_request *); static int agentx_strcat(char **, const char *); +static int agentx_oidfill(struct ax_oid *, const uint32_t[], size_t, + const char **); RB_PROTOTYPE_STATIC(ax_requests, agentx_request, axr_ax_requests, agentx_request_cmp) @@ -362,25 +364,26 @@ agentx_session(struct agentx *ax, uint32 size_t oidlen, const char *descr, uint8_t timeout) { struct agentx_session *axs; - size_t i; + const char *errstr; - if (oidlen > AGENTX_OID_MAX_LEN) { -#ifdef AX_DEBUG - agentx_log_ax_fatalx(ax, "%s: oidlen > %d", __func__, - AGENTX_OID_MAX_LEN); -#else - errno = EINVAL; - return NULL; -#endif - } if ((axs = calloc(1, sizeof(*axs))) == NULL) return NULL; axs->axs_ax = ax; axs->axs_timeout = timeout; - for (i = 0; i < oidlen; i++) - axs->axs_oid.aoi_id[i] = oid[i]; - axs->axs_oid.aoi_idlen = oidlen; + /* RFC 2741 section 6.2.1: may send a null Object Identifier */ + if (oidlen == 0) + axs->axs_oid.aoi_idlen = oidlen; + else { + if (agentx_oidfill((&axs->axs_oid), oid, oidlen, + &errstr) == -1) { +#ifdef AX_DEBUG + agentx_log_ax_fatalx(ax, "%s: %s", __func__, errstr); +#else + return NULL; +#endif + } + } axs->axs_descr.aos_string = (unsigned char *)strdup(descr); if (axs->axs_descr.aos_string == NULL) { free(axs); @@ -670,11 +673,21 @@ agentx_context_object_find(struct agentx const uint32_t oid[], size_t oidlen, int active, int instance) { struct agentx_object *axo, axo_search; - size_t i; + const char *errstr; - for (i = 0; i < oidlen; i++) - axo_search.axo_oid.aoi_id[i] = oid[i]; - axo_search.axo_oid.aoi_idlen = oidlen; + if (agentx_oidfill(&(axo_search.axo_oid), oid, oidlen, &errstr) == -1) { + if (oidlen > AGENTX_OID_MIN_LEN) { +#ifdef AX_DEBUG + agentx_log_axc_fatalx(axc, "%s: %s", __func__, errstr); +#else + agentx_log_axc_warnx(axc, "%s: %s", __func__, errstr); + return NULL; + } +#endif + if (oidlen == 1) + axo_search.axo_oid.aoi_id[0] = oid[0]; + axo_search.axo_oid.aoi_idlen = oidlen; + } axo = RB_FIND(axc_objects, &(axc->axc_objects), &axo_search); while (axo == NULL && !instance && axo_search.axo_oid.aoi_idlen > 0) { @@ -691,11 +704,21 @@ agentx_context_object_nfind(struct agent const uint32_t oid[], size_t oidlen, int active, int inclusive) { struct agentx_object *axo, axo_search; - size_t i; + const char *errstr; - for (i = 0; i < oidlen; i++) - axo_search.axo_oid.aoi_id[i] = oid[i]; - axo_search.axo_oid.aoi_idlen = oidlen; + if (agentx_oidfill(&(axo_search.axo_oid), oid, oidlen, &errstr) == -1) { + if (oidlen > AGENTX_OID_MIN_LEN) { +#ifdef AX_DEBUG + agentx_log_axc_fatalx(axc, "%s: %s", __func__, errstr); +#else + agentx_log_axc_warnx(axc, "%s: %s", __func__, errstr); + return NULL; +#endif + } + if (oidlen == 1) + axo_search.axo_oid.aoi_id[0] = oid[0]; + axo_search.axo_oid.aoi_idlen = oidlen; + } axo = RB_NFIND(axc_objects, &(axc->axc_objects), &axo_search); if (!inclusive && axo != NULL && @@ -785,7 +808,7 @@ agentx_agentcaps(struct agentx_context * size_t oidlen, const char *descr) { struct agentx_agentcaps *axa; - size_t i; + const char *errstr; if (axc->axc_dstate == AX_DSTATE_CLOSE) agentx_log_axc_fatalx(axc, "%s: use after free", __func__); @@ -794,9 +817,14 @@ agentx_agentcaps(struct agentx_context * return NULL; axa->axa_axc = axc; - for (i = 0; i < oidlen; i++) - axa->axa_oid.aoi_id[i] = oid[i]; - axa->axa_oid.aoi_idlen = oidlen; + if (agentx_oidfill(&(axa->axa_oid), oid, oidlen, &errstr) == -1) { +#ifdef AX_DEBUG + agentx_log_axc_fatalx(axc, "%s: %s", __func__, errstr); +#else + agentx_log_axc_warnx(axc, "%s: %s", __func__, errstr); + return NULL; +#endif + } axa->axa_descr.aos_string = (unsigned char *)strdup(descr); if (axa->axa_descr.aos_string == NULL) { free(axa); @@ -1003,31 +1031,19 @@ agentx_region(struct agentx_context *axc { struct agentx_region *axr; struct ax_oid tmpoid; - size_t i; + const char *errstr; if (axc->axc_dstate == AX_DSTATE_CLOSE) agentx_log_axc_fatalx(axc, "%s: use after free", __func__); - if (oidlen < 1) { -#ifdef AX_DEBUG - agentx_log_axc_fatalx(axc, "%s: oidlen == 0", __func__); -#else - errno = EINVAL; - return NULL; -#endif - } - if (oidlen > AGENTX_OID_MAX_LEN) { + + if (agentx_oidfill(&tmpoid, oid, oidlen, &errstr) == -1) { #ifdef AX_DEBUG - agentx_log_axc_fatalx(axc, "%s: oidlen > %d", __func__, - AGENTX_OID_MAX_LEN); + agentx_log_axc_fatalx(axc, "%s: %s", __func__, errstr); #else - errno = EINVAL; return NULL; #endif + } - - for (i = 0; i < oidlen; i++) - tmpoid.aoi_id[i] = oid[i]; - tmpoid.aoi_idlen = oidlen; TAILQ_FOREACH(axr, &(axc->axc_regions), axr_axc_regions) { if (ax_oid_cmp(&(axr->axr_oid), &tmpoid) == 0) { #ifdef AX_DEBUG @@ -1317,24 +1333,17 @@ agentx_index_integer_new(struct agentx_r size_t oidlen) { struct ax_varbind vb; - size_t i; + const char *errstr; - if (oidlen > AGENTX_OID_MAX_LEN) { + vb.avb_type = AX_DATA_TYPE_INTEGER; + if (agentx_oidfill(&(vb.avb_oid), oid, oidlen, &errstr) == -1) { #ifdef AX_DEBUG - agentx_log_axc_fatalx(axr->axr_axc, "%s: oidlen > %d", - __func__, AGENTX_OID_MAX_LEN); + agentx_log_axc_fatalx(axr->axr_axc, "%s: %s", __func__, errstr); #else - agentx_log_axc_warnx(axr->axr_axc, "%s: oidlen > %d", - __func__, AGENTX_OID_MAX_LEN); - errno = EINVAL; + agentx_log_axc_warnx(axr->axr_axc, "%s: %s", __func__, errstr); return NULL; #endif } - - vb.avb_type = AX_DATA_TYPE_INTEGER; - for (i = 0; i < oidlen; i++) - vb.avb_oid.aoi_id[i] = oid[i]; - vb.avb_oid.aoi_idlen = oidlen; vb.avb_data.avb_int32 = 0; return agentx_index(axr, &vb, AXI_TYPE_NEW); @@ -1345,24 +1354,17 @@ agentx_index_integer_any(struct agentx_r size_t oidlen) { struct ax_varbind vb; - size_t i; + const char *errstr; - if (oidlen > AGENTX_OID_MAX_LEN) { + vb.avb_type = AX_DATA_TYPE_INTEGER; + if (agentx_oidfill(&(vb.avb_oid), oid, oidlen, &errstr) == -1) { #ifdef AX_DEBUG - agentx_log_axc_fatalx(axr->axr_axc, "%s: oidlen > %d", - __func__, AGENTX_OID_MAX_LEN); + agentx_log_axc_fatalx(axr->axr_axc, "%s: %s", __func__, errstr); #else - agentx_log_axc_warnx(axr->axr_axc, "%s: oidlen > %d", - __func__, AGENTX_OID_MAX_LEN); - errno = EINVAL; + agentx_log_axc_warnx(axr->axr_axc, "%s: %s", __func__, errstr); return NULL; #endif } - - vb.avb_type = AX_DATA_TYPE_INTEGER; - for (i = 0; i < oidlen; i++) - vb.avb_oid.aoi_id[i] = oid[i]; - vb.avb_oid.aoi_idlen = oidlen; vb.avb_data.avb_int32 = 0; return agentx_index(axr, &vb, AXI_TYPE_ANY); @@ -1373,19 +1375,8 @@ agentx_index_integer_value(struct agentx size_t oidlen, int32_t value) { struct ax_varbind vb; - size_t i; + const char *errstr; - if (oidlen > AGENTX_OID_MAX_LEN) { -#ifdef AX_DEBUG - agentx_log_axc_fatalx(axr->axr_axc, "%s: oidlen > %d", - __func__, AGENTX_OID_MAX_LEN); -#else - agentx_log_axc_warnx(axr->axr_axc, "%s: oidlen > %d", - __func__, AGENTX_OID_MAX_LEN); - errno = EINVAL; - return NULL; -#endif - } if (value < 0) { #ifdef AX_DEBUG agentx_log_axc_fatalx(axr->axr_axc, "%s: value < 0", __func__); @@ -1397,9 +1388,14 @@ agentx_index_integer_value(struct agentx } vb.avb_type = AX_DATA_TYPE_INTEGER; - for (i = 0; i < oidlen; i++) - vb.avb_oid.aoi_id[i] = oid[i]; - vb.avb_oid.aoi_idlen = oidlen; + if (agentx_oidfill(&(vb.avb_oid), oid, oidlen, &errstr) == -1) { +#ifdef AX_DEBUG + agentx_log_axc_fatalx(axr->axr_axc, "%s: %s", __func__, errstr); +#else + agentx_log_axc_warnx(axr->axr_axc, "%s: %s", __func__, errstr); + return NULL; +#endif + } vb.avb_data.avb_int32 = value; return agentx_index(axr, &vb, AXI_TYPE_VALUE); @@ -1410,25 +1406,18 @@ agentx_index_integer_dynamic(struct agen size_t oidlen) { struct ax_varbind vb; - size_t i; + const char *errstr; - if (oidlen > AGENTX_OID_MAX_LEN) { + vb.avb_type = AX_DATA_TYPE_INTEGER; + if (agentx_oidfill(&(vb.avb_oid), oid, oidlen, &errstr) == -1) { #ifdef AX_DEBUG - agentx_log_axc_fatalx(axr->axr_axc, "%s: oidlen > %d", - __func__, AGENTX_OID_MAX_LEN); + agentx_log_axc_fatalx(axr->axr_axc, "%s: %s", __func__, errstr); #else - agentx_log_axc_warnx(axr->axr_axc, "%s: oidlen > %d", - __func__, AGENTX_OID_MAX_LEN); - errno = EINVAL; + agentx_log_axc_warnx(axr->axr_axc, "%s: %s", __func__, errstr); return NULL; #endif } - vb.avb_type = AX_DATA_TYPE_INTEGER; - for (i = 0; i < oidlen; i++) - vb.avb_oid.aoi_id[i] = oid[i]; - vb.avb_oid.aoi_idlen = oidlen; - return agentx_index(axr, &vb, AXI_TYPE_DYNAMIC); } @@ -1437,24 +1426,17 @@ agentx_index_string_dynamic(struct agent size_t oidlen) { struct ax_varbind vb; - size_t i; + const char *errstr; - if (oidlen > AGENTX_OID_MAX_LEN) { + vb.avb_type = AX_DATA_TYPE_OCTETSTRING; + if (agentx_oidfill(&(vb.avb_oid), oid, oidlen, &errstr) == -1) { #ifdef AX_DEBUG - agentx_log_axc_fatalx(axr->axr_axc, "%s: oidlen > %d", - __func__, AGENTX_OID_MAX_LEN); + agentx_log_axc_fatalx(axr->axr_axc, "%s: %s", __func__, errstr); #else - agentx_log_axc_warnx(axr->axr_axc, "%s: oidlen > %d", - __func__, AGENTX_OID_MAX_LEN); - errno = EINVAL; + agentx_log_axc_warnx(axr->axr_axc, "%s: %s", __func__, errstr); return NULL; #endif } - - vb.avb_type = AX_DATA_TYPE_OCTETSTRING; - for (i = 0; i < oidlen; i++) - vb.avb_oid.aoi_id[i] = oid[i]; - vb.avb_oid.aoi_idlen = oidlen; vb.avb_data.avb_ostring.aos_slen = 0; vb.avb_data.avb_ostring.aos_string = NULL; @@ -1466,19 +1448,8 @@ agentx_index_nstring_dynamic(struct agen size_t oidlen, size_t vlen) { struct ax_varbind vb; - size_t i; + const char *errstr; - if (oidlen > AGENTX_OID_MAX_LEN) { -#ifdef AX_DEBUG - agentx_log_axc_fatalx(axr->axr_axc, "%s: oidlen > %d", - __func__, AGENTX_OID_MAX_LEN); -#else - agentx_log_axc_warnx(axr->axr_axc, "%s: oidlen > %d", - __func__, AGENTX_OID_MAX_LEN); - errno = EINVAL; - return NULL; -#endif - } if (vlen == 0 || vlen > AGENTX_OID_MAX_LEN) { #ifdef AX_DEBUG agentx_log_axc_fatalx(axr->axr_axc, "%s: invalid string " @@ -1492,9 +1463,14 @@ agentx_index_nstring_dynamic(struct agen } vb.avb_type = AX_DATA_TYPE_OCTETSTRING; - for (i = 0; i < oidlen; i++) - vb.avb_oid.aoi_id[i] = oid[i]; - vb.avb_oid.aoi_idlen = oidlen; + if (agentx_oidfill(&(vb.avb_oid), oid, oidlen, &errstr) == -1) { +#ifdef AX_DEBUG + agentx_log_axc_fatalx(axr->axr_axc, "%s: %s", __func__, errstr); +#else + agentx_log_axc_warnx(axr->axr_axc, "%s: %s", __func__, errstr); + return NULL; +#endif + } vb.avb_data.avb_ostring.aos_slen = vlen; vb.avb_data.avb_ostring.aos_string = NULL; @@ -1506,24 +1482,17 @@ agentx_index_oid_dynamic(struct agentx_r size_t oidlen) { struct ax_varbind vb; - size_t i; + const char *errstr; - if (oidlen > AGENTX_OID_MAX_LEN) { + vb.avb_type = AX_DATA_TYPE_OID; + if (agentx_oidfill(&(vb.avb_oid), oid, oidlen, &errstr) == -1) { #ifdef AX_DEBUG - agentx_log_axc_fatalx(axr->axr_axc, "%s: oidlen > %d", - __func__, AGENTX_OID_MAX_LEN); + agentx_log_axc_fatalx(axr->axr_axc, "%s: %s", __func__, errstr); #else - agentx_log_axc_warnx(axr->axr_axc, "%s: oidlen > %d", - __func__, AGENTX_OID_MAX_LEN); - errno = EINVAL; + agentx_log_axc_warnx(axr->axr_axc, "%s: %s", __func__, errstr); return NULL; #endif } - - vb.avb_type = AX_DATA_TYPE_OID; - for (i = 0; i < oidlen; i++) - vb.avb_oid.aoi_id[i] = oid[i]; - vb.avb_oid.aoi_idlen = oidlen; vb.avb_data.avb_oid.aoi_idlen = 0; return agentx_index(axr, &vb, AXI_TYPE_DYNAMIC); @@ -1534,20 +1503,9 @@ agentx_index_noid_dynamic(struct agentx_ size_t oidlen, size_t vlen) { struct ax_varbind vb; - size_t i; + const char *errstr; - if (oidlen > AGENTX_OID_MAX_LEN) { -#ifdef AX_DEBUG - agentx_log_axc_fatalx(axr->axr_axc, "%s: oidlen > %d", - __func__, AGENTX_OID_MAX_LEN); -#else - agentx_log_axc_warnx(axr->axr_axc, "%s: oidlen > %d", - __func__, AGENTX_OID_MAX_LEN); - errno = EINVAL; - return NULL; -#endif - } - if (vlen == 0 || vlen > AGENTX_OID_MAX_LEN) { + if (vlen < AGENTX_OID_MIN_LEN || vlen > AGENTX_OID_MAX_LEN) { #ifdef AX_DEBUG agentx_log_axc_fatalx(axr->axr_axc, "%s: invalid string " "length: %zu\n", __func__, vlen); @@ -1560,9 +1518,14 @@ agentx_index_noid_dynamic(struct agentx_ } vb.avb_type = AX_DATA_TYPE_OID; - for (i = 0; i < oidlen; i++) - vb.avb_oid.aoi_id[i] = oid[i]; - vb.avb_oid.aoi_idlen = oidlen; + if (agentx_oidfill(&(vb.avb_oid), oid, oidlen, &errstr) == -1) { +#ifdef AX_DEBUG + agentx_log_axc_fatalx(axr->axr_axc, "%s: %s", __func__, errstr); +#else + agentx_log_axc_warnx(axr->axr_axc, "%s: %s", __func__, errstr); + return NULL; +#endif + } vb.avb_data.avb_oid.aoi_idlen = vlen; return agentx_index(axr, &vb, AXI_TYPE_DYNAMIC); @@ -1573,25 +1536,18 @@ agentx_index_ipaddress_dynamic(struct ag size_t oidlen) { struct ax_varbind vb; - size_t i; + const char *errstr; - if (oidlen > AGENTX_OID_MAX_LEN) { + vb.avb_type = AX_DATA_TYPE_IPADDRESS; + if (agentx_oidfill(&(vb.avb_oid), oid, oidlen, &errstr) == -1) { #ifdef AX_DEBUG - agentx_log_axc_fatalx(axr->axr_axc, "%s: oidlen > %d", - __func__, AGENTX_OID_MAX_LEN); + agentx_log_axc_fatalx(axr->axr_axc, "%s: %s", __func__, errstr); #else - agentx_log_axc_warnx(axr->axr_axc, "%s: oidlen > %d", - __func__, AGENTX_OID_MAX_LEN); - errno = EINVAL; + agentx_log_axc_warnx(axr->axr_axc, "%s: %s", __func__, errstr); return NULL; #endif } - - vb.avb_type = AX_DATA_TYPE_IPADDRESS; - for (i = 0; i < oidlen; i++) - vb.avb_oid.aoi_id[i] = oid[i]; vb.avb_data.avb_ostring.aos_string = NULL; - vb.avb_oid.aoi_idlen = oidlen; return agentx_index(axr, &vb, AXI_TYPE_DYNAMIC); } @@ -1953,34 +1909,13 @@ agentx_object(struct agentx_region *axr, { struct agentx_object *axo, **taxo, axo_search; struct agentx_index *laxi; + const char *errstr; int ready = 1; size_t i, j; if (axr->axr_dstate == AX_DSTATE_CLOSE) agentx_log_axc_fatalx(axr->axr_axc, "%s: use after free", __func__); - if (oidlen < 1) { -#ifdef AX_DEBUG - agentx_log_axc_fatalx(axr->axr_axc, "%s: oidlen == 0", - __func__); -#else - agentx_log_axc_warnx(axr->axr_axc, "%s: oidlen == 0", - __func__); - errno = EINVAL; - return NULL; -#endif - } - if (oidlen > AGENTX_OID_MAX_LEN) { -#ifdef AX_DEBUG - agentx_log_axc_fatalx(axr->axr_axc, "%s: oidlen > %d", - __func__, AGENTX_OID_MAX_LEN); -#else - agentx_log_axc_warnx(axr->axr_axc, "%s: oidlen > %d", - __func__, AGENTX_OID_MAX_LEN); - errno = EINVAL; - return NULL; -#endif - } if (axilen > AGENTX_OID_INDEX_MAX_LEN) { #ifdef AX_DEBUG agentx_log_axc_fatalx(axr->axr_axc, "%s: indexlen > %d", @@ -1993,9 +1928,14 @@ agentx_object(struct agentx_region *axr, #endif } - for (i = 0; i < oidlen; i++) - axo_search.axo_oid.aoi_id[i] = oid[i]; - axo_search.axo_oid.aoi_idlen = oidlen; + if (agentx_oidfill(&(axo_search.axo_oid), oid, oidlen, &errstr) == -1) { +#ifdef AX_DEBUG + agentx_log_axc_fatalx(axr->axr_axc, "%s: %s", __func__, errstr); +#else + agentx_log_axc_warnx(axr->axr_axc, "%s: %s", __func__, errstr); + return NULL; +#endif + } do { if (RB_FIND(axc_objects, &(axr->axr_axc->axc_objects), @@ -3061,8 +3001,7 @@ agentx_varbind_printf(struct agentx_varb if (r == -1) { axv->axv_vb.avb_data.avb_ostring.aos_string = NULL; agentx_log_axg_warn(axv->axv_axg, "Couldn't bind string"); - agentx_varbind_error_type(axv, - AX_PDU_ERROR_PROCESSINGERROR, 1); + agentx_varbind_error_type(axv, AX_PDU_ERROR_PROCESSINGERROR, 1); return; } axv->axv_vb.avb_data.avb_ostring.aos_slen = r; @@ -3082,13 +3021,20 @@ void agentx_varbind_oid(struct agentx_varbind *axv, const uint32_t oid[], size_t oidlen) { - size_t i; + const char *errstr; axv->axv_vb.avb_type = AX_DATA_TYPE_OID; - for (i = 0; i < oidlen; i++) - axv->axv_vb.avb_data.avb_oid.aoi_id[i] = oid[i]; - axv->axv_vb.avb_data.avb_oid.aoi_idlen = oidlen; + if (agentx_oidfill(&(axv->axv_vb.avb_data.avb_oid), + oid, oidlen, &errstr) == -1) { +#ifdef AX_DEBUG + agentx_log_axg_fatalx(axv->axv_axg, "%s: %s", __func__, errstr); +#else + agentx_log_axg_warnx(axv->axv_axg, "%s: %s", __func__, errstr); + agentx_varbind_error_type(axv, AX_PDU_ERROR_PROCESSINGERROR, 1); + return; +#endif + } agentx_varbind_finalize(axv); } @@ -3689,6 +3635,7 @@ agentx_varbind_set_index_oid(struct agen struct agentx_index *axi, const uint32_t *value, size_t oidlen) { struct ax_oid *curvalue, oid; + const char *errstr; size_t i; if (axi->axi_vb.avb_type != AX_DATA_TYPE_OID) { @@ -3719,9 +3666,20 @@ agentx_varbind_set_index_oid(struct agen #endif } curvalue = &(axv->axv_index[i].axv_idata.avb_oid); - for (i = 0; i < oidlen; i++) - oid.aoi_id[i] = value[i]; - oid.aoi_idlen = oidlen; + if (agentx_oidfill(&oid, value, + oidlen, &errstr) == -1) { +#ifdef AX_DEBUG + agentx_log_axg_fatalx(axv->axv_axg, "%s: %s", + __func__, errstr); +#else + agentx_log_axg_warnx(axv->axv_axg, "%s: %s", + __func__, errstr); + agentx_varbind_error_type(axv, + AX_PDU_ERROR_PROCESSINGERROR, 1); + return; +#endif + } + if (axv->axv_axg->axg_type == AX_PDU_TYPE_GET && ax_oid_cmp(&oid, curvalue) != 0) { #ifdef AX_DEBUG @@ -3735,9 +3693,8 @@ agentx_varbind_set_index_oid(struct agen return; #endif } - for (i = 0; i < oidlen; i++) - curvalue->aoi_id[i] = value[i]; - curvalue->aoi_idlen = oidlen; + + *curvalue = oid; return; } } @@ -3878,6 +3835,29 @@ agentx_strcat(char **dst, const char *sr } (void)strlcat(*dst, src, buflen); + return 0; +} + +static int +agentx_oidfill(struct ax_oid *oid, const uint32_t oidval[], size_t oidlen, + const char **errstr) +{ + size_t i; + + if (oidlen < AGENTX_OID_MIN_LEN) { + *errstr = "oidlen < 2"; + errno = EINVAL; + return -1; + } + if (oidlen > AGENTX_OID_MAX_LEN) { + *errstr = "oidlen > 128"; + errno = EINVAL; + return -1; + } + + for (i = 0; i < oidlen; i++) + oid->aoi_id[i] = oidval[i]; + oid->aoi_idlen = oidlen; return 0; }