selftests/mm/vm_util: robust write_file()

Add three more checks for buflen and numwritten.  The buflen should be at
least two, that means at least one char and the null-end.  The error case
check is added by checking numwriten < 0 instead of numwritten < 1.  And
the truncate case is checked.  The test will exit if any of these
conditions aren't met.

Additionally, add more print information when a write failure occurs or a
truncated write happens, providing clearer diagnostics.

Link: https://lore.kernel.org/20260402014543.1671131-5-chuhu@redhat.com
Signed-off-by: Chunyu Hu <chuhu@redhat.com>
Acked-by: David Hildenbrand (Arm) <david@kernel.org>
Reviewed-by: Lorenzo Stoakes <ljs@kernel.org>
Cc: Nico Pache <npache@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
Chunyu Hu
2026-04-02 09:45:41 +08:00
committed by Andrew Morton
parent 710d2f3079
commit a784a3a39c

View File

@@ -767,15 +767,24 @@ int unpoison_memory(unsigned long pfn)
void write_file(const char *path, const char *buf, size_t buflen)
{
int fd;
int fd, saved_errno;
ssize_t numwritten;
if (buflen < 2)
ksft_exit_fail_msg("Incorrect buffer len: %zu\n", buflen);
fd = open(path, O_WRONLY);
if (fd == -1)
ksft_exit_fail_msg("%s open failed: %s\n", path, strerror(errno));
numwritten = write(fd, buf, buflen - 1);
saved_errno = errno;
close(fd);
if (numwritten < 1)
ksft_exit_fail_msg("Write failed\n");
errno = saved_errno;
if (numwritten < 0)
ksft_exit_fail_msg("%s write(%.*s) failed: %s\n", path, (int)(buflen - 1),
buf, strerror(errno));
if (numwritten != buflen - 1)
ksft_exit_fail_msg("%s write(%.*s) is truncated, expected %zu bytes, got %zd bytes\n",
path, (int)(buflen - 1), buf, buflen - 1, numwritten);
}