Blob Blame History Raw
From 33e0595b1c7cf8fa0e7ca3a353f4380c1307dc25 Mon Sep 17 00:00:00 2001
From: David Rheinsberg <david.rheinsberg@gmail.com>
Date: Thu, 5 May 2022 10:50:31 +0200
Subject: [PATCH] test-config: add tests for some config samples

Add infrastructure to easily parse config-samples in our test. This
allows us to add any reports about broken configurations easily, and
making sure we will not run into the same issues again.

Signed-off-by: David Rheinsberg <david.rheinsberg@gmail.com>
---
 src/launch/test-config.c | 97 +++++++++++++++++++++++++++++++++++++---
 1 file changed, 91 insertions(+), 6 deletions(-)

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 =
+"<?xml version=\"1.0\"?> <!--*-nxml-*-->\
+<!DOCTYPE g PUBLIC \"-/N\"\
+	\"htt\">\
+<busconfig>\
+	<policy user=\"root\">\
+		<allow own_prefix=\"oramd\"/>\
+		<allow send_interface=\"d\"/>\
+	</policy>\
+		<user ix=\"d\"/>\
+	</cy>";
+
+        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 =
+"<?xml version=\"1.0\"?> <!--*-nxml-*-->\
+<!DOCTYPE g PUBLIC \"-/N\"\
+	\"htt\">\
+<busconfig>\
+	<policy user=\"root\">\
+		<allow own_prefix=\"oramd\"/>\
+		<allow send_interface=\"d\"/>\
+	</policy>\
+	<policy context=\"default\"/>		<user ix=\"d\"/>\
+	</policy>\
+</busconfig>";
+
+        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;
 }