Add 2 tests to make sure getbulkrequests return the correct error index.
authormartijn <martijn@openbsd.org>
Mon, 13 Nov 2023 10:16:51 +0000 (10:16 +0000)
committermartijn <martijn@openbsd.org>
Mon, 13 Nov 2023 10:16:51 +0000 (10:16 +0000)
regress/usr.sbin/snmpd/Makefile
regress/usr.sbin/snmpd/backend.c
regress/usr.sbin/snmpd/regress.h
regress/usr.sbin/snmpd/snmpd_regress.c

index ba0db3b..21b8b44 100644 (file)
@@ -1,4 +1,4 @@
-# $OpenBSD: Makefile,v 1.9 2023/11/10 12:16:53 martijn Exp $
+# $OpenBSD: Makefile,v 1.10 2023/11/13 10:16:51 martijn Exp $
 # Regress tests for snmpd
 
 PROG =                         snmpd_regress
@@ -235,6 +235,8 @@ BACKEND_TARGETS+=           backend_error_getnext_parseerror
 BACKEND_TARGETS+=              backend_error_getnext_requestdenied
 BACKEND_TARGETS+=              backend_error_getnext_processingerror
 BACKEND_TARGETS+=              backend_error_getnext_nonstandard
+BACKEND_TARGETS+=              backend_error_getbulk_firstrepetition
+BACKEND_TARGETS+=              backend_error_getbulk_secondrepetition
 
 REGRESS_TARGETS+=              ${BACKEND_TARGETS}
 backend: ${BACKEND_TARGETS}
index 5832fe9..830ad44 100644 (file)
@@ -5373,3 +5373,83 @@ backend_error_getnext_nonstandard(void)
        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
 }
+
+void
+backend_error_getbulk_firstrepetition(void)
+{
+       struct sockaddr_storage ss;
+       struct sockaddr *sa = (struct sockaddr *)&ss;
+       socklen_t salen;
+       int snmp_s, ax_s;
+       uint32_t sessionid;
+       struct varbind varbind = {
+               .type = TYPE_NULL,
+               .name = OID_STRUCT(MIB_BACKEND_ERROR, 63),
+       };
+       int32_t requestid;
+       char buf[1024];
+       size_t n;
+
+       ax_s = agentx_connect(axsocket);
+       sessionid = agentx_open(ax_s, 0, 0,
+           OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 63), __func__);
+       agentx_register(ax_s, sessionid, 0, 0, 127, 0,
+           OID_ARG(MIB_BACKEND_ERROR, 63), 0);
+
+       salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
+       snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
+       requestid = snmpv2_getbulk(snmp_s, community, 0, 0, 2, &varbind, 1);
+
+       varbind.name.subid[varbind.name.n_subid++] = 0;
+       n = agentx_read(ax_s, buf, sizeof(buf), 1000);
+       agentx_getnext_handle(__func__, buf, n, 0, sessionid, NULL, &varbind, 1);
+       varbind.name.n_subid--;
+       agentx_response(ax_s, buf, GENERR, 1, &varbind, 1);
+
+       snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
+           &varbind, 1);
+}
+
+void
+backend_error_getbulk_secondrepetition(void)
+{
+       struct sockaddr_storage ss;
+       struct sockaddr *sa = (struct sockaddr *)&ss;
+       socklen_t salen;
+       int snmp_s, ax_s;
+       uint32_t sessionid;
+       struct varbind varbind = {
+               .type = TYPE_NULL,
+               .name = OID_STRUCT(MIB_BACKEND_ERROR, 64),
+               .data.int32 = 1
+       };
+       int32_t requestid;
+       char buf[1024];
+       size_t n;
+
+       ax_s = agentx_connect(axsocket);
+       sessionid = agentx_open(ax_s, 0, 0,
+           OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 64), __func__);
+       agentx_register(ax_s, sessionid, 0, 0, 127, 0,
+           OID_ARG(MIB_BACKEND_ERROR, 64), 0);
+
+       salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
+       snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
+       requestid = snmpv2_getbulk(snmp_s, community, 0, 0, 2, &varbind, 1);
+
+       varbind.name.subid[varbind.name.n_subid++] = 0;
+       n = agentx_read(ax_s, buf, sizeof(buf), 1000);
+       agentx_getnext_handle(__func__, buf, n, 0, sessionid, NULL, &varbind, 1);
+       varbind.type = TYPE_INTEGER;
+       agentx_response(ax_s, buf, 0, NOERROR, &varbind, 1);
+       varbind.name.subid[varbind.name.n_subid - 1] = 1;
+       n = agentx_read(ax_s, buf, sizeof(buf), 1000);
+       agentx_getnext_handle(__func__, buf, n, 0, sessionid, NULL, &varbind, 1);
+       varbind.name.subid[varbind.name.n_subid - 1] = 0;
+       varbind.type = TYPE_NULL;
+       agentx_response(ax_s, buf, 0, GENERR, &varbind, 1);
+
+       varbind.name.n_subid--;
+       snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
+           &varbind, 1);
+}
index 3b7c5ac..3f5fb17 100644 (file)
@@ -364,4 +364,6 @@ void backend_error_getnext_parseerror(void);
 void backend_error_getnext_requestdenied(void);
 void backend_error_getnext_processingerror(void);
 void backend_error_getnext_nonstandard(void);
+void backend_error_getbulk_firstrepetition(void);
+void backend_error_getbulk_secondrepetition(void);
 void snmp_v3_usm_noauthpriv(void);
index 88c78c0..29e7594 100644 (file)
@@ -208,6 +208,8 @@ const struct {
        { "backend_error_getnext_requestdenied", backend_error_getnext_requestdenied },
        { "backend_error_getnext_processingerror", backend_error_getnext_processingerror },
        { "backend_error_getnext_nonstandard", backend_error_getnext_nonstandard },
+       { "backend_error_getbulk_firstrepetition", backend_error_getbulk_firstrepetition },
+       { "backend_error_getbulk_secondrepetition", backend_error_getbulk_secondrepetition },
        { "snmp_v3_usm_noauthpriv", snmp_v3_usm_noauthpriv},
        { NULL, NULL }
 };