[PATCH v2 4/4] sysctl: Add 0013 to test partially updated vectors

From: Joel Granados

Date: Fri Aug 14 2026 - 06:42:58 EST


Add coverage for partially updated sysctl vectors with test 0013. It
makes sure that the sysctl vector is unchanged when one of the elements
is not valid.

Signed-off-by: Joel Granados <joel.granados@xxxxxxxxxx>
---
tools/testing/selftests/sysctl/sysctl.sh | 60 ++++++++++++++++++++++++++++++++
1 file changed, 60 insertions(+)

diff --git a/tools/testing/selftests/sysctl/sysctl.sh b/tools/testing/selftests/sysctl/sysctl.sh
index b2d8bd9026a721e96c26be20069f7f87b06a5cf7..dc8674455284612dfe898944b886d856fb8ab3fe 100755
--- a/tools/testing/selftests/sysctl/sysctl.sh
+++ b/tools/testing/selftests/sysctl/sysctl.sh
@@ -4,6 +4,7 @@

# This performs a series tests against the proc sysctl interface.

+# shellcheck disable=SC2317
# Kselftest framework requirement - SKIP code is 4.
ksft_skip=4

@@ -12,6 +13,9 @@ TEST_DRIVER="test_${TEST_NAME}"
TEST_DIR=$(dirname $0)
TEST_FILE=$(mktemp)

+# initialize for individual tests
+rc=0
+
# This represents
#
# TEST_ID:TEST_COUNT:ENABLED:TARGET:SKIP_NO_TARGET
@@ -37,6 +41,7 @@ ALL_TESTS="$ALL_TESTS 0009:1:1:unregister_error:0"
ALL_TESTS="$ALL_TESTS 0010:1:1:mnt/mnt_error:0"
ALL_TESTS="$ALL_TESTS 0011:1:1:empty_add:0"
ALL_TESTS="$ALL_TESTS 0012:1:1:u8_valid:0"
+ALL_TESTS="$ALL_TESTS 0013:1:1:int_0003:1"

function allow_user_defaults()
{
@@ -196,6 +201,18 @@ verify_diff_w()
return $?
}

+# Verify that an erroneous ($2) update fails and does not change TARGET
+verify_no_partial_update()
+{
+ TEST_STR="$1"
+ echo -n "$TEST_STR" > "$TARGET"
+
+ if echo -n "$2" > "$TARGET" 2> /dev/null; then
+ return 1
+ fi
+ verify_diff_w "${TARGET}"
+}
+
test_rc()
{
if [[ $rc != 0 ]]; then
@@ -501,6 +518,40 @@ run_limit_digit_int_array()
test_rc
}

+# You used an int array and one of the elements is not acceptable
+run_int_array_no_partial_update()
+{
+ echo -n "Testing invalid array element does not partially update ... "
+ # Expect failure because of 3rd element (abc).
+ if ! verify_no_partial_update "1 2 3 4" "10 20 abc 40"; then
+ echo "FAIL" >&2
+ rc=1
+ else
+ echo "OK"
+ fi
+ test_rc
+
+ echo -n "Testing out of range array element does not partially update ... "
+ # Expect failure because of 3rd element (greater than int)
+ if ! verify_no_partial_update "1 2 3 4" "10 20 $((INT_MAX + 1)) 40"; then
+ echo "FAIL" >&2
+ rc=1
+ else
+ echo "OK"
+ fi
+ test_rc
+
+ echo -n "Testing invalid first array element does not update ... "
+ # Expect failure of 1st element
+ if ! verify_no_partial_update "1 2 3 4" "abc 20 30 40"; then
+ echo "FAIL" >&2
+ rc=1
+ else
+ echo "OK"
+ fi
+ test_rc
+}
+
# You are using an unsigned int
run_limit_digit_uint()
{
@@ -880,6 +931,14 @@ sysctl_test_0012()
return 0
}

+sysctl_test_0013()
+{
+ TARGET="${SYSCTL}/$(get_test_target 0013)"
+ reset_vals
+
+ run_int_array_no_partial_update
+}
+
list_tests()
{
echo "Test ID list:"
@@ -900,6 +959,7 @@ list_tests()
echo "0010 x $(get_test_count 0010) - tests sysct mount point"
echo "0011 x $(get_test_count 0011) - tests empty directories"
echo "0012 x $(get_test_count 0012) - tests range check for u8 proc_handler"
+ echo "0013 x $(get_test_count 0013) - tests partially update vectors on error"
}

usage()

--
2.50.1