[prev in list] [next in list] [prev in thread] [next in thread]
List: openbsd-tech
Subject: snmpd: Add end of sequence tests
From: Martijn van Duren <openbsd+tech () list ! imperialat ! at>
Date: 2021-01-31 10:57:06
Message-ID: 31e6e6397fcd0801a9f13b6c79600711fe34fbc7.camel () list ! imperialat ! at
[Download RAW message or body]
Now that ober_scanf_elements supports '$' lets use it.
Here's a first stab by adding it to snmpd.
Passing regress and a few manual checks.
'e' still doesn't consume the element, but I've talked it over with
rob@, who said that shouldn't get in the way of using this new feature.
OK?
martijn@
Index: snmpe.c
===================================================================
RCS file: /cvs/src/usr.sbin/snmpd/snmpe.c,v
retrieving revision 1.68
diff -u -p -r1.68 snmpe.c
--- snmpe.c 22 Jan 2021 06:33:27 -0000 1.68
+++ snmpe.c 31 Jan 2021 10:55:49 -0000
@@ -220,7 +220,7 @@ snmpe_parse(struct snmp_message *msg)
case SNMP_V2:
if (env->sc_min_seclevel != 0)
goto badversion;
- if (ober_scanf_elements(a, "se", &comn, &msg->sm_pdu) != 0)
+ if (ober_scanf_elements(a, "seS$", &comn, &msg->sm_pdu) != 0)
goto parsefail;
if (strlcpy(msg->sm_community, comn,
sizeof(msg->sm_community)) >= sizeof(msg->sm_community)) {
@@ -230,7 +230,7 @@ snmpe_parse(st? tm_udp.c
Index: snmpe.c
===================================================================
RCS file: /cvs/src/usr.sbin/snmpd/snmpe.c,v
retrieving revision 1.68
diff -u -p -r1.68 snmpe.c
--- snmpe.c 22 Jan 2021 06:33:27 -0000 1.68
+++ snmpe.c 31 Jan 2021 10:55:49 -0000
@@ -220,7 +220,7 @@ snmpe_parse(struct snmp_message *msg)
case SNMP_V2:
if (env->sc_min_seclevel != 0)
goto badversion;
- if (ober_scanf_elements(a, "se", &comn, &msg->sm_pdu) != 0)
+ if (ober_scanf_elements(a, "seS$", &comn, &msg->sm_pdu) != 0)
goto parsefail;
if (strlcpy(msg->sm_community, comn,
sizeof(msg->sm_community)) >= sizeof(msg->sm_community)) {
@@ -230,7 +230,7 @@ snmpe_parse(struct snmp_message *msg)
}
break;
case SNMP_V3:
- if (ober_scanf_elements(a, "{iisi}e",
+ if (ober_scanf_elements(a, "{iisi$}e",
&msg->sm_msgid, &msg->sm_max_msg_size, &flagstr,
&msg->sm_secmodel, &a) != 0)
goto parsefail;
@@ -248,7 +248,7 @@ snmpe_parse(struct snmp_message *msg)
goto parsefail;
}
- if (ober_scanf_elements(a, "{xxe",
+ if (ober_scanf_elements(a, "{xxeS$}$",
&msg->sm_ctxengineid, &msg->sm_ctxengineid_len,
&ctxname, &len, &msg->sm_pdu) != 0)
goto parsefail;
@@ -370,7 +370,7 @@ snmpe_parse(struct snmp_message *msg)
}
/* SNMP PDU */
- if (ober_scanf_elements(a, "iiie{et",
+ if (ober_scanf_elements(a, "iiie{etS$}$",
&req, &errval, &erridx, &msg->sm_pduend,
&msg->sm_varbind, &class, &type) != 0) {
stats->snmp_silentdrops++;
@@ -429,7 +429,7 @@ snmpe_parsevarbinds(struct snmp_message
for (i = 1; varbind != NULL && i < SNMPD_MAXVARBIND;
varbind = varbind->be_next, i++) {
- if (ober_scanf_elements(varbind, "{oe}", &o, &value) == -1) {
+ if (ober_scanf_elements(varbind, "{oeS$}", &o, &value) == -1) {
stats->snmp_inasnparseerrs++;
msg->sm_errstr = "invalid varbind";
goto varfail;
Index: traphandler.c
===================================================================
RCS file: /cvs/src/usr.sbin/snmpd/traphandler.c,v
retrieving revision 1.20
diff -u -p -r1.20 traphandler.c
--- traphandler.c 22 Jan 2021 06:33:27 -0000 1.20
+++ traphandler.c 31 Jan 2021 10:55:49 -0000
@@ -67,7 +67,7 @@ traphandler_parse(struct snmp_message *m
struct privsep *ps = &snmpd_env->sc_ps;
struct snmp_stats *stats = &snmpd_env->sc_stats;
struct ber ber = {0};
- struct ber_element *vblist = NULL, *elm, *elm2;
+ struct ber_element *vblist = NULL, *elm;
struct ber_oid o1, o2, snmpTrapOIDOID;
struct ber_oid snmpTrapOID, sysUpTimeOID;
int sysUpTime;
@@ -82,7 +82,7 @@ traphandler_parse(struct snmp_message *m
goto done;
break;
case SNMP_C_TRAPV2:
- if (ober_scanf_elements(msg->sm_pdu, "{SSe}", &elm) == -1) {
+ if (ober_scanf_elements(msg->sm_pdu, "{SSe}$", &elm) == -1) {
stats->snmp_inasnparseerrs++;
goto done;
}
@@ -98,7 +98,7 @@ traphandler_parse(struct snmp_message *m
(void)ober_string2oid("1.3.6.1.2.1.1.3.0", &sysUpTimeOID);
(void)ober_string2oid("1.3.6.1.6.3.1.1.4.1.0", &snmpTrapOIDOID);
- if (ober_scanf_elements(vblist, "{{od}{oo}", &o1, &sysUpTime, &o2,
+ if (ober_scanf_elements(vblist, "{{od$}{oo$}", &o1, &sysUpTime, &o2,
&snmpTrapOID) == -1 ||
ober_oid_cmp(&o1, &sysUpTimeOID) != 0 ||
ober_oid_cmp(&o2, &snmpTrapOIDOID) != 0) {
@@ -107,8 +107,7 @@ traphandler_parse(struct snmp_message *m
}
(void)ober_scanf_elements(vblist, "{Se", &elm);
for (elm = elm->be_next; elm != NULL; elm = elm->be_next) {
- if (ober_scanf_elements(elm, "{oe}", &o1, &elm2) == -1 ||
- elm2->be_next != NULL) {
+ if (ober_scanf_elements(elm, "{oS$}", &o1) == -1) {
stats->snmp_inasnparseerrs++;
goto done;
}
@@ -153,7 +152,7 @@ traphandler_v1translate(struct snmp_mess
int generic_trap, specific_trap, time_stamp;
int hasaddress = 0, hascommunity = 0, hasenterprise = 0;
- if (ober_scanf_elements(msg->sm_pdu, "{oxddde", &enterprise,
+ if (ober_scanf_elements(msg->sm_pdu, "{oxdddeS$}$", &enterprise,
&agent_addr, &agent_addrlen, &generic_trap, &specific_trap,
&time_stamp, &vblist) == -1 ||
agent_addrlen != 4 ||
@@ -379,7 +378,7 @@ trapcmd_exec(struct trapcmd *cmd, struct
goto out;
for (; vb != NULL; vb = vb->be_next) {
- if (ober_scanf_elements(vb, "{oe}", &oid, &elm) == -1)
+ if (ober_scanf_elements(vb, "{oeS$}", &oid, &elm) == -1)
goto out;
if ((value = smi_print_element(elm)) == NULL)
goto out;
Index: usm.c
===================================================================
RCS file: /cvs/src/usr.sbin/snmpd/usm.c,v
retrieving revision 1.17
diff -u -p -r1.17 usm.c
--- usm.c 24 Oct 2019 12:39:27 -0000 1.17
+++ usm.c 31 Jan 2021 10:55:49 -0000
@@ -302,7 +302,7 @@ usm_decode(struct snmp_message *msg, str
smi_debug_elements(usm);
#endif
- if (ober_scanf_elements(usm, "{xiixpxx", &engineid, &enginelen,
+ if (ober_scanf_elements(usm, "{xiixpxx$", &engineid, &enginelen,
&engine_boots, &engine_time, &user, &userlen, &offs2,
&digest, &digestlen, &salt, &saltlen) != 0) {
*errp = "cannot decode USM params";
? tm_udp.c
Index: snmpe.c
===================================================================
RCS file: /cvs/src/usr.sbin/snmpd/snmpe.c,v
retrieving revision 1.68
diff -u -p -r1.68 snmpe.c
--- snmpe.c 22 Jan 2021 06:33:27 -0000 1.68
+++ snmpe.c 31 Jan 2021 10:55:49 -0000
@@ -220,7 +220,7 @@ snmpe_parse(struct snmp_message *msg)
case SNMP_V2:
if (env->sc_min_seclevel != 0)
goto badversion;
- if (ober_scanf_elements(a, "se", &comn, &msg->sm_pdu) != 0)
+ if (ober_scanf_elements(a, "seS$", &comn, &msg->sm_pdu) != 0)
goto parsefail;
if (strlcpy(msg->sm_community, comn,
sizeof(msg->sm_community)) >= sizeof(msg->sm_community)) {
@@ -230,7 +230,7 @@ snmpe_parse(struct snmp_message *msg)
}
break;
case SNMP_V3:
- if (ober_scanf_elements(a, "{iisi}e",
+ if (ober_scanf_elements(a, "{iisi$}e",
&msg->sm_msgid, &msg->sm_max_msg_size, &flagstr,
&msg->sm_secmodel, &a) != 0)
goto parsefail;
@@ -248,7 +248,7 @@ snmpe_parse(struct snmp_message *msg)
goto parsefail;
}
- if (ober_scanf_elements(a, "{xxe",
+ if (ober_scanf_elements(a, "{xxeS$}$",
&msg->sm_ctxengineid, &msg->sm_ctxengineid_len,
&ctxname, &len, &msg->sm_pdu) != 0)
goto parsefail;
@@ -370,7 +370,7 @@ snmpe_parse(struct snmp_message *msg)
}
/* SNMP PDU */
- if (ober_scanf_elements(a, "iiie{et",
+ if (ober_scanf_elements(a, "iiie{etS$}$",
&req, &errval, &erridx, &msg->sm_pduend,
&msg->sm_varbind, &class, &type) != 0) {
stats->snmp_silentdrops++;
@@ -429,7 +429,7 @@ snmpe_parsevarbinds(struct snmp_message
for (i = 1; varbind != NULL && i < SNMPD_MAXVARBIND;
varbind = varbind->be_next, i++) {
- if (ober_scanf_elements(varbind, "{oe}", &o, &value) == -1) {
+ if (ober_scanf_elements(varbind, "{oeS$}", &o, &value) == -1) {
stats->snmp_inasnparseerrs++;
msg->sm_errstr = "invalid varbind";
goto varfail;
Index: traphandler.c
===================================================================
RCS file: /cvs/src/usr.sbin/snmpd/traphandler.c,v
retrieving revision 1.20
diff -u -p -r1.20 traphandler.c
--- traphandler.c 22 Jan 2021 06:33:27 -0000 1.20
+++ traphandler.c 31 Jan 2021 10:55:49 -0000
@@ -67,7 +67,7 @@ traphandler_parse(struct snmp_message *m
struct privsep *ps = &snmpd_env->sc_ps;
struct snmp_stats *stats = &snmpd_env->sc_stats;
struct ber ber = {0};
- struct ber_element *vblist = NULL, *elm, *elm2;
+ struct ber_element *vblist = NULL, *elm;
struct ber_oid o1, o2, snmpTrapOIDOID;
struct ber_oid snmpTrapOID, sysUpTimeOID;
int sysUpTime;
@@ -82,7 +82,7 @@ traphandler_parse(struct snmp_message *m
goto done;
break;
case SNMP_C_TRAPV2:
- if (ober_scanf_elements(msg->sm_pdu, "{SSe}", &elm) == -1) {
+ if (ober_scanf_elements(msg->sm_pdu, "{SSe}$", &elm) == -1) {
stats->snmp_inasnparseerrs++;
goto done;
}
@@ -98,7 +98,7 @@ traphandler_parse(struct snmp_message *m
(void)ober_string2oid("1.3.6.1.2.1.1.3.0", &sysUpTimeOID);
(void)ober_string2oid("1.3.6.1.6.3.1.1.4.1.0", &snmpTrapOIDOID);
- if (ober_scanf_elements(vblist, "{{od}{oo}", &o1, &sysUpTime, &o2,
+ if (ober_scanf_elements(vblist, "{{od$}{oo$}", &o1, &sysUpTime, &o2,
&snmpTrapOID) == -1 ||
ober_oid_cmp(&o1, &sysUpTimeOID) != 0 ||
ober_oid_cmp(&o2, &snmpTrapOIDOID) != 0) {
@@ -107,8 +107,7 @@ traphandler_parse(struct snmp_message *m
}
(void)ober_scanf_elements(vblist, "{Se", &elm);
for (elm = elm->be_next; elm != NULL; elm = elm->be_next) {
- if (ober_scanf_elements(elm, "{oe}", &o1, &elm2) == -1 ||
- elm2->be_next != NULL) {
+ if (ober_scanf_elements(elm, "{oS$}", &o1) == -1) {
stats->snmp_inasnparseerrs++;
goto done;
}
@@ -153,7 +152,7 @@ traphandler_v1translate(struct snmp_mess
int generic_trap, specific_trap, time_stamp;
int hasaddress = 0, hascommunity = 0, hasenterprise = 0;
- if (ober_scanf_elements(msg->sm_pdu, "{oxddde", &enterprise,
+ if (ober_scanf_elements(msg->sm_pdu, "{oxdddeS$}$", &enterprise,
&agent_addr, &agent_addrlen, &generic_trap, &specific_trap,
&time_stamp, &vblist) == -1 ||
agent_addrlen != 4 ||
@@ -379,7 +378,7 @@ trapcmd_exec(struct trapcmd *cmd, struct
goto out;
for (; vb != NULL; vb = vb->be_next) {
- if (ober_scanf_elements(vb, "{oe}", &oid, &elm) == -1)
+ if (ober_scanf_elements(vb, "{oeS$}", &oid, &elm) == -1)
goto out;
if ((value = smi_print_element(elm)) == NULL)
goto out;
Index: usm.c
===================================================================
RCS file: /cvs/src/usr.sbin/snmpd/usm.c,v
retrieving revision 1.17
diff -u -p -r1.17 usm.c
--- usm.c 24 Oct 2019 12:39:27 -0000 1.17
+++ usm.c 31 Jan 2021 10:55:49 -0000
@@ -302,7 +302,7 @@ usm_decode(struct snmp_message *msg, str
smi_debug_elements(usm);
#endif
- if (ober_scanf_elements(usm, "{xiixpxx", &engineid, &enginelen,
+ if (ober_scanf_elements(usm, "{xiixpxx$", &engineid, &enginelen,
&engine_boots, &engine_time, &user, &userlen, &offs2,
&digest, &digestlen, &salt, &saltlen) != 0) {
*errp = "cannot decode USM params";
ruct snmp_message *msg)
}
break;
case SNMP_V3:
- if (ober_scanf_elements(a, "{iisi}e",
+ if (ober_scanf_elements(a, "{iisi$}e",
&msg->sm_msgid, &msg->sm_max_msg_size, &flagstr,
&msg->sm_secmodel, &a) != 0)
goto parsefail;
@@ -248,7 +248,7 @@ snmpe_parse(struct snmp_message *msg)
goto parsefail;
}
- if (ober_scanf_elements(a, "{xxe",
+ if (ober_scanf_elements(a, "{xxeS$}$",
&msg->sm_ctxengineid, &msg->sm_ctxengineid_len,
&ctxname, &len, &msg->sm_pdu) != 0)
goto parsefail;
@@ -370,7 +370,7 @@ snmpe_parse(struct snmp_message *msg)
}
/* SNMP PDU */
- if (ober_scanf_elements(a, "iiie{et",
+ if (ober_scanf_elements(a, "iiie{etS$}$",
&req, &errval, &erridx, &msg->sm_pduend,
&msg->sm_varbind, &class, &type) != 0) {
stats->snmp_silentdrops++;
@@ -429,7 +429,7 @@ snmpe_parsevarbinds(struct snmp_message
for (i = 1; varbind != NULL && i < SNMPD_MAXVARBIND;
varbind = varbind->be_next, i++) {
- if (ober_scanf_elements(varbind, "{oe}", &o, &value) == -1) {
+ if (ober_scanf_elements(varbind, "{oeS$}", &o, &value) == -1) {
stats->snmp_inasnparseerrs++;
msg->sm_errstr = "invalid varbind";
goto varfail;
Index: traphandler.c
===================================================================
RCS file: /cvs/src/usr.sbin/snmpd/traphandler.c,v
retrieving revision 1.20
diff -u -p -r1.20 traphandler.c
--- traphandler.c 22 Jan 2021 06:33:27 -0000 1.20
+++ traphandler.c 31 Jan 2021 10:55:49 -0000
@@ -67,7 +67,7 @@ traphandler_parse(struct snmp_message *m
struct privsep *ps = &snmpd_env->sc_ps;
struct snmp_stats *stats = &snmpd_env->sc_stats;
struct ber ber = {0};
- struct ber_element *vblist = NULL, *elm, *elm2;
+ struct ber_element *vblist = NULL, *elm;
struct ber_oid o1, o2, snmpTrapOIDOID;
struct ber_oid snmpTrapOID, sysUpTimeOID;
int sysUpTime;
@@ -82,7 +82,7 @@ traphandler_parse(struct snmp_message *m
goto done;
break;
case SNMP_C_TRAPV2:
- if (ober_scanf_elements(msg->sm_pdu, "{SSe}", &elm) == -1) {
+ if (ober_scanf_elements(msg->sm_pdu, "{SSe}$", &elm) == -1) {
stats->snmp_inasnparseerrs++;
goto done;
}
@@ -98,7 +98,7 @@ traphandler_parse(struct snmp_message *m
(void)ober_string2oid("1.3.6.1.2.1.1.3.0", &sysUpTimeOID);
(void)ober_string2oid("1.3.6.1.6.3.1.1.4.1.0", &snmpTrapOIDOID);
- if (ober_scanf_elements(vblist, "{{od}{oo}", &o1, &sysUpTime, &o2,
+ if (ober_scanf_elements(vblist, "{{od$}{oo$}", &o1, &sysUpTime, &o2,
&snmpTrapOID) == -1 ||
ober_oid_cmp(&o1, &sysUpTimeOID) != 0 ||
ober_oid_cmp(&o2, &snmpTrapOIDOID) != 0) {
@@ -107,8 +107,7 @@ traphandler_parse(struct snmp_message *m
}
(void)ober_scanf_elements(vblist, "{Se", &elm);
for (elm = elm->be_next; elm != NULL; elm = elm->be_next) {
- if (ober_scanf_elements(elm, "{oe}", &o1, &elm2) == -1 ||
- elm2->be_next != NULL) {
+ if (ober_scanf_elements(elm, "{oS$}", &o1) == -1) {
stats->snmp_inasnparseerrs++;
goto done;
}
@@ -153,7 +152,7 @@ traphandler_v1translate(struct snmp_mess
int generic_trap, specific_trap, time_stamp;
int hasaddress = 0, hascommunity = 0, hasenterprise = 0;
- if (ober_scanf_elements(msg->sm_pdu, "{oxddde", &enterprise,
+ if (ober_scanf_elements(msg->sm_pdu, "{oxdddeS$}$", &enterprise,
&agent_addr, &agent_addrlen, &generic_trap, &specific_trap,
&time_stamp, &vblist) == -1 ||
agent_addrlen != 4 ||
@@ -379,7 +378,7 @@ trapcmd_exec(struct trapcmd *cmd, struct
goto out;
for (; vb != NULL; vb = vb->be_next) {
- if (ober_scanf_elements(vb, "{oe}", &oid, &elm) == -1)
+ if (ober_scanf_elements(vb, "{oeS$}", &oid, &elm) == -1)
goto out;
if ((value = smi_print_element(elm)) == NULL)
goto out;
Index: usm.c
===================================================================
RCS file: /cvs/src/usr.sbin/snmpd/usm.c,v
retrieving revision 1.17
diff -u -p -r1.17 usm.c
--- usm.c 24 Oct 2019 12:39:27 -0000 1.17
+++ usm.c 31 Jan 2021 10:55:49 -0000
@@ -302,7 +302,7 @@ usm_decode(struct snmp_message *msg, str
smi_debug_elements(usm);
#endif
- if (ober_scanf_elements(usm, "{xiixpxx", &engineid, &enginelen,
+ if (ober_scanf_elements(usm, "{xiixpxx$", &engineid, &enginelen,
&engine_boots, &engine_time, &user, &userlen, &offs2,
&digest, &digestlen, &salt, &saltlen) != 0) {
*errp = "cannot decode USM params";
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic