Hi, some time ago, martinh@ fixed the PRs 6468 and 6071 in snmpd. Unfortunately, that broke GETBULK support and nobody noticed.
GETBULK calls mps_getnextreq() multiple times and relies on the incremented/updated OID in "o". Without this diff, non-table OIDs were not incremented and returned multiple times in a single GETBULK response. I also tested the bug reports from the old PRs and this diff does not reintroduce their bugs. OK? Reyk Index: mps.c =================================================================== RCS file: /cvs/src/usr.sbin/snmpd/mps.c,v retrieving revision 1.17 diff -u -p -u -p -r1.17 mps.c --- mps.c 1 Oct 2012 11:36:55 -0000 1.17 +++ mps.c 1 Oct 2013 20:51:47 -0000 @@ -210,16 +210,11 @@ mps_getnextreq(struct ber_element *root, break; } } else if (o->bo_n == value->o_oidlen && value->o_get != NULL) { - /* No instance identifier specified. Append .0. */ - if (o->bo_n + 1 > BER_MAX_OID_LEN) - return (NULL); - ber = ber_add_noid(ber, o, o->bo_n + 1); - if ((ret = value->o_get(value, o, &ber)) != 0) - return (NULL); - return (ber); + next = value; + goto appendzero; } -getnext: + getnext: for (next = value; next != NULL;) { next = smi_next(next); if (next == NULL) @@ -246,8 +241,11 @@ getnext: } } else { bcopy(&next->o_id, o, sizeof(*o)); - ber = ber_add_noid(ber, &next->o_id, - next->o_oidlen + 1); + appendzero: + /* No instance identifier specified. Append .0. */ + if (o->bo_n + 1 > BER_MAX_OID_LEN) + return (NULL); + ber = ber_add_noid(ber, o, ++o->bo_n); if ((ret = next->o_get(next, o, &ber)) != 0) return (NULL); }