Some write() calls only check for <= 0, which fails to detect partial writes. A positive return value smaller than the requested length is currently treated as success, potentially resulting in truncated writes to KSM sysfs interfaces.
Other write() usages in the same file already verify that the full length is written, making the current checks inconsistent. Fix by verifying that write() returns the full expected length. This also aligns with recent improvements in vm_util write_file(), which enforce strict validation of write() results. Signed-off-by: Vineet Agarwal <[email protected]> --- tools/testing/selftests/mm/ksm_functional_tests.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/tools/testing/selftests/mm/ksm_functional_tests.c b/tools/testing/selftests/mm/ksm_functional_tests.c index 8d874c4754f3..9a8c852acd68 100644 --- a/tools/testing/selftests/mm/ksm_functional_tests.c +++ b/tools/testing/selftests/mm/ksm_functional_tests.c @@ -498,6 +498,7 @@ static void test_prctl_fork(void) static int start_ksmd_and_set_frequency(char *pages_to_scan, char *sleep_ms) { int ksm_fd; + ssize_t ret; ksm_fd = open("/sys/kernel/mm/ksm/run", O_RDWR); if (ksm_fd < 0) @@ -506,10 +507,12 @@ static int start_ksmd_and_set_frequency(char *pages_to_scan, char *sleep_ms) if (write(ksm_fd, "1", 1) != 1) return -errno; - if (write(pages_to_scan_fd, pages_to_scan, strlen(pages_to_scan)) <= 0) + ret = write(pages_to_scan_fd, pages_to_scan, strlen(pages_to_scan)); + if (ret < 0 || ret != strlen(pages_to_scan)) return -errno; - if (write(sleep_millisecs_fd, sleep_ms, strlen(sleep_ms)) <= 0) + ret = write(sleep_millisecs_fd, sleep_ms, strlen(sleep_ms)); + if (ret < 0 || ret != strlen(sleep_ms)) return -errno; return 0; @@ -518,6 +521,7 @@ static int start_ksmd_and_set_frequency(char *pages_to_scan, char *sleep_ms) static int stop_ksmd_and_restore_frequency(void) { int ksm_fd; + ssize_t ret; ksm_fd = open("/sys/kernel/mm/ksm/run", O_RDWR); if (ksm_fd < 0) @@ -526,10 +530,12 @@ static int stop_ksmd_and_restore_frequency(void) if (write(ksm_fd, "2", 1) != 1) return -errno; - if (write(pages_to_scan_fd, "100", 3) <= 0) + ret = write(pages_to_scan_fd, "100", 3); + if (ret < 0 || ret != 3) return -errno; - if (write(sleep_millisecs_fd, "20", 2) <= 0) + ret = write(sleep_millisecs_fd, "20", 2); + if (ret < 0 || ret != 2) return -errno; return 0; -- 2.54.0

