On Sat, Oct 28, 2023 at 09:41:55AM +0200, Martijn van Duren wrote:
> 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.

Makes sense.

> I've pulled apart the agentx_request_type cases for clarity and control.

Yes, that's more readable.

ok tb

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