You've already forked linux-rockchip
mirror of
https://github.com/armbian/linux-rockchip.git
synced 2026-01-06 11:08:10 -08:00
apparmor: test: make static symbols visible during kunit testing
[ Upstream commit b11e51dd70947107fa4076c6286dce301671afc1 ] Use macros, VISIBLE_IF_KUNIT and EXPORT_SYMBOL_IF_KUNIT, to allow static symbols to be conditionally set to be visible during apparmor_policy_unpack_test, which removes the need to include the testing file in the implementation file. Change the namespace of the symbols that are now conditionally visible (by adding the prefix aa_) to avoid confusion with symbols of the same name. Allow the test to be built as a module and namespace the module name from policy_unpack_test to apparmor_policy_unpack_test to improve clarity of the module name. Provide an example of how static symbols can be dealt with in testing. Signed-off-by: Rae Moar <rmoar@google.com> Reviewed-by: David Gow <davidgow@google.com> Acked-by: John Johansen <john.johansen@canonical.com> Signed-off-by: Shuah Khan <skhan@linuxfoundation.org> Stable-dep-of: 8884ba07786c ("apparmor: fix invalid reference on profile->disconnected") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
cfce1e26b4
commit
cef064fdde
@@ -106,8 +106,8 @@ config SECURITY_APPARMOR_PARANOID_LOAD
|
||||
Disabling the check will speed up policy loads.
|
||||
|
||||
config SECURITY_APPARMOR_KUNIT_TEST
|
||||
bool "Build KUnit tests for policy_unpack.c" if !KUNIT_ALL_TESTS
|
||||
depends on KUNIT=y && SECURITY_APPARMOR
|
||||
tristate "Build KUnit tests for policy_unpack.c" if !KUNIT_ALL_TESTS
|
||||
depends on KUNIT && SECURITY_APPARMOR
|
||||
default KUNIT_ALL_TESTS
|
||||
help
|
||||
This builds the AppArmor KUnit tests.
|
||||
|
||||
@@ -8,6 +8,9 @@ apparmor-y := apparmorfs.o audit.o capability.o task.o ipc.o lib.o match.o \
|
||||
resource.o secid.o file.o policy_ns.o label.o mount.o net.o
|
||||
apparmor-$(CONFIG_SECURITY_APPARMOR_HASH) += crypto.o
|
||||
|
||||
obj-$(CONFIG_SECURITY_APPARMOR_KUNIT_TEST) += apparmor_policy_unpack_test.o
|
||||
apparmor_policy_unpack_test-objs += policy_unpack_test.o
|
||||
|
||||
clean-files := capability_names.h rlim_names.h net_names.h
|
||||
|
||||
# Build a lower case string table of address family names
|
||||
|
||||
@@ -48,6 +48,43 @@ enum {
|
||||
AAFS_LOADDATA_NDENTS /* count of entries */
|
||||
};
|
||||
|
||||
/*
|
||||
* The AppArmor interface treats data as a type byte followed by the
|
||||
* actual data. The interface has the notion of a named entry
|
||||
* which has a name (AA_NAME typecode followed by name string) followed by
|
||||
* the entries typecode and data. Named types allow for optional
|
||||
* elements and extensions to be added and tested for without breaking
|
||||
* backwards compatibility.
|
||||
*/
|
||||
|
||||
enum aa_code {
|
||||
AA_U8,
|
||||
AA_U16,
|
||||
AA_U32,
|
||||
AA_U64,
|
||||
AA_NAME, /* same as string except it is items name */
|
||||
AA_STRING,
|
||||
AA_BLOB,
|
||||
AA_STRUCT,
|
||||
AA_STRUCTEND,
|
||||
AA_LIST,
|
||||
AA_LISTEND,
|
||||
AA_ARRAY,
|
||||
AA_ARRAYEND,
|
||||
};
|
||||
|
||||
/*
|
||||
* aa_ext is the read of the buffer containing the serialized profile. The
|
||||
* data is copied into a kernel buffer in apparmorfs and then handed off to
|
||||
* the unpack routines.
|
||||
*/
|
||||
struct aa_ext {
|
||||
void *start;
|
||||
void *end;
|
||||
void *pos; /* pointer to current position in the buffer */
|
||||
u32 version;
|
||||
};
|
||||
|
||||
/*
|
||||
* struct aa_loaddata - buffer of policy raw_data set
|
||||
*
|
||||
@@ -126,4 +163,17 @@ static inline void aa_put_loaddata(struct aa_loaddata *data)
|
||||
kref_put(&data->count, aa_loaddata_kref);
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_KUNIT)
|
||||
bool aa_inbounds(struct aa_ext *e, size_t size);
|
||||
size_t aa_unpack_u16_chunk(struct aa_ext *e, char **chunk);
|
||||
bool aa_unpack_X(struct aa_ext *e, enum aa_code code);
|
||||
bool aa_unpack_nameX(struct aa_ext *e, enum aa_code code, const char *name);
|
||||
bool aa_unpack_u32(struct aa_ext *e, u32 *data, const char *name);
|
||||
bool aa_unpack_u64(struct aa_ext *e, u64 *data, const char *name);
|
||||
size_t aa_unpack_array(struct aa_ext *e, const char *name);
|
||||
size_t aa_unpack_blob(struct aa_ext *e, char **blob, const char *name);
|
||||
int aa_unpack_str(struct aa_ext *e, const char **string, const char *name);
|
||||
int aa_unpack_strdup(struct aa_ext *e, char **string, const char *name);
|
||||
#endif
|
||||
|
||||
#endif /* __POLICY_INTERFACE_H */
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -4,6 +4,7 @@
|
||||
*/
|
||||
|
||||
#include <kunit/test.h>
|
||||
#include <kunit/visibility.h>
|
||||
|
||||
#include "include/policy.h"
|
||||
#include "include/policy_unpack.h"
|
||||
@@ -43,6 +44,8 @@
|
||||
#define TEST_ARRAY_BUF_OFFSET \
|
||||
(TEST_NAMED_ARRAY_BUF_OFFSET + 3 + strlen(TEST_ARRAY_NAME) + 1)
|
||||
|
||||
MODULE_IMPORT_NS(EXPORTED_FOR_KUNIT_TESTING);
|
||||
|
||||
struct policy_unpack_fixture {
|
||||
struct aa_ext *e;
|
||||
size_t e_size;
|
||||
@@ -125,16 +128,16 @@ static void policy_unpack_test_inbounds_when_inbounds(struct kunit *test)
|
||||
{
|
||||
struct policy_unpack_fixture *puf = test->priv;
|
||||
|
||||
KUNIT_EXPECT_TRUE(test, inbounds(puf->e, 0));
|
||||
KUNIT_EXPECT_TRUE(test, inbounds(puf->e, puf->e_size / 2));
|
||||
KUNIT_EXPECT_TRUE(test, inbounds(puf->e, puf->e_size));
|
||||
KUNIT_EXPECT_TRUE(test, aa_inbounds(puf->e, 0));
|
||||
KUNIT_EXPECT_TRUE(test, aa_inbounds(puf->e, puf->e_size / 2));
|
||||
KUNIT_EXPECT_TRUE(test, aa_inbounds(puf->e, puf->e_size));
|
||||
}
|
||||
|
||||
static void policy_unpack_test_inbounds_when_out_of_bounds(struct kunit *test)
|
||||
{
|
||||
struct policy_unpack_fixture *puf = test->priv;
|
||||
|
||||
KUNIT_EXPECT_FALSE(test, inbounds(puf->e, puf->e_size + 1));
|
||||
KUNIT_EXPECT_FALSE(test, aa_inbounds(puf->e, puf->e_size + 1));
|
||||
}
|
||||
|
||||
static void policy_unpack_test_unpack_array_with_null_name(struct kunit *test)
|
||||
@@ -144,7 +147,7 @@ static void policy_unpack_test_unpack_array_with_null_name(struct kunit *test)
|
||||
|
||||
puf->e->pos += TEST_ARRAY_BUF_OFFSET;
|
||||
|
||||
array_size = unpack_array(puf->e, NULL);
|
||||
array_size = aa_unpack_array(puf->e, NULL);
|
||||
|
||||
KUNIT_EXPECT_EQ(test, array_size, (u16)TEST_ARRAY_SIZE);
|
||||
KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
|
||||
@@ -159,7 +162,7 @@ static void policy_unpack_test_unpack_array_with_name(struct kunit *test)
|
||||
|
||||
puf->e->pos += TEST_NAMED_ARRAY_BUF_OFFSET;
|
||||
|
||||
array_size = unpack_array(puf->e, name);
|
||||
array_size = aa_unpack_array(puf->e, name);
|
||||
|
||||
KUNIT_EXPECT_EQ(test, array_size, (u16)TEST_ARRAY_SIZE);
|
||||
KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
|
||||
@@ -175,7 +178,7 @@ static void policy_unpack_test_unpack_array_out_of_bounds(struct kunit *test)
|
||||
puf->e->pos += TEST_NAMED_ARRAY_BUF_OFFSET;
|
||||
puf->e->end = puf->e->start + TEST_ARRAY_BUF_OFFSET + sizeof(u16);
|
||||
|
||||
array_size = unpack_array(puf->e, name);
|
||||
array_size = aa_unpack_array(puf->e, name);
|
||||
|
||||
KUNIT_EXPECT_EQ(test, array_size, 0);
|
||||
KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
|
||||
@@ -189,7 +192,7 @@ static void policy_unpack_test_unpack_blob_with_null_name(struct kunit *test)
|
||||
size_t size;
|
||||
|
||||
puf->e->pos += TEST_BLOB_BUF_OFFSET;
|
||||
size = unpack_blob(puf->e, &blob, NULL);
|
||||
size = aa_unpack_blob(puf->e, &blob, NULL);
|
||||
|
||||
KUNIT_ASSERT_EQ(test, size, TEST_BLOB_DATA_SIZE);
|
||||
KUNIT_EXPECT_TRUE(test,
|
||||
@@ -203,7 +206,7 @@ static void policy_unpack_test_unpack_blob_with_name(struct kunit *test)
|
||||
size_t size;
|
||||
|
||||
puf->e->pos += TEST_NAMED_BLOB_BUF_OFFSET;
|
||||
size = unpack_blob(puf->e, &blob, TEST_BLOB_NAME);
|
||||
size = aa_unpack_blob(puf->e, &blob, TEST_BLOB_NAME);
|
||||
|
||||
KUNIT_ASSERT_EQ(test, size, TEST_BLOB_DATA_SIZE);
|
||||
KUNIT_EXPECT_TRUE(test,
|
||||
@@ -222,7 +225,7 @@ static void policy_unpack_test_unpack_blob_out_of_bounds(struct kunit *test)
|
||||
puf->e->end = puf->e->start + TEST_BLOB_BUF_OFFSET
|
||||
+ TEST_BLOB_DATA_SIZE - 1;
|
||||
|
||||
size = unpack_blob(puf->e, &blob, TEST_BLOB_NAME);
|
||||
size = aa_unpack_blob(puf->e, &blob, TEST_BLOB_NAME);
|
||||
|
||||
KUNIT_EXPECT_EQ(test, size, 0);
|
||||
KUNIT_EXPECT_PTR_EQ(test, puf->e->pos, start);
|
||||
@@ -235,7 +238,7 @@ static void policy_unpack_test_unpack_str_with_null_name(struct kunit *test)
|
||||
size_t size;
|
||||
|
||||
puf->e->pos += TEST_STRING_BUF_OFFSET;
|
||||
size = unpack_str(puf->e, &string, NULL);
|
||||
size = aa_unpack_str(puf->e, &string, NULL);
|
||||
|
||||
KUNIT_EXPECT_EQ(test, size, strlen(TEST_STRING_DATA) + 1);
|
||||
KUNIT_EXPECT_STREQ(test, string, TEST_STRING_DATA);
|
||||
@@ -247,7 +250,7 @@ static void policy_unpack_test_unpack_str_with_name(struct kunit *test)
|
||||
const char *string = NULL;
|
||||
size_t size;
|
||||
|
||||
size = unpack_str(puf->e, &string, TEST_STRING_NAME);
|
||||
size = aa_unpack_str(puf->e, &string, TEST_STRING_NAME);
|
||||
|
||||
KUNIT_EXPECT_EQ(test, size, strlen(TEST_STRING_DATA) + 1);
|
||||
KUNIT_EXPECT_STREQ(test, string, TEST_STRING_DATA);
|
||||
@@ -263,7 +266,7 @@ static void policy_unpack_test_unpack_str_out_of_bounds(struct kunit *test)
|
||||
puf->e->end = puf->e->pos + TEST_STRING_BUF_OFFSET
|
||||
+ strlen(TEST_STRING_DATA) - 1;
|
||||
|
||||
size = unpack_str(puf->e, &string, TEST_STRING_NAME);
|
||||
size = aa_unpack_str(puf->e, &string, TEST_STRING_NAME);
|
||||
|
||||
KUNIT_EXPECT_EQ(test, size, 0);
|
||||
KUNIT_EXPECT_PTR_EQ(test, puf->e->pos, start);
|
||||
@@ -276,7 +279,7 @@ static void policy_unpack_test_unpack_strdup_with_null_name(struct kunit *test)
|
||||
size_t size;
|
||||
|
||||
puf->e->pos += TEST_STRING_BUF_OFFSET;
|
||||
size = unpack_strdup(puf->e, &string, NULL);
|
||||
size = aa_unpack_strdup(puf->e, &string, NULL);
|
||||
|
||||
KUNIT_EXPECT_EQ(test, size, strlen(TEST_STRING_DATA) + 1);
|
||||
KUNIT_EXPECT_FALSE(test,
|
||||
@@ -291,7 +294,7 @@ static void policy_unpack_test_unpack_strdup_with_name(struct kunit *test)
|
||||
char *string = NULL;
|
||||
size_t size;
|
||||
|
||||
size = unpack_strdup(puf->e, &string, TEST_STRING_NAME);
|
||||
size = aa_unpack_strdup(puf->e, &string, TEST_STRING_NAME);
|
||||
|
||||
KUNIT_EXPECT_EQ(test, size, strlen(TEST_STRING_DATA) + 1);
|
||||
KUNIT_EXPECT_FALSE(test,
|
||||
@@ -310,7 +313,7 @@ static void policy_unpack_test_unpack_strdup_out_of_bounds(struct kunit *test)
|
||||
puf->e->end = puf->e->pos + TEST_STRING_BUF_OFFSET
|
||||
+ strlen(TEST_STRING_DATA) - 1;
|
||||
|
||||
size = unpack_strdup(puf->e, &string, TEST_STRING_NAME);
|
||||
size = aa_unpack_strdup(puf->e, &string, TEST_STRING_NAME);
|
||||
|
||||
KUNIT_EXPECT_EQ(test, size, 0);
|
||||
KUNIT_EXPECT_NULL(test, string);
|
||||
@@ -324,7 +327,7 @@ static void policy_unpack_test_unpack_nameX_with_null_name(struct kunit *test)
|
||||
|
||||
puf->e->pos += TEST_U32_BUF_OFFSET;
|
||||
|
||||
success = unpack_nameX(puf->e, AA_U32, NULL);
|
||||
success = aa_unpack_nameX(puf->e, AA_U32, NULL);
|
||||
|
||||
KUNIT_EXPECT_TRUE(test, success);
|
||||
KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
|
||||
@@ -338,7 +341,7 @@ static void policy_unpack_test_unpack_nameX_with_wrong_code(struct kunit *test)
|
||||
|
||||
puf->e->pos += TEST_U32_BUF_OFFSET;
|
||||
|
||||
success = unpack_nameX(puf->e, AA_BLOB, NULL);
|
||||
success = aa_unpack_nameX(puf->e, AA_BLOB, NULL);
|
||||
|
||||
KUNIT_EXPECT_FALSE(test, success);
|
||||
KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
|
||||
@@ -353,7 +356,7 @@ static void policy_unpack_test_unpack_nameX_with_name(struct kunit *test)
|
||||
|
||||
puf->e->pos += TEST_NAMED_U32_BUF_OFFSET;
|
||||
|
||||
success = unpack_nameX(puf->e, AA_U32, name);
|
||||
success = aa_unpack_nameX(puf->e, AA_U32, name);
|
||||
|
||||
KUNIT_EXPECT_TRUE(test, success);
|
||||
KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
|
||||
@@ -368,7 +371,7 @@ static void policy_unpack_test_unpack_nameX_with_wrong_name(struct kunit *test)
|
||||
|
||||
puf->e->pos += TEST_NAMED_U32_BUF_OFFSET;
|
||||
|
||||
success = unpack_nameX(puf->e, AA_U32, name);
|
||||
success = aa_unpack_nameX(puf->e, AA_U32, name);
|
||||
|
||||
KUNIT_EXPECT_FALSE(test, success);
|
||||
KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
|
||||
@@ -389,7 +392,7 @@ static void policy_unpack_test_unpack_u16_chunk_basic(struct kunit *test)
|
||||
*/
|
||||
puf->e->end += TEST_U16_DATA;
|
||||
|
||||
size = unpack_u16_chunk(puf->e, &chunk);
|
||||
size = aa_unpack_u16_chunk(puf->e, &chunk);
|
||||
|
||||
KUNIT_EXPECT_PTR_EQ(test, chunk,
|
||||
puf->e->start + TEST_U16_OFFSET + 2);
|
||||
@@ -406,7 +409,7 @@ static void policy_unpack_test_unpack_u16_chunk_out_of_bounds_1(
|
||||
|
||||
puf->e->pos = puf->e->end - 1;
|
||||
|
||||
size = unpack_u16_chunk(puf->e, &chunk);
|
||||
size = aa_unpack_u16_chunk(puf->e, &chunk);
|
||||
|
||||
KUNIT_EXPECT_EQ(test, size, 0);
|
||||
KUNIT_EXPECT_NULL(test, chunk);
|
||||
@@ -428,7 +431,7 @@ static void policy_unpack_test_unpack_u16_chunk_out_of_bounds_2(
|
||||
*/
|
||||
puf->e->end = puf->e->pos + TEST_U16_DATA - 1;
|
||||
|
||||
size = unpack_u16_chunk(puf->e, &chunk);
|
||||
size = aa_unpack_u16_chunk(puf->e, &chunk);
|
||||
|
||||
KUNIT_EXPECT_EQ(test, size, 0);
|
||||
KUNIT_EXPECT_NULL(test, chunk);
|
||||
@@ -443,7 +446,7 @@ static void policy_unpack_test_unpack_u32_with_null_name(struct kunit *test)
|
||||
|
||||
puf->e->pos += TEST_U32_BUF_OFFSET;
|
||||
|
||||
success = unpack_u32(puf->e, &data, NULL);
|
||||
success = aa_unpack_u32(puf->e, &data, NULL);
|
||||
|
||||
KUNIT_EXPECT_TRUE(test, success);
|
||||
KUNIT_EXPECT_EQ(test, data, TEST_U32_DATA);
|
||||
@@ -460,7 +463,7 @@ static void policy_unpack_test_unpack_u32_with_name(struct kunit *test)
|
||||
|
||||
puf->e->pos += TEST_NAMED_U32_BUF_OFFSET;
|
||||
|
||||
success = unpack_u32(puf->e, &data, name);
|
||||
success = aa_unpack_u32(puf->e, &data, name);
|
||||
|
||||
KUNIT_EXPECT_TRUE(test, success);
|
||||
KUNIT_EXPECT_EQ(test, data, TEST_U32_DATA);
|
||||
@@ -478,7 +481,7 @@ static void policy_unpack_test_unpack_u32_out_of_bounds(struct kunit *test)
|
||||
puf->e->pos += TEST_NAMED_U32_BUF_OFFSET;
|
||||
puf->e->end = puf->e->start + TEST_U32_BUF_OFFSET + sizeof(u32);
|
||||
|
||||
success = unpack_u32(puf->e, &data, name);
|
||||
success = aa_unpack_u32(puf->e, &data, name);
|
||||
|
||||
KUNIT_EXPECT_FALSE(test, success);
|
||||
KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
|
||||
@@ -493,7 +496,7 @@ static void policy_unpack_test_unpack_u64_with_null_name(struct kunit *test)
|
||||
|
||||
puf->e->pos += TEST_U64_BUF_OFFSET;
|
||||
|
||||
success = unpack_u64(puf->e, &data, NULL);
|
||||
success = aa_unpack_u64(puf->e, &data, NULL);
|
||||
|
||||
KUNIT_EXPECT_TRUE(test, success);
|
||||
KUNIT_EXPECT_EQ(test, data, TEST_U64_DATA);
|
||||
@@ -510,7 +513,7 @@ static void policy_unpack_test_unpack_u64_with_name(struct kunit *test)
|
||||
|
||||
puf->e->pos += TEST_NAMED_U64_BUF_OFFSET;
|
||||
|
||||
success = unpack_u64(puf->e, &data, name);
|
||||
success = aa_unpack_u64(puf->e, &data, name);
|
||||
|
||||
KUNIT_EXPECT_TRUE(test, success);
|
||||
KUNIT_EXPECT_EQ(test, data, TEST_U64_DATA);
|
||||
@@ -528,7 +531,7 @@ static void policy_unpack_test_unpack_u64_out_of_bounds(struct kunit *test)
|
||||
puf->e->pos += TEST_NAMED_U64_BUF_OFFSET;
|
||||
puf->e->end = puf->e->start + TEST_U64_BUF_OFFSET + sizeof(u64);
|
||||
|
||||
success = unpack_u64(puf->e, &data, name);
|
||||
success = aa_unpack_u64(puf->e, &data, name);
|
||||
|
||||
KUNIT_EXPECT_FALSE(test, success);
|
||||
KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
|
||||
@@ -538,7 +541,7 @@ static void policy_unpack_test_unpack_u64_out_of_bounds(struct kunit *test)
|
||||
static void policy_unpack_test_unpack_X_code_match(struct kunit *test)
|
||||
{
|
||||
struct policy_unpack_fixture *puf = test->priv;
|
||||
bool success = unpack_X(puf->e, AA_NAME);
|
||||
bool success = aa_unpack_X(puf->e, AA_NAME);
|
||||
|
||||
KUNIT_EXPECT_TRUE(test, success);
|
||||
KUNIT_EXPECT_TRUE(test, puf->e->pos == puf->e->start + 1);
|
||||
@@ -547,7 +550,7 @@ static void policy_unpack_test_unpack_X_code_match(struct kunit *test)
|
||||
static void policy_unpack_test_unpack_X_code_mismatch(struct kunit *test)
|
||||
{
|
||||
struct policy_unpack_fixture *puf = test->priv;
|
||||
bool success = unpack_X(puf->e, AA_STRING);
|
||||
bool success = aa_unpack_X(puf->e, AA_STRING);
|
||||
|
||||
KUNIT_EXPECT_FALSE(test, success);
|
||||
KUNIT_EXPECT_TRUE(test, puf->e->pos == puf->e->start);
|
||||
@@ -559,7 +562,7 @@ static void policy_unpack_test_unpack_X_out_of_bounds(struct kunit *test)
|
||||
bool success;
|
||||
|
||||
puf->e->pos = puf->e->end;
|
||||
success = unpack_X(puf->e, AA_NAME);
|
||||
success = aa_unpack_X(puf->e, AA_NAME);
|
||||
|
||||
KUNIT_EXPECT_FALSE(test, success);
|
||||
}
|
||||
@@ -605,3 +608,5 @@ static struct kunit_suite apparmor_policy_unpack_test_module = {
|
||||
};
|
||||
|
||||
kunit_test_suite(apparmor_policy_unpack_test_module);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
Reference in New Issue
Block a user