Path: blob/master/tools/testing/selftests/filesystems/fclog.c
29270 views
// SPDX-License-Identifier: GPL-2.0-or-later1/*2* Author: Aleksa Sarai <[email protected]>3* Copyright (C) 2025 SUSE LLC.4*/56#include <assert.h>7#include <errno.h>8#include <sched.h>9#include <stdio.h>10#include <stdlib.h>11#include <string.h>12#include <unistd.h>13#include <sys/mount.h>1415#include "../kselftest_harness.h"1617#define ASSERT_ERRNO(expected, _t, seen) \18__EXPECT(expected, #expected, \19({__typeof__(seen) _tmp_seen = (seen); \20_tmp_seen >= 0 ? _tmp_seen : -errno; }), #seen, _t, 1)2122#define ASSERT_ERRNO_EQ(expected, seen) \23ASSERT_ERRNO(expected, ==, seen)2425#define ASSERT_SUCCESS(seen) \26ASSERT_ERRNO(0, <=, seen)2728FIXTURE(ns)29{30int host_mntns;31};3233FIXTURE_SETUP(ns)34{35/* Stash the old mntns. */36self->host_mntns = open("/proc/self/ns/mnt", O_RDONLY|O_CLOEXEC);37ASSERT_SUCCESS(self->host_mntns);3839/* Create a new mount namespace and make it private. */40ASSERT_SUCCESS(unshare(CLONE_NEWNS));41ASSERT_SUCCESS(mount(NULL, "/", NULL, MS_PRIVATE|MS_REC, NULL));42}4344FIXTURE_TEARDOWN(ns)45{46ASSERT_SUCCESS(setns(self->host_mntns, CLONE_NEWNS));47ASSERT_SUCCESS(close(self->host_mntns));48}4950TEST_F(ns, fscontext_log_enodata)51{52int fsfd = fsopen("tmpfs", FSOPEN_CLOEXEC);53ASSERT_SUCCESS(fsfd);5455/* A brand new fscontext has no log entries. */56char buf[128] = {};57for (int i = 0; i < 16; i++)58ASSERT_ERRNO_EQ(-ENODATA, read(fsfd, buf, sizeof(buf)));5960ASSERT_SUCCESS(close(fsfd));61}6263TEST_F(ns, fscontext_log_errorfc)64{65int fsfd = fsopen("tmpfs", FSOPEN_CLOEXEC);66ASSERT_SUCCESS(fsfd);6768ASSERT_ERRNO_EQ(-EINVAL, fsconfig(fsfd, FSCONFIG_SET_STRING, "invalid-arg", "123", 0));6970char buf[128] = {};71ASSERT_SUCCESS(read(fsfd, buf, sizeof(buf)));72EXPECT_STREQ("e tmpfs: Unknown parameter 'invalid-arg'\n", buf);7374/* The message has been consumed. */75ASSERT_ERRNO_EQ(-ENODATA, read(fsfd, buf, sizeof(buf)));76ASSERT_SUCCESS(close(fsfd));77}7879TEST_F(ns, fscontext_log_errorfc_after_fsmount)80{81int fsfd = fsopen("tmpfs", FSOPEN_CLOEXEC);82ASSERT_SUCCESS(fsfd);8384ASSERT_ERRNO_EQ(-EINVAL, fsconfig(fsfd, FSCONFIG_SET_STRING, "invalid-arg", "123", 0));8586ASSERT_SUCCESS(fsconfig(fsfd, FSCONFIG_CMD_CREATE, NULL, NULL, 0));87int mfd = fsmount(fsfd, FSMOUNT_CLOEXEC, MOUNT_ATTR_NOEXEC | MOUNT_ATTR_NOSUID);88ASSERT_SUCCESS(mfd);89ASSERT_SUCCESS(move_mount(mfd, "", AT_FDCWD, "/tmp", MOVE_MOUNT_F_EMPTY_PATH));9091/*92* The fscontext log should still contain data even after93* FSCONFIG_CMD_CREATE and fsmount().94*/95char buf[128] = {};96ASSERT_SUCCESS(read(fsfd, buf, sizeof(buf)));97EXPECT_STREQ("e tmpfs: Unknown parameter 'invalid-arg'\n", buf);9899/* The message has been consumed. */100ASSERT_ERRNO_EQ(-ENODATA, read(fsfd, buf, sizeof(buf)));101ASSERT_SUCCESS(close(fsfd));102}103104TEST_F(ns, fscontext_log_emsgsize)105{106int fsfd = fsopen("tmpfs", FSOPEN_CLOEXEC);107ASSERT_SUCCESS(fsfd);108109ASSERT_ERRNO_EQ(-EINVAL, fsconfig(fsfd, FSCONFIG_SET_STRING, "invalid-arg", "123", 0));110111char buf[128] = {};112/*113* Attempting to read a message with too small a buffer should not114* result in the message getting consumed.115*/116ASSERT_ERRNO_EQ(-EMSGSIZE, read(fsfd, buf, 0));117ASSERT_ERRNO_EQ(-EMSGSIZE, read(fsfd, buf, 1));118for (int i = 0; i < 16; i++)119ASSERT_ERRNO_EQ(-EMSGSIZE, read(fsfd, buf, 16));120121ASSERT_SUCCESS(read(fsfd, buf, sizeof(buf)));122EXPECT_STREQ("e tmpfs: Unknown parameter 'invalid-arg'\n", buf);123124/* The message has been consumed. */125ASSERT_ERRNO_EQ(-ENODATA, read(fsfd, buf, sizeof(buf)));126ASSERT_SUCCESS(close(fsfd));127}128129TEST_HARNESS_MAIN130131132