svn commit: r347536 - head/lib/libcasper/services/cap_sysctl/tests
Mark Johnston
markj at FreeBSD.org
Mon May 13 17:53:04 UTC 2019
Author: markj
Date: Mon May 13 17:53:03 2019
New Revision: 347536
URL: https://svnweb.freebsd.org/changeset/base/347536
Log:
Extend the libcap_sysctl tests.
- Add some coverage for cap_sysctl(3).
- Add a test for the case where the caller wishes to find the sysctl
output length without specifying an output buffer.
Reviewed by: oshogbo
Sponsored by: The FreeBSD Foundation
Differential Revision: https://reviews.freebsd.org/D17856
Modified:
head/lib/libcasper/services/cap_sysctl/tests/sysctl_test.c
Modified: head/lib/libcasper/services/cap_sysctl/tests/sysctl_test.c
==============================================================================
--- head/lib/libcasper/services/cap_sysctl/tests/sysctl_test.c Mon May 13 17:51:03 2019 (r347535)
+++ head/lib/libcasper/services/cap_sysctl/tests/sysctl_test.c Mon May 13 17:53:03 2019 (r347536)
@@ -149,17 +149,27 @@ static unsigned int
checkcaps(cap_channel_t *capsysctl)
{
unsigned int result;
- int oldvalue, newvalue;
- size_t oldsize;
+ size_t len0, len1, oldsize;
+ int error, mib0[2], mib1[2], oldvalue, newvalue;
result = 0;
+ len0 = nitems(mib0);
+ ATF_REQUIRE(sysctlnametomib(SYSCTL0_NAME, mib0, &len0) == 0);
+ len1 = nitems(mib1);
+ ATF_REQUIRE(sysctlnametomib(SYSCTL1_NAME, mib1, &len1) == 0);
+
oldsize = sizeof(oldvalue);
if (cap_sysctlbyname(capsysctl, SYSCTL0_NAME, &oldvalue, &oldsize,
NULL, 0) == 0) {
if (oldsize == sizeof(oldvalue))
result |= SYSCTL0_READ0;
}
+ error = cap_sysctl(capsysctl, mib0, len0, &oldvalue, &oldsize, NULL, 0);
+ if ((result & SYSCTL0_READ0) != 0)
+ ATF_REQUIRE(error == 0);
+ else
+ ATF_REQUIRE_ERRNO(ENOTCAPABLE, error != 0);
newvalue = 123;
if (cap_sysctlbyname(capsysctl, SYSCTL0_NAME, NULL, NULL, &newvalue,
@@ -175,6 +185,13 @@ checkcaps(cap_channel_t *capsysctl)
result |= SYSCTL0_READ1;
}
}
+ newvalue = 123;
+ error = cap_sysctl(capsysctl, mib0, len0, NULL, NULL,
+ &newvalue, sizeof(newvalue));
+ if ((result & SYSCTL0_WRITE) != 0)
+ ATF_REQUIRE(error == 0);
+ else
+ ATF_REQUIRE_ERRNO(ENOTCAPABLE, error != 0);
oldsize = sizeof(oldvalue);
newvalue = 4567;
@@ -199,6 +216,11 @@ checkcaps(cap_channel_t *capsysctl)
if (oldsize == sizeof(oldvalue))
result |= SYSCTL1_READ0;
}
+ error = cap_sysctl(capsysctl, mib1, len1, &oldvalue, &oldsize, NULL, 0);
+ if ((result & SYSCTL1_READ0) != 0)
+ ATF_REQUIRE(error == 0);
+ else
+ ATF_REQUIRE_ERRNO(ENOTCAPABLE, error != 0);
newvalue = 506;
if (cap_sysctlbyname(capsysctl, SYSCTL1_NAME, NULL, NULL, &newvalue,
@@ -207,6 +229,10 @@ checkcaps(cap_channel_t *capsysctl)
}
if ((result & SYSCTL1_WRITE) != 0) {
+ newvalue = 506;
+ ATF_REQUIRE(cap_sysctl(capsysctl, mib1, len1, NULL, NULL,
+ &newvalue, sizeof(newvalue)) == 0);
+
oldsize = sizeof(oldvalue);
if (cap_sysctlbyname(capsysctl, SYSCTL1_NAME, &oldvalue,
&oldsize, NULL, 0) == 0) {
@@ -214,6 +240,13 @@ checkcaps(cap_channel_t *capsysctl)
result |= SYSCTL1_READ1;
}
}
+ newvalue = 506;
+ error = cap_sysctl(capsysctl, mib1, len1, NULL, NULL,
+ &newvalue, sizeof(newvalue));
+ if ((result & SYSCTL1_WRITE) != 0)
+ ATF_REQUIRE(error == 0);
+ else
+ ATF_REQUIRE_ERRNO(ENOTCAPABLE, error != 0);
oldsize = sizeof(oldvalue);
newvalue = 7008;
@@ -1563,11 +1596,98 @@ ATF_TC_CLEANUP(cap_sysctl__no_limits, tc)
cleanup();
}
+ATF_TC_WITH_CLEANUP(cap_sysctl__recursive_limits);
+ATF_TC_HEAD(cap_sysctl__recursive_limits, tc)
+{
+}
+ATF_TC_BODY(cap_sysctl__recursive_limits, tc)
+{
+ cap_channel_t *capsysctl, *ocapsysctl;
+ void *limit;
+ size_t len;
+ int mib[2], val = 420;
+
+ len = nitems(mib);
+ ATF_REQUIRE(sysctlnametomib(SYSCTL0_NAME, mib, &len) == 0);
+
+ ocapsysctl = initcap();
+
+ /*
+ * Make sure that we match entire components.
+ */
+ capsysctl = cap_clone(ocapsysctl);
+ ATF_REQUIRE(capsysctl != NULL);
+
+ limit = cap_sysctl_limit_init(capsysctl);
+ (void)cap_sysctl_limit_name(limit, "ker",
+ CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
+ ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
+
+ ATF_REQUIRE_ERRNO(ENOTCAPABLE, cap_sysctlbyname(capsysctl, SYSCTL0_NAME,
+ NULL, NULL, &val, sizeof(val)));
+ ATF_REQUIRE_ERRNO(ENOTCAPABLE, cap_sysctl(capsysctl, mib, len,
+ NULL, NULL, &val, sizeof(val)));
+
+ cap_close(capsysctl);
+
+ /*
+ * Verify that we check for CAP_SYSCTL_RECURSIVE.
+ */
+ capsysctl = cap_clone(ocapsysctl);
+ ATF_REQUIRE(capsysctl != NULL);
+
+ limit = cap_sysctl_limit_init(capsysctl);
+ (void)cap_sysctl_limit_name(limit, "kern", CAP_SYSCTL_RDWR);
+ ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
+
+ ATF_REQUIRE_ERRNO(ENOTCAPABLE, cap_sysctlbyname(capsysctl, SYSCTL0_NAME,
+ NULL, NULL, &val, sizeof(val)));
+ ATF_REQUIRE_ERRNO(ENOTCAPABLE, cap_sysctl(capsysctl, mib, len,
+ NULL, NULL, &val, sizeof(val)));
+
+ cap_close(capsysctl);
+}
+ATF_TC_CLEANUP(cap_sysctl__recursive_limits, tc)
+{
+ cleanup();
+}
+
+ATF_TC_WITH_CLEANUP(cap_sysctl__just_size);
+ATF_TC_HEAD(cap_sysctl__just_size, tc)
+{
+}
+ATF_TC_BODY(cap_sysctl__just_size, tc)
+{
+ cap_channel_t *capsysctl;
+ size_t len;
+ int mib0[2];
+
+ capsysctl = initcap();
+
+ len = nitems(mib0);
+ ATF_REQUIRE(sysctlnametomib(SYSCTL0_NAME, mib0, &len) == 0);
+
+ ATF_REQUIRE(cap_sysctlbyname(capsysctl, SYSCTL0_NAME,
+ NULL, &len, NULL, 0) == 0);
+ ATF_REQUIRE(len == sizeof(int));
+ ATF_REQUIRE(cap_sysctl(capsysctl, mib0, nitems(mib0),
+ NULL, &len, NULL, 0) == 0);
+ ATF_REQUIRE(len == sizeof(int));
+
+ cap_close(capsysctl);
+}
+ATF_TC_CLEANUP(cap_sysctl__just_size, tc)
+{
+ cleanup();
+}
+
ATF_TP_ADD_TCS(tp)
{
ATF_TP_ADD_TC(tp, cap_sysctl__operation);
ATF_TP_ADD_TC(tp, cap_sysctl__names);
ATF_TP_ADD_TC(tp, cap_sysctl__no_limits);
+ ATF_TP_ADD_TC(tp, cap_sysctl__recursive_limits);
+ ATF_TP_ADD_TC(tp, cap_sysctl__just_size);
return (atf_no_error());
}
More information about the svn-src-head
mailing list