diff --git a/src/launch/test-config.c b/src/launch/test-config.c index 0401a434..c2f8765e 100644 --- a/src/launch/test-config.c +++ b/src/launch/test-config.c @@ -9,6 +9,7 @@ #include "launch/config.h" #include "launch/nss-cache.h" #include "util/dirwatch.h" +#include "util/syscall.h" static const char *test_type2str[_CONFIG_NODE_N] = { [CONFIG_NODE_BUSCONFIG] = "busconfig", @@ -35,12 +36,23 @@ static const char *test_type2str[_CONFIG_NODE_N] = { [CONFIG_NODE_ASSOCIATE] = "associate", }; -static void print_config(const char *path) { +static int config_memfd(const char *data) { + ssize_t n; + int fd; + + fd = syscall_memfd_create("dbus-broker-test-config", 0); + c_assert(fd >= 0); + n = write(fd, data, strlen(data)); + c_assert(n == (ssize_t)strlen(data)); + + return fd; +} + +static int parse_config(ConfigRoot **rootp, const char *path) { _c_cleanup_(config_parser_deinit) ConfigParser parser = CONFIG_PARSER_NULL(parser); _c_cleanup_(config_root_freep) ConfigRoot *root = NULL; _c_cleanup_(nss_cache_deinit) NSSCache nss_cache = NSS_CACHE_INIT; _c_cleanup_(dirwatch_freep) Dirwatch *dirwatch = NULL; - ConfigNode *i_node; int r; r = dirwatch_new(&dirwatch); @@ -49,6 +61,32 @@ static void print_config(const char *path) { config_parser_init(&parser); r = config_parser_read(&parser, &root, path, &nss_cache, dirwatch); + if (r) + return r; + + *rootp = root; + root = NULL; + return 0; +} + +static int parse_config_inline(ConfigRoot **rootp, const char *data) { + _c_cleanup_(c_closep) int fd = -1; + _c_cleanup_(c_freep) char *path = NULL; + int r; + + fd = config_memfd(data); + r = asprintf(&path, "/proc/self/fd/%d", fd); + c_assert(r > 0); + + return parse_config(rootp, path); +} + +static void print_config(const char *path) { + _c_cleanup_(config_root_freep) ConfigRoot *root = NULL; + ConfigNode *i_node; + int r; + + r = parse_config(&root, path); c_assert(!r); c_list_for_each_entry(i_node, &root->node_list, root_link) { @@ -56,18 +94,65 @@ static void print_config(const char *path) { } } -static void test_config(void) { +static void test_config_base(void) { _c_cleanup_(config_parser_deinit) ConfigParser parser = CONFIG_PARSER_NULL(parser); config_parser_init(&parser); config_parser_deinit(&parser); } +static void test_config_sample0(void) { + _c_cleanup_(config_root_freep) ConfigRoot *root = NULL; + const char *data; + int r; + + data = +" \ +\ +\ + \ + \ + \ + \ + \ + "; + + r = parse_config_inline(&root, data); + c_assert(r == CONFIG_E_INVALID); +} + +static void test_config_sample1(void) { + _c_cleanup_(config_root_freep) ConfigRoot *root = NULL; + const char *data; + int r; + + data = +" \ +\ +\ + \ + \ + \ + \ + \ + \ +"; + + r = parse_config_inline(&root, data); + c_assert(r == CONFIG_E_INVALID); +} + int main(int argc, char **argv) { - if (argc < 2) - test_config(); - else + if (argc > 1) { print_config(argv[1]); + return 0; + } + + test_config_base(); + test_config_sample0(); + test_config_sample1(); return 0; }