Skip to content

Commit cf1089f

Browse files
committed
Add targeted regressions for portability behavior
Add memusage platform tests and password offline fallback coverage to protect recent cross-platform fixes. Update sysctl probe tests for Darwin-specific behavior and portable stderr handling so test outcomes are consistent on macOS.
1 parent d8f9481 commit cf1089f

5 files changed

Lines changed: 125 additions & 5 deletions

File tree

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// SPDX-License-Identifier: LGPL-2.1-or-later
2+
3+
#ifdef HAVE_CONFIG_H
4+
#include <config.h>
5+
#endif
6+
7+
#include <stdio.h>
8+
#include <errno.h>
9+
10+
#include "memusage.h"
11+
#include "memusage.c"
12+
13+
int main(void)
14+
{
15+
struct sys_memusage sys_mu = {0};
16+
struct proc_memusage proc_mu = {0};
17+
int ret_sys = oscap_sys_memusage(&sys_mu);
18+
int ret_proc = oscap_proc_memusage(&proc_mu);
19+
20+
#if defined(OS_LINUX) || defined(OS_FREEBSD) || defined(OS_APPLE)
21+
if (ret_sys != 0) {
22+
fprintf(stderr, "oscap_sys_memusage failed with errno=%d\n", errno);
23+
return 1;
24+
}
25+
if (ret_proc != 0) {
26+
fprintf(stderr, "oscap_proc_memusage failed with errno=%d\n", errno);
27+
return 1;
28+
}
29+
#else
30+
if (ret_sys == 0 || ret_proc == 0) {
31+
fprintf(stderr, "memusage unexpectedly supported on this platform\n");
32+
return 1;
33+
}
34+
#endif
35+
36+
return 0;
37+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#!/usr/bin/env bash
2+
3+
. $builddir/tests/test_common.sh
4+
5+
if [ -n "${CUSTOM_OSCAP+x}" ] ; then
6+
exit 255
7+
fi
8+
9+
./test_memusage_platform
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#!/usr/bin/env bash
2+
3+
. $builddir/tests/test_common.sh
4+
5+
set -e -o pipefail
6+
7+
function test_probes_password_offline_fallback {
8+
probecheck "password" || return 255
9+
10+
# This regression targets platforms without fgetpwent(3), primarily macOS.
11+
case "$(uname)" in
12+
Darwin) ;;
13+
*) return 255 ;;
14+
esac
15+
16+
local DF="${srcdir}/test_probes_password_offline.xml"
17+
local RF="results.xml"
18+
[ -f "$RF" ] && rm -f "$RF"
19+
20+
tmpdir=$(mktemp -t -d "test_password_fallback.XXXXXX")
21+
mkdir -p "$tmpdir/etc"
22+
cat > "$tmpdir/etc/passwd" <<'EOF'
23+
# comment line should be ignored
24+
25+
invalid_line_without_separators
26+
root:x:0:0:root:/root:/bin/bash
27+
EOF
28+
29+
set_chroot_offline_test_mode "$tmpdir"
30+
$OSCAP oval eval --results "$RF" "$DF"
31+
unset_chroot_offline_test_mode
32+
rm -rf "$tmpdir"
33+
34+
if [ -f "$RF" ]; then
35+
result="$RF"
36+
assert_exists 1 'oval_results/results/system/tests/test[@test_id="oval:1:tst:1"][@result="true"]'
37+
else
38+
return 1
39+
fi
40+
}
41+
42+
test_init
43+
44+
test_run "test_probes_password_offline_fallback" test_probes_password_offline_fallback
45+
46+
test_exit

tests/probes/sysctl/test_sysctl_probe.sh

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ function perform_test {
1414
FreeBSD)
1515
$OSCAP oval eval --results $result $srcdir/test_sysctl_probe_freebsd.oval.xml 2>$stderr
1616
;;
17+
Darwin)
18+
$OSCAP oval eval --results $result $srcdir/test_sysctl_probe_freebsd.oval.xml 2>$stderr
19+
;;
1720
*)
1821
$OSCAP oval eval --results $result $srcdir/test_sysctl_probe.oval.xml 2>$stderr
1922
;;
@@ -25,6 +28,10 @@ function perform_test {
2528
assert_exists 1 "/oval_results/results/system/oval_system_characteristics/system_data/unix-sys:sysctl_item/unix-sys:name[text()='kern.hostname']"
2629
assert_exists 1 "/oval_results/results/system/oval_system_characteristics/system_data/unix-sys:sysctl_item/unix-sys:value[text()='$hostname']"
2730
;;
31+
Darwin)
32+
assert_exists 1 "/oval_results/results/system/oval_system_characteristics/system_data/unix-sys:sysctl_item/unix-sys:name[text()='kern.hostname']"
33+
assert_exists 1 "/oval_results/results/system/oval_system_characteristics/system_data/unix-sys:sysctl_item/unix-sys:value[text()='$hostname']"
34+
;;
2835
*)
2936
assert_exists 1 "/oval_results/results/system/oval_system_characteristics/system_data/unix-sys:sysctl_item/unix-sys:name[text()='kernel.hostname']"
3037
assert_exists 1 "/oval_results/results/system/oval_system_characteristics/system_data/unix-sys:sysctl_item/unix-sys:value[text()='$hostname']"

tests/probes/sysctl/test_sysctl_probe_all.sh

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,13 @@ PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
1010

1111
function perform_test {
1212
probecheck "sysctl" || return 255
13+
case $(uname) in
14+
Darwin)
15+
# macOS exposes many implementation-specific sysctls; this strict parity
16+
# test is intended for Linux/FreeBSD naming behavior.
17+
return 255
18+
;;
19+
esac
1320

1421
name=$(basename $0 .sh)
1522

@@ -29,12 +36,18 @@ function perform_test {
2936
FreeBSD)
3037
sysctl -aN 2> /dev/null > "$sysctlNames"
3138
;;
39+
Darwin)
40+
sysctl -aN 2> /dev/null > "$sysctlNames"
41+
;;
3242
Linux)
3343
# sysctl has duplicities in output
3444
# hide permission errors like: "sysctl: permission denied on key 'fs.protected_hardlinks'"
3545
# kernel parameters might use "/" and "." separators interchangeably - normalizing
3646
sysctl -a --deprecated 2> /dev/null | tr "/" "." | cut -d "=" -f 1 | tr -d " " | sort -u > "$sysctlNames"
3747
;;
48+
*)
49+
return 255
50+
;;
3851
esac
3952

4053
grep unix-sys:name "$result" | xsed -E 's;.*>(.*)<.*;\1;g' | sort > "$ourNames"
@@ -43,15 +56,23 @@ function perform_test {
4356
diff "$sysctlNames" "$ourNames"
4457
echo "-------------------------------------"
4558

46-
# remove oscap error message related to permissions from stderr
47-
sed -i -E "/^E: oscap: +Can't read sysctl value from /d" "$stderr"
48-
sed -i -E "/^E: oscap: +An error.*, Operation not permitted/d" "$stderr"
59+
# remove known, non-fatal errors from stderr in a portable way (BSD/GNU sed)
60+
tmp_filtered=$(mktemp ${name}.stderr.filtered.XXXXXX)
61+
sed -E "/^E: oscap: +Can't read sysctl value from /d" "$stderr" > "$tmp_filtered"
62+
mv "$tmp_filtered" "$stderr"
63+
tmp_filtered=$(mktemp ${name}.stderr.filtered.XXXXXX)
64+
sed -E "/^E: oscap: +An error.*, Operation not permitted/d" "$stderr" > "$tmp_filtered"
65+
mv "$tmp_filtered" "$stderr"
4966

5067
# remove oscap error message related to gibberish binary entries
5168
# that can't fit into 8K buffer and result in errno 14
5269
# (for example /proc/sys/kernel/spl/hostid could be the case)
53-
sed -i -E "/^E: oscap: +An error.*14, Bad address/d" "$stderr"
54-
sed -i "/^.*hugepages.*$/d" "$stderr"
70+
tmp_filtered=$(mktemp ${name}.stderr.filtered.XXXXXX)
71+
sed -E "/^E: oscap: +An error.*14, Bad address/d" "$stderr" > "$tmp_filtered"
72+
mv "$tmp_filtered" "$stderr"
73+
tmp_filtered=$(mktemp ${name}.stderr.filtered.XXXXXX)
74+
sed "/^.*hugepages.*$/d" "$stderr" > "$tmp_filtered"
75+
mv "$tmp_filtered" "$stderr"
5576

5677
echo "Errors (without messages related to permissions):"
5778
cat "$stderr"

0 commit comments

Comments
 (0)