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);

Reply via email to