diff options
author | 2008-01-03 14:44:08 +0000 | |
---|---|---|
committer | 2008-01-03 14:44:08 +0000 | |
commit | fccf6a79154e4d11588f453a3ab948c01347f1fc (patch) | |
tree | 4eda455557f7a131d03fb33ce2efbb7d7c5bbb71 | |
parent | fix parsing of get* requests with multiple varbind elements (diff) | |
download | wireguard-openbsd-fccf6a79154e4d11588f453a3ab948c01347f1fc.tar.xz wireguard-openbsd-fccf6a79154e4d11588f453a3ab948c01347f1fc.zip |
scalars have an index of 0 in the returned oid (like sysDescr.0).
-rw-r--r-- | usr.sbin/snmpd/ber.c | 15 | ||||
-rw-r--r-- | usr.sbin/snmpd/ber.h | 3 | ||||
-rw-r--r-- | usr.sbin/snmpd/mps.c | 10 |
3 files changed, 22 insertions, 6 deletions
diff --git a/usr.sbin/snmpd/ber.c b/usr.sbin/snmpd/ber.c index ddc24f1f361..53a172aa83a 100644 --- a/usr.sbin/snmpd/ber.c +++ b/usr.sbin/snmpd/ber.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ber.c,v 1.4 2007/12/07 10:08:40 reyk Exp $ */ +/* $OpenBSD: ber.c,v 1.5 2008/01/03 14:44:08 reyk Exp $ */ /* * Copyright (c) 2007 Reyk Floeter <reyk@vantronix.net> @@ -425,6 +425,19 @@ ber_add_oid(struct ber_element *prev, struct ber_oid *o) } struct ber_element * +ber_add_noid(struct ber_element *prev, struct ber_oid *o, int n) +{ + struct ber_oid no; + + if (n > BER_MAX_OID_LEN) + return (NULL); + no.bo_n = n; + bcopy(&o->bo_id, &no.bo_id, sizeof(no.bo_id)); + + return (ber_add_oid(prev, &no)); +} + +struct ber_element * ber_add_oidstring(struct ber_element *prev, const char *oidstr) { struct ber_oid o; diff --git a/usr.sbin/snmpd/ber.h b/usr.sbin/snmpd/ber.h index 6c9f04f7873..d4fb8e52775 100644 --- a/usr.sbin/snmpd/ber.h +++ b/usr.sbin/snmpd/ber.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ber.h,v 1.2 2007/12/28 18:10:00 reyk Exp $ */ +/* $OpenBSD: ber.h,v 1.3 2008/01/03 14:44:08 reyk Exp $ */ /* * Copyright (c) 2007 Reyk Floeter <reyk@vantronix.net> @@ -106,6 +106,7 @@ int ber_get_null(struct ber_element *); struct ber_element *ber_add_eoc(struct ber_element *); int ber_get_eoc(struct ber_element *); struct ber_element *ber_add_oid(struct ber_element *, struct ber_oid *); +struct ber_element *ber_add_noid(struct ber_element *, struct ber_oid *, int); struct ber_element *ber_add_oidstring(struct ber_element *, const char *); int ber_get_oid(struct ber_element *, struct ber_oid *); size_t ber_oid2ber(struct ber_oid *, u_int8_t *, size_t); diff --git a/usr.sbin/snmpd/mps.c b/usr.sbin/snmpd/mps.c index fd8562d21c1..f30367e2cbb 100644 --- a/usr.sbin/snmpd/mps.c +++ b/usr.sbin/snmpd/mps.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mps.c,v 1.8 2007/12/29 09:24:43 reyk Exp $ */ +/* $OpenBSD: mps.c,v 1.9 2008/01/03 14:44:08 reyk Exp $ */ /* * Copyright (c) 2007 Reyk Floeter <reyk@vantronix.net> @@ -126,7 +126,8 @@ mps_getreq(struct ber_element *root, struct ber_oid *o) if (OID_NOTSET(value)) return (NULL); if ((value->o_flags & OID_TABLE) == 0) - elm = ber_add_oid(elm, &value->o_id); + elm = ber_add_noid(elm, + &value->o_id, value->o_oidlen + 1); if (value->o_get == NULL) elm = ber_add_null(elm); else @@ -186,7 +187,7 @@ mps_getnextreq(struct ber_element *root, struct ber_oid *o) break; } } - next: + for (next = value; next != NULL;) { next = smi_next(next); if (next == NULL) @@ -206,7 +207,8 @@ mps_getnextreq(struct ber_element *root, struct ber_oid *o) return (NULL); } else { bcopy(&next->o_id, o, sizeof(*o)); - ber = ber_add_oid(ber, &next->o_id); + ber = ber_add_noid(ber, &next->o_id, + next->o_oidlen + 1); if ((ret = next->o_get(next, o, &ber)) != 0) return (NULL); } |