2
0
mirror of https://gitlab.com/apparmor/apparmor synced 2025-08-22 10:07:12 +00:00
apparmor/parser/parser_symtab.c

283 lines
7.9 KiB
C
Raw Normal View History

/*
2007-04-11 08:12:51 +00:00
* Copyright (c) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
* NOVELL (All rights reserved)
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of version 2 of the GNU General Public
* License published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, contact Novell, Inc.
*/
#include <search.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <errno.h>
#include <linux/limits.h>
#include "immunix.h"
#include "parser.h"
#include "symtab.h"
#ifdef UNIT_TEST
#include "unit_test.h"
int test_add_set_to_boolean(void)
{
int rc = 0;
int retval;
struct value_list *val;
/* test adding a set value to a boolean variable */
retval = symtab::add_var("@not_a_set_variable", 1);
MY_TEST(retval == 0, "new boolean variable 3");
val = new_value_list(strdup("a set value"));
retval = symtab::add_set_value("@not_a_set_variable", val);
MY_TEST(retval != 0, "add set value to boolean");
symtab::free_symtab();
free_value_list(val);
return rc;
}
int test_expand_bool_within_set(void)
{
int rc = 0;
int retval;
variable *retsym;
/* test expanding a boolean var within a set variable */
retval = symtab::add_var("@not_a_set_variable", 1);
MY_TEST(retval == 0, "new boolean variable 4");
retval = symtab::add_var("set_variable", "set_value@{not_a_set_variable}");
MY_TEST(retval == 0, "add set value with embedded boolean");
retsym = symtab::lookup_existing_symbol("set_variable");
MY_TEST(retsym != NULL, "get set variable w/boolean");
retval = retsym->expand_variable();
MY_TEST(retval != 0, "expand set variable with embedded boolean");
symtab::free_symtab();
return rc;
}
int test_expand_recursive_set_vars(void)
{
int rc = 0;
int retval;
variable *retsym;
/* test expanding a recursive var within a set variable */
retval = symtab::add_var("recursive_1", "set_value@{recursive_2}");
MY_TEST(retval == 0, "new recursive set variable 1");
retval = symtab::add_var("recursive_2", "set_value@{recursive_3}");
MY_TEST(retval == 0, "new recursive set variable 2");
retval = symtab::add_var("recursive_3", "set_value@{recursive_1}");
MY_TEST(retval == 0, "new recursive set variable 3");
retsym = symtab::lookup_existing_symbol("recursive_1");
MY_TEST(retsym != NULL, "get recursive set variable");
retval = retsym->expand_variable();
MY_TEST(retval != 0, "expand recursive set variable");
symtab::free_symtab();
return rc;
}
int test_expand_undefined_set_var(void)
{
int rc = 0;
int retval;
variable *retsym;
/* test expanding an undefined var within a set variable */
retval = symtab::add_var("defined_var", "set_value@{undefined_var}");
MY_TEST(retval == 0, "new undefined test set variable");
retsym = symtab::lookup_existing_symbol("defined_var");
MY_TEST(retsym != NULL, "get undefined test set variable");
retval = retsym->expand_variable();
MY_TEST(retval != 0, "expand undefined set variable");
symtab::free_symtab();
return rc;
}
int test_expand_set_var_during_dump(void)
{
int rc = 0;
int retval;
variable *retsym;
/* test expanding an defined var within a set variable during var dump*/
retval = symtab::add_var("set_var_1", "set_value@{set_var_2}");
MY_TEST(retval == 0, "new dump expansion set variable 1");
retval = symtab::add_var("set_var_2", "some other set_value");
MY_TEST(retval == 0, "new dump expansion set variable 2");
retsym = symtab::lookup_existing_symbol("set_var_1");
MY_TEST(retsym != NULL, "get dump expansion set variable 1");
retsym->dump(false);
retsym->dump(true);
retsym->dump(false);
symtab::free_symtab();
return rc;
}
int test_delete_set_var(void)
{
int rc = 0;
int retval;
variable *deleted;
variable *retsym;
retval = symtab::add_var("deleteme", "delete this variable");
MY_TEST(retval == 0, "new delete set variable");
deleted = symtab::delete_var("deleteme");
MY_TEST(deleted != NULL, "delete set variable");
retsym = symtab::lookup_existing_symbol(deleted->var_name.c_str());
MY_TEST(retsym == NULL, "deleteme was deleted from symtable");
symtab::free_symtab();
return rc;
}
int main(void)
{
int rc = 0;
int retval;
struct value_list *list;
struct value_list *val;
variable *retsym;
val = new_value_list(strdup("a set value"));
retval = symtab::add_set_value("@not_a_set_variable", val);
retval = test_add_set_to_boolean();
if (rc == 0)
rc = retval;
retval = test_expand_bool_within_set();
if (rc == 0)
rc = retval;
retval = test_expand_recursive_set_vars();
if (rc == 0)
rc = retval;
retval = test_expand_undefined_set_var();
if (rc == 0)
rc = retval;
retval = test_expand_set_var_during_dump();
if (rc == 0)
rc = retval;
retval = test_delete_set_var();
if (rc == 0)
rc = retval;
retval = symtab::add_var("test", "test value");
MY_TEST(retval == 0, "new set variable 1");
retval = symtab::add_var("test", "different value");
MY_TEST(retval != 0, "new set variable 2");
retval = symtab::add_var("testing", "testing");
MY_TEST(retval == 0, "new set variable 3");
retval = symtab::add_var("monopuff", "Mockingbird");
MY_TEST(retval == 0, "new set variable 4");
retval = symtab::add_var("stereopuff", "Unsupervised");
MY_TEST(retval == 0, "new set variable 5");
val = new_value_list(strdup("Fun to Steal"));
list = val;
retval = symtab::add_set_value("@stereopuff", val);
MY_TEST(retval == 0, "add set value 1");
val = new_value_list(strdup("/in/direction"));
list_append(list, val);
retval = symtab::add_set_value("@stereopuff", val);
MY_TEST(retval == 0, "add set value 2");
val = new_value_list(strdup("stereopuff"));
list_append(list, val);
retval = symtab::add_set_value("@no_such_variable", val);
MY_TEST(retval != 0, "add to non-existent set var");
retval = symtab::add_var("@abuse", 0);
MY_TEST(retval == 0, "new boolean variable 1");
retval = symtab::add_var("@abuse", 1);
MY_TEST(retval != 0, "duplicate boolean variable 1");
retval = symtab::add_var("@stereopuff", 1);
MY_TEST(retval != 0, "duplicate boolean variable 2");
retval = symtab::add_var("@shenanigan", 1);
MY_TEST(retval == 0, "new boolean variable 2");
retsym = symtab::get_boolean_var("@shenanigan");
MY_TEST(retsym != NULL, "boolean variable 1 exists");
MY_TEST(retsym->boolean == 1, "get boolean variable 1");
retsym = symtab::get_boolean_var("@abuse");
MY_TEST(retsym != NULL, "boolean variable 2 exists");
MY_TEST(retsym->boolean == 0, "get boolean variable 2");
retsym = symtab::get_boolean_var("@non_existant");
MY_TEST(retsym == NULL, "get nonexistent boolean variable");
retsym = symtab::get_boolean_var("@stereopuff");
MY_TEST(retsym == NULL, "get boolean variable that's declared a set var");
retsym = symtab::get_set_var("@daves_not_here_man");
MY_TEST(retsym == NULL, "get nonexistent set variable");
retsym = symtab::get_set_var("@abuse");
MY_TEST(retsym == NULL, "get set variable that's declared a boolean");
/* test walking set values */
retsym = symtab::get_set_var("@monopuff");
MY_TEST(retsym != NULL, "get set variable 1");
MY_TEST(retsym->values.size() == 1, "only one value");
MY_TEST(retsym->expanded.size() == 1, "only one expanded");
for (std::string value : retsym->values) {
retval = strcmp(value.c_str(), "Mockingbird");
MY_TEST(retval == 0, "get set value 1");
}
for (std::string value : retsym->expanded) {
retval = strcmp(value.c_str(), "Mockingbird");
MY_TEST(retval == 0, "get set value 1 expanded");
}
retval = symtab::add_var("eek", "Mocking@{monopuff}bir@{stereopuff}d@{stereopuff}");
MY_TEST(retval == 0, "new set variable 4");
symtab::dump(false);
symtab::expand_variables();
symtab::dump(false);
symtab::dump(true);
free_value_list(list);
symtab::free_symtab();
return rc;
}
#endif /* UNIT_TEST */