security/apparmor/lib.c

Source file repositories/reference/linux-study-clean/security/apparmor/lib.c

File Facts

System
Linux kernel
Corpus path
security/apparmor/lib.c
Extension
.c
Size
11610 bytes
Lines
516
Domain
Core OS
Bucket
Security And Isolation
Inferred role
Core OS: implementation source
Status
source implementation candidate

Why This File Exists

Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.

Dependency Surface

Detected Declarations

Annotated Snippet

struct val_table_ent {
	const char *str;
	int value;
};

static struct val_table_ent debug_values_table[] = {
	{ "N", DEBUG_NONE },
	{ "none", DEBUG_NONE },
	{ "n", DEBUG_NONE },
	{ "0", DEBUG_NONE },
	{ "all", DEBUG_ALL },
	{ "Y", DEBUG_ALL },
	{ "y", DEBUG_ALL },
	{ "1", DEBUG_ALL },
	{ "abs_root", DEBUG_LABEL_ABS_ROOT },
	{ "label", DEBUG_LABEL },
	{ "domain", DEBUG_DOMAIN },
	{ "policy", DEBUG_POLICY },
	{ "interface", DEBUG_INTERFACE },
	{ "unpack", DEBUG_UNPACK },
	{ "tags", DEBUG_TAGS },
	{ NULL, 0 }
};

static struct val_table_ent *val_table_find_ent(struct val_table_ent *table,
						const char *name, size_t len)
{
	struct val_table_ent *entry;

	for (entry = table; entry->str != NULL; entry++) {
		if (strncmp(entry->str, name, len) == 0 &&
		    strlen(entry->str) == len)
			return entry;
	}
	return NULL;
}

int aa_parse_debug_params(const char *str)
{
	struct val_table_ent *ent;
	const char *next;
	int val = 0;

	do {
		size_t n = strcspn(str, "\r\n,");

		next = str + n;
		ent = val_table_find_ent(debug_values_table, str, next - str);
		if (ent)
			val |= ent->value;
		else
			AA_DEBUG(DEBUG_INTERFACE, "unknown debug type '%.*s'",
				 (int)(next - str), str);
		str = next + 1;
	} while (*next != 0);
	return val;
}

/**
 * val_mask_to_str - convert a perm mask to its short string
 * @str: character buffer to store string in (at least 10 characters)
 * @size: size of the @str buffer
 * @table: NUL-terminated character buffer of permission characters (NOT NULL)
 * @mask: permission mask to convert
 */
static int val_mask_to_str(char *str, size_t size,
			   const struct val_table_ent *table, u32 mask)
{
	const struct val_table_ent *ent;
	int total = 0;

	for (ent = table; ent->str; ent++) {
		if (ent->value && (ent->value & mask) == ent->value) {
			int len = scnprintf(str, size, "%s%s", total ? "," : "",
					    ent->str);
			size -= len;
			str += len;
			total += len;
			mask &= ~ent->value;
		}
	}

	return total;
}

int aa_print_debug_params(char *buffer)
{
	if (!aa_g_debug)
		return sprintf(buffer, "N");
	return val_mask_to_str(buffer, PAGE_SIZE, debug_values_table,

Annotation

Implementation Notes