In most cases when a region is registered we have the full ownership. As soon as a region has been registered below prior mentioned region we could loose ownership halfway through. This case currently isn't fully tested and with indices we can return OIDs >= searchrange.end. The easiest way is to test this case is in agentx_varbind_finalize() and simply reset a varbind to EOMV if we're outside our range.
I've pulled apart the agentx_request_type cases for clarity and control. OK? martijn@ Index: agentx.c =================================================================== RCS file: /cvs/src/lib/libagentx/agentx.c,v retrieving revision 1.23 diff -u -p -r1.23 agentx.c --- agentx.c 24 Oct 2023 08:54:52 -0000 1.23 +++ agentx.c 28 Oct 2023 07:40:59 -0000 @@ -2822,7 +2822,7 @@ getnext: while (axo != NULL && axo->axo_cstate != AX_CSTATE_OPEN) axo = RB_NEXT(axc_objects, &(axc->axc_objects), axo); if (axo == NULL || - ax_oid_cmp(&(axo->axo_oid), &(axv->axv_end)) > 0) { + ax_oid_cmp(&(axo->axo_oid), &(axv->axv_end)) >= 0) { agentx_varbind_endofmibview(axv); return; } @@ -3349,19 +3349,53 @@ agentx_varbind_finalize(struct agentx_va #endif } } - cmp = ax_oid_cmp(&(axv->axv_vb.avb_oid), &oid); - if ((agentx_varbind_request(axv) == AGENTX_REQUEST_TYPE_GETNEXT && - cmp >= 0) || cmp > 0) { + cmp = ax_oid_cmp(&oid, &(axv->axv_vb.avb_oid)); + switch (agentx_varbind_request(axv)) { + case AGENTX_REQUEST_TYPE_GET: + if (cmp != 0) { #ifdef AX_DEBUG - agentx_log_axg_fatalx(axg, "indices not incremented"); + agentx_log_axg_fatalx(axg, "index changed"); #else - agentx_log_axg_warnx(axg, "indices not incremented"); - bcopy(&(axv->axv_start), &(axv->axv_vb.avb_oid), - sizeof(axv->axv_start)); - axv->axv_error = AX_PDU_ERROR_GENERR; + agentx_log_axg_warnx(axg, "index changed"); + bcopy(&(axv->axv_start), &(axv->axv_vb.avb_oid), + sizeof(axv->axv_start)); + axv->axv_error = AX_PDU_ERROR_GENERR; + break; #endif - } else + } + break; + case AGENTX_REQUEST_TYPE_GETNEXT: + if (cmp <= 0) { +#ifdef AX_DEBUG + agentx_log_axg_fatalx(axg, "indices not incremented"); +#else + agentx_log_axg_warnx(axg, "indices not incremented"); + bcopy(&(axv->axv_start), &(axv->axv_vb.avb_oid), + sizeof(axv->axv_start)); + axv->axv_error = AX_PDU_ERROR_GENERR; + break; +#endif + } + /* FALLTHROUGH */ + case AGENTX_REQUEST_TYPE_GETNEXTINCLUSIVE: + if (cmp < 0) { +#ifdef AX_DEBUG + agentx_log_axg_fatalx(axg, "index decremented"); +#else + agentx_log_axg_warnx(axg, "index decremented"); + bcopy(&(axv->axv_start), &(axv->axv_vb.avb_oid), + sizeof(axv->axv_start)); + axv->axv_error = AX_PDU_ERROR_GENERR; + break; +#endif + } + if (axv->axv_end.aoi_idlen != 0 && + ax_oid_cmp(&oid, &(axv->axv_end)) >= 0) { + agentx_varbind_endofmibview(axv); + return; + } bcopy(&oid, &(axv->axv_vb.avb_oid), sizeof(oid)); + } done: agentx_object_unlock(axv->axv_axo); agentx_get_finalize(axv->axv_axg);