Changeset View
Changeset View
Standalone View
Standalone View
head/lib/libcasper/services/cap_sysctl/tests/sysctl_test.c
Show First 20 Lines • Show All 143 Lines • ▼ Show 20 Lines | cleanup(void) | ||||
restore_int_sysctl(SYSCTL0_NAME, SYSCTL0_FILE); | restore_int_sysctl(SYSCTL0_NAME, SYSCTL0_FILE); | ||||
restore_int_sysctl(SYSCTL1_NAME, SYSCTL1_FILE); | restore_int_sysctl(SYSCTL1_NAME, SYSCTL1_FILE); | ||||
} | } | ||||
static unsigned int | static unsigned int | ||||
checkcaps(cap_channel_t *capsysctl) | checkcaps(cap_channel_t *capsysctl) | ||||
{ | { | ||||
unsigned int result; | unsigned int result; | ||||
int oldvalue, newvalue; | size_t len0, len1, oldsize; | ||||
size_t oldsize; | int error, mib0[2], mib1[2], oldvalue, newvalue; | ||||
result = 0; | 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); | oldsize = sizeof(oldvalue); | ||||
if (cap_sysctlbyname(capsysctl, SYSCTL0_NAME, &oldvalue, &oldsize, | if (cap_sysctlbyname(capsysctl, SYSCTL0_NAME, &oldvalue, &oldsize, | ||||
NULL, 0) == 0) { | NULL, 0) == 0) { | ||||
if (oldsize == sizeof(oldvalue)) | if (oldsize == sizeof(oldvalue)) | ||||
result |= SYSCTL0_READ0; | 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; | newvalue = 123; | ||||
if (cap_sysctlbyname(capsysctl, SYSCTL0_NAME, NULL, NULL, &newvalue, | if (cap_sysctlbyname(capsysctl, SYSCTL0_NAME, NULL, NULL, &newvalue, | ||||
sizeof(newvalue)) == 0) { | sizeof(newvalue)) == 0) { | ||||
result |= SYSCTL0_WRITE; | result |= SYSCTL0_WRITE; | ||||
} | } | ||||
if ((result & SYSCTL0_WRITE) != 0) { | if ((result & SYSCTL0_WRITE) != 0) { | ||||
oldsize = sizeof(oldvalue); | oldsize = sizeof(oldvalue); | ||||
if (cap_sysctlbyname(capsysctl, SYSCTL0_NAME, &oldvalue, | if (cap_sysctlbyname(capsysctl, SYSCTL0_NAME, &oldvalue, | ||||
&oldsize, NULL, 0) == 0) { | &oldsize, NULL, 0) == 0) { | ||||
if (oldsize == sizeof(oldvalue) && oldvalue == 123) | if (oldsize == sizeof(oldvalue) && oldvalue == 123) | ||||
result |= SYSCTL0_READ1; | 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); | oldsize = sizeof(oldvalue); | ||||
newvalue = 4567; | newvalue = 4567; | ||||
if (cap_sysctlbyname(capsysctl, SYSCTL0_NAME, &oldvalue, &oldsize, | if (cap_sysctlbyname(capsysctl, SYSCTL0_NAME, &oldvalue, &oldsize, | ||||
&newvalue, sizeof(newvalue)) == 0) { | &newvalue, sizeof(newvalue)) == 0) { | ||||
if (oldsize == sizeof(oldvalue) && oldvalue == 123) | if (oldsize == sizeof(oldvalue) && oldvalue == 123) | ||||
result |= SYSCTL0_READ_WRITE; | result |= SYSCTL0_READ_WRITE; | ||||
} | } | ||||
if ((result & SYSCTL0_READ_WRITE) != 0) { | if ((result & SYSCTL0_READ_WRITE) != 0) { | ||||
oldsize = sizeof(oldvalue); | oldsize = sizeof(oldvalue); | ||||
if (cap_sysctlbyname(capsysctl, SYSCTL0_NAME, &oldvalue, | if (cap_sysctlbyname(capsysctl, SYSCTL0_NAME, &oldvalue, | ||||
&oldsize, NULL, 0) == 0) { | &oldsize, NULL, 0) == 0) { | ||||
if (oldsize == sizeof(oldvalue) && oldvalue == 4567) | if (oldsize == sizeof(oldvalue) && oldvalue == 4567) | ||||
result |= SYSCTL0_READ2; | result |= SYSCTL0_READ2; | ||||
} | } | ||||
} | } | ||||
oldsize = sizeof(oldvalue); | oldsize = sizeof(oldvalue); | ||||
if (cap_sysctlbyname(capsysctl, SYSCTL1_NAME, &oldvalue, &oldsize, | if (cap_sysctlbyname(capsysctl, SYSCTL1_NAME, &oldvalue, &oldsize, | ||||
NULL, 0) == 0) { | NULL, 0) == 0) { | ||||
if (oldsize == sizeof(oldvalue)) | if (oldsize == sizeof(oldvalue)) | ||||
result |= SYSCTL1_READ0; | 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; | newvalue = 506; | ||||
if (cap_sysctlbyname(capsysctl, SYSCTL1_NAME, NULL, NULL, &newvalue, | if (cap_sysctlbyname(capsysctl, SYSCTL1_NAME, NULL, NULL, &newvalue, | ||||
sizeof(newvalue)) == 0) { | sizeof(newvalue)) == 0) { | ||||
result |= SYSCTL1_WRITE; | result |= SYSCTL1_WRITE; | ||||
} | } | ||||
if ((result & SYSCTL1_WRITE) != 0) { | if ((result & SYSCTL1_WRITE) != 0) { | ||||
newvalue = 506; | |||||
ATF_REQUIRE(cap_sysctl(capsysctl, mib1, len1, NULL, NULL, | |||||
&newvalue, sizeof(newvalue)) == 0); | |||||
oldsize = sizeof(oldvalue); | oldsize = sizeof(oldvalue); | ||||
if (cap_sysctlbyname(capsysctl, SYSCTL1_NAME, &oldvalue, | if (cap_sysctlbyname(capsysctl, SYSCTL1_NAME, &oldvalue, | ||||
&oldsize, NULL, 0) == 0) { | &oldsize, NULL, 0) == 0) { | ||||
if (oldsize == sizeof(oldvalue) && oldvalue == 506) | if (oldsize == sizeof(oldvalue) && oldvalue == 506) | ||||
result |= SYSCTL1_READ1; | 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); | oldsize = sizeof(oldvalue); | ||||
newvalue = 7008; | newvalue = 7008; | ||||
if (cap_sysctlbyname(capsysctl, SYSCTL1_NAME, &oldvalue, &oldsize, | if (cap_sysctlbyname(capsysctl, SYSCTL1_NAME, &oldvalue, &oldsize, | ||||
&newvalue, sizeof(newvalue)) == 0) { | &newvalue, sizeof(newvalue)) == 0) { | ||||
if (oldsize == sizeof(oldvalue) && oldvalue == 506) | if (oldsize == sizeof(oldvalue) && oldvalue == 506) | ||||
result |= SYSCTL1_READ_WRITE; | result |= SYSCTL1_READ_WRITE; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 1,333 Lines • ▼ Show 20 Lines | ATF_REQUIRE_EQ(checkcaps(capsysctl), (SYSCTL0_READ0 | SYSCTL0_READ1 | | ||||
SYSCTL1_READ0 | SYSCTL1_READ1 | SYSCTL1_READ2 | SYSCTL1_WRITE | | SYSCTL1_READ0 | SYSCTL1_READ1 | SYSCTL1_READ2 | SYSCTL1_WRITE | | ||||
SYSCTL1_READ_WRITE)); | SYSCTL1_READ_WRITE)); | ||||
} | } | ||||
ATF_TC_CLEANUP(cap_sysctl__no_limits, tc) | ATF_TC_CLEANUP(cap_sysctl__no_limits, tc) | ||||
{ | { | ||||
cleanup(); | 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_TCS(tp) | ||||
{ | { | ||||
ATF_TP_ADD_TC(tp, cap_sysctl__operation); | ATF_TP_ADD_TC(tp, cap_sysctl__operation); | ||||
ATF_TP_ADD_TC(tp, cap_sysctl__names); | ATF_TP_ADD_TC(tp, cap_sysctl__names); | ||||
ATF_TP_ADD_TC(tp, cap_sysctl__no_limits); | 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()); | return (atf_no_error()); | ||||
} | } |