// SPDX-License-Identifier: GPL-2.0
/*
 * Linux Security Module infrastructure tests
 * Tests for the lsm_set_self_attr system call
 *
 * Copyright © 2022 Casey Schaufler <casey@schaufler-ca.com>
 */

#define _GNU_SOURCE
#include <linux/lsm.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include "../kselftest_harness.h"
#include "common.h"

TEST(ctx_null_lsm_set_self_attr)
{
	ASSERT_EQ(-1, lsm_set_self_attr(LSM_ATTR_CURRENT, NULL,
					sizeof(struct lsm_ctx), 0));
}

TEST(size_too_small_lsm_set_self_attr)
{
	const long page_size = sysconf(_SC_PAGESIZE);
	struct lsm_ctx *ctx = calloc(page_size, 1);
	size_t size = page_size;

	ASSERT_NE(NULL, ctx);
	if (attr_lsm_count()) {
		ASSERT_LE(1, lsm_get_self_attr(LSM_ATTR_CURRENT, ctx, &size,
					       0));
	}
	ASSERT_EQ(-1, lsm_set_self_attr(LSM_ATTR_CURRENT, ctx, 1, 0));

	free(ctx);
}

TEST(flags_zero_lsm_set_self_attr)
{
	const long page_size = sysconf(_SC_PAGESIZE);
	struct lsm_ctx *ctx = calloc(page_size, 1);
	size_t size = page_size;

	ASSERT_NE(NULL, ctx);
	if (attr_lsm_count()) {
		ASSERT_LE(1, lsm_get_self_attr(LSM_ATTR_CURRENT, ctx, &size,
					       0));
	}
	ASSERT_EQ(-1, lsm_set_self_attr(LSM_ATTR_CURRENT, ctx, size, 1));

	free(ctx);
}

TEST(flags_overset_lsm_set_self_attr)
{
	const long page_size = sysconf(_SC_PAGESIZE);
	char *ctx = calloc(page_size, 1);
	size_t size = page_size;
	struct lsm_ctx *tctx = (struct lsm_ctx *)ctx;

	ASSERT_NE(NULL, ctx);
	if (attr_lsm_count()) {
		ASSERT_LE(1, lsm_get_self_attr(LSM_ATTR_CURRENT, tctx, &size,
					       0));
	}
	ASSERT_EQ(-1, lsm_set_self_attr(LSM_ATTR_CURRENT | LSM_ATTR_PREV, tctx,
					size, 0));

	free(ctx);
}

TEST_HARNESS_MAIN
