summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorreyk <reyk@openbsd.org>2008-01-03 14:44:08 +0000
committerreyk <reyk@openbsd.org>2008-01-03 14:44:08 +0000
commitfccf6a79154e4d11588f453a3ab948c01347f1fc (patch)
tree4eda455557f7a131d03fb33ce2efbb7d7c5bbb71
parentfix parsing of get* requests with multiple varbind elements (diff)
downloadwireguard-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.c15
-rw-r--r--usr.sbin/snmpd/ber.h3
-rw-r--r--usr.sbin/snmpd/mps.c10
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);
}