ping
On Fri, 2021-10-01 at 16:42 +0200, Martijn van Duren wrote:
> Right now ober_oid_cmp has inverted logic compared to other *cmp
> functions. Specifically values greater than 0 are returned when
> a is smaller than b.
> Additionally, the value of 2 is only used b is a child of a, but
> -1 is returned when a is a child of b.
>
> This makes it harder than needed to use it with say the RB_*
> family of functions, as well as wanting to test between the
> parent-child relationship between two value.
>
> Both these issues are not present in ax_oid_cmp and I would like
> to copy the logic over from there.
>
> Manpage bits mostly taken from strcmp(3)
>
> I did a full scan of our tree and I could only find this function in
> snmp(1) and snmpd(8) and patches for those are attaches as well.
> No known 3rd party software is using this code.
>
> Regress for libagentx, snmp and snmp pass.
>
> OK for the next cycle?
>
> martijn@
>
> Index: lib/libutil/ber.c
> ===================================================================
> RCS file: /cvs/src/lib/libutil/ber.c,v
> retrieving revision 1.22
> diff -u -p -r1.22 ber.c
> --- lib/libutil/ber.c 29 Aug 2021 13:27:11 -0000 1.22
> +++ lib/libutil/ber.c 1 Oct 2021 14:36:34 -0000
> @@ -473,26 +473,21 @@ ober_string2oid(const char *oidstr, stru
> int
> ober_oid_cmp(struct ber_oid *a, struct ber_oid *b)
> {
> - size_t i;
> - for (i = 0; i < a->bo_n && i < b->bo_n; i++) {
> - if (a->bo_id[i] == b->bo_id[i])
> - continue;
> - else if (a->bo_id[i] < b->bo_id[i]) {
> - /* b is a successor of a */
> - return (1);
> - } else {
> - /* b is a predecessor of a */
> + size_t i, min;
> +
> + min = a->bo_n < b->bo_n ? a->bo_n : b->bo_n;
> + for (i = 0; i < min; i++) {
> + if (a->bo_id[i] < b->bo_id[i])
> return (-1);
> - }
> + if (a->bo_id[i] > b->bo_id[i])
> + return (1);
> }
> - /* b is larger, but a child of a */
> + /* a is parent of b */
> if (a->bo_n < b->bo_n)
> - return (2);
> - /* b is a predecessor of a */
> + return (-2);
> + /* a is child of b */
> if (a->bo_n > b->bo_n)
> - return -1;
> -
> - /* b and a are identical */
> + return 2;
> return (0);
> }
>
> Index: lib/libutil/ober_oid_cmp.3
> ===================================================================
> RCS file: /cvs/src/lib/libutil/ober_oid_cmp.3,v
> retrieving revision 1.4
> diff -u -p -r1.4 ober_oid_cmp.3
> --- lib/libutil/ober_oid_cmp.3 12 Mar 2021 07:24:49 -0000 1.4
> +++ lib/libutil/ober_oid_cmp.3 1 Oct 2021 14:36:34 -0000
> @@ -66,26 +66,17 @@ returns the number of bytes written or 0
> returns 0 on success or -1 on failure.
> .Pp
> .Fn ober_oid_cmp
> -returns 0 when oids
> +returns an integer greater than, equal to, or less than 0, according to
> whether
> +the oid
> +.Fa a
> +is greater than, equal to, or less than the oid
> +.Fa b .
> +If the shortest length from
> .Fa a
> and
> .Fa b
> -are identical.
> -If
> -.Fa b
> -is a successor of
> -.Fa a ,
> -1 is returned.
> -If
> -.Fa b
> -is a predecessor of
> -.Fa a ,
> --1 is returned.
> -If
> -.Fa b
> -is larger, but a child of
> -.Fa a ,
> -2 is returned.
> +matches
> +the weight of the integer is 2, else it is 1.
> .Sh SEE ALSO
> .Xr ober_add_string 3 ,
> .Xr ober_get_string 3 ,
> Index: usr.sbin/snmpd/traphandler.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/snmpd/traphandler.c,v
> retrieving revision 1.21
> diff -u -p -r1.21 traphandler.c
> --- usr.sbin/snmpd/traphandler.c 22 Feb 2021 11:31:09 -0000 1.21
> +++ usr.sbin/snmpd/traphandler.c 1 Oct 2021 14:36:34 -0000
> @@ -440,7 +440,7 @@ trapcmd_cmp(struct trapcmd *cmd1, struct
> {
> int ret;
>
> - ret = ober_oid_cmp(cmd2->cmd_oid, cmd1->cmd_oid);
> + ret = ober_oid_cmp(cmd1->cmd_oid, cmd2->cmd_oid);
> switch (ret) {
> case 2:
> /* cmd1 is a child of cmd2 */
> Index: usr.bin/snmp/smi.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/snmp/smi.c,v
> retrieving revision 1.14
> diff -u -p -r1.14 smi.c
> --- usr.bin/snmp/smi.c 4 Jan 2021 08:00:29 -0000 1.14
> +++ usr.bin/snmp/smi.c 1 Oct 2021 14:36:34 -0000
> @@ -506,7 +506,7 @@ smi_string2oid(const char *oidstr, struc
> *p++ = '\0';
> if ((oid = smi_findkey(sp)) != NULL) {
> bcopy(&oid->o_id, &ko, sizeof(ko));
> - if (o->bo_n && ober_oid_cmp(o, &ko) != 2)
> + if (o->bo_n && ober_oid_cmp(&ko, o) != 2)
> return (-1);
> bcopy(&ko, o, sizeof(*o));
> errstr = NULL;
> Index: usr.bin/snmp/snmpc.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/snmp/snmpc.c,v
> retrieving revision 1.37
> diff -u -p -r1.37 snmpc.c
> --- usr.bin/snmp/snmpc.c 11 Aug 2021 18:53:45 -0000 1.37
> +++ usr.bin/snmp/snmpc.c 1 Oct 2021 14:36:34 -0000
> @@ -640,7 +640,7 @@ snmpc_walk(int argc, char *argv[])
> }
> while (1) {
> for (i = 0; i < walk_skip_len; i++) {
> - skip_cmp = ober_oid_cmp(&(walk_skip[i]), &noid);
> + skip_cmp = ober_oid_cmp(&noid, &(walk_skip[i]));
> if (skip_cmp == 0 || skip_cmp == 2) {
> bcopy(&(walk_skip[i]), &noid, sizeof(noid));
> noid.bo_id[noid.bo_n -1]++;
> @@ -673,19 +673,19 @@ snmpc_walk(int argc, char *argv[])
> value->be_type == BER_TYPE_EOC)
> break;
> for (i = 0; i < walk_skip_len; i++) {
> - skip_cmp = ober_oid_cmp(&(walk_skip[i]), &noid);
> + skip_cmp = ober_oid_cmp(&noid, &(walk_skip[i]));
> if (skip_cmp == 0 || skip_cmp == 2)
> break;
> }
> if (i < walk_skip_len)
> continue;
> - prev_cmp = ober_oid_cmp(&loid, &noid);
> + prev_cmp = ober_oid_cmp(&noid, &loid);
> if (walk_check_increase && prev_cmp == -1)
> errx(1, "OID not increasing");
> - if (prev_cmp == 0 || ober_oid_cmp(&oid, &noid) != 2)
> + if (prev_cmp == 0 || ober_oid_cmp(&noid, &oid) != 2)
> break;
> if (walk_end.bo_n != 0 &&
> - ober_oid_cmp(&walk_end, &noid) != -1)
> + ober_oid_cmp(&noid, &walk_end) != -1)
> break;
>
> if (!snmpc_print(varbind))
> @@ -899,7 +899,7 @@ snmpc_df(int argc, char *argv[])
> for (; varbind != NULL; varbind = varbind->be_next) {
> if (ober_scanf_elements(varbind, "{os", &oid,
> &string) == -1 ||
> - ober_oid_cmp(&descroid, &oid) != 2)
> + ober_oid_cmp(&oid, &descroid) != 2)
> break;
> rows++;
> }
> @@ -913,7 +913,7 @@ snmpc_df(int argc, char *argv[])
> rows--;
> continue;
> }
> - if (ober_oid_cmp(&descroid, &oid) != 2)
> + if (ober_oid_cmp(&oid, &descroid) != 2)
> break;
> df[i].index = oid.bo_id[oid.bo_n - 1];
> if ((df[i].descr = smi_print_element(&oid, elm, 0,
>