tools/testing/selftests/exec/check-exec.c

Source file repositories/reference/linux-study-clean/tools/testing/selftests/exec/check-exec.c

File Facts

System
Linux kernel
Corpus path
tools/testing/selftests/exec/check-exec.c
Extension
.c
Size
12091 bytes
Lines
464
Domain
Support Tooling And Documentation
Bucket
tools
Inferred role
Support Tooling And Documentation: implementation source
Status
source implementation candidate

Why This File Exists

Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.

Dependency Surface

Detected Declarations

Annotated Snippet

if (child == 0) {      \
			__VA_ARGS__;   \
			_exit(0);      \
		}                      \
	} while (0)

TEST_F(secbits, exec)
{
	unsigned int secbits = prctl(PR_GET_SECUREBITS);

	secbits |= SECBIT_EXEC_RESTRICT_FILE;
	EXPECT_EQ(0, test_secbits_set(secbits));
	EXPECT_EQ(secbits, prctl(PR_GET_SECUREBITS));
	CHILD(EXPECT_EQ(secbits, prctl(PR_GET_SECUREBITS)));

	secbits |= SECBIT_EXEC_DENY_INTERACTIVE;
	EXPECT_EQ(0, test_secbits_set(secbits));
	EXPECT_EQ(secbits, prctl(PR_GET_SECUREBITS));
	CHILD(EXPECT_EQ(secbits, prctl(PR_GET_SECUREBITS)));

	secbits &= ~(SECBIT_EXEC_RESTRICT_FILE | SECBIT_EXEC_DENY_INTERACTIVE);
	EXPECT_EQ(0, test_secbits_set(secbits));
	EXPECT_EQ(secbits, prctl(PR_GET_SECUREBITS));
	CHILD(EXPECT_EQ(secbits, prctl(PR_GET_SECUREBITS)));
}

TEST_F(secbits, check_locked_set)
{
	unsigned int secbits = prctl(PR_GET_SECUREBITS);

	secbits |= SECBIT_EXEC_RESTRICT_FILE;
	EXPECT_EQ(0, test_secbits_set(secbits));
	secbits |= SECBIT_EXEC_RESTRICT_FILE_LOCKED;
	EXPECT_EQ(0, test_secbits_set(secbits));

	/* Checks lock set but unchanged. */
	EXPECT_EQ(variant->error, test_secbits_set(secbits));
	CHILD(EXPECT_EQ(variant->error, test_secbits_set(secbits)));

	secbits &= ~SECBIT_EXEC_RESTRICT_FILE;
	EXPECT_EQ(EPERM, test_secbits_set(0));
	CHILD(EXPECT_EQ(EPERM, test_secbits_set(0)));
}

TEST_F(secbits, check_locked_unset)
{
	unsigned int secbits = prctl(PR_GET_SECUREBITS);

	secbits |= SECBIT_EXEC_RESTRICT_FILE_LOCKED;
	EXPECT_EQ(0, test_secbits_set(secbits));

	/* Checks lock unset but unchanged. */
	EXPECT_EQ(variant->error, test_secbits_set(secbits));
	CHILD(EXPECT_EQ(variant->error, test_secbits_set(secbits)));

	secbits &= ~SECBIT_EXEC_RESTRICT_FILE;
	EXPECT_EQ(EPERM, test_secbits_set(0));
	CHILD(EXPECT_EQ(EPERM, test_secbits_set(0)));
}

TEST_F(secbits, restrict_locked_set)
{
	unsigned int secbits = prctl(PR_GET_SECUREBITS);

	secbits |= SECBIT_EXEC_DENY_INTERACTIVE;
	EXPECT_EQ(0, test_secbits_set(secbits));
	secbits |= SECBIT_EXEC_DENY_INTERACTIVE_LOCKED;
	EXPECT_EQ(0, test_secbits_set(secbits));

	/* Checks lock set but unchanged. */
	EXPECT_EQ(variant->error, test_secbits_set(secbits));
	CHILD(EXPECT_EQ(variant->error, test_secbits_set(secbits)));

	secbits &= ~SECBIT_EXEC_DENY_INTERACTIVE;
	EXPECT_EQ(EPERM, test_secbits_set(0));
	CHILD(EXPECT_EQ(EPERM, test_secbits_set(0)));
}

TEST_F(secbits, restrict_locked_unset)
{
	unsigned int secbits = prctl(PR_GET_SECUREBITS);

	secbits |= SECBIT_EXEC_DENY_INTERACTIVE_LOCKED;
	EXPECT_EQ(0, test_secbits_set(secbits));

	/* Checks lock unset but unchanged. */
	EXPECT_EQ(variant->error, test_secbits_set(secbits));
	CHILD(EXPECT_EQ(variant->error, test_secbits_set(secbits)));

	secbits &= ~SECBIT_EXEC_DENY_INTERACTIVE;

Annotation

Implementation Notes