lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-Id: <1438958196-23036-5-git-send-email-daniel@zonque.org>
Date:	Fri,  7 Aug 2015 16:36:36 +0200
From:	Daniel Mack <daniel@...que.org>
To:	gregkh@...uxfoundation.org
Cc:	dh.herrmann@...il.com, tixxdz@...ndz.org, teg@...m.no,
	linux-kernel@...r.kernel.org, Daniel Mack <daniel@...que.org>
Subject: [PATCH 4/4] kdbus: selftests: add more name registry tests

Add some more code for testing the name registry state. This can now be used
to track the state of queued names and per-name queing settings.

Also add new tests to check the newly added KDBUS_NAME_PRIMARY and
KDBUS_NAME_ACQUIRED flags and name takeovers.

Signed-off-by: Daniel Mack <daniel@...que.org>
---
 tools/testing/selftests/kdbus/kdbus-test.c |   6 ++
 tools/testing/selftests/kdbus/kdbus-test.h |   1 +
 tools/testing/selftests/kdbus/test-names.c | 133 +++++++++++++++++++++++------
 3 files changed, 112 insertions(+), 28 deletions(-)

diff --git a/tools/testing/selftests/kdbus/kdbus-test.c b/tools/testing/selftests/kdbus/kdbus-test.c
index db732e5..db57381 100644
--- a/tools/testing/selftests/kdbus/kdbus-test.c
+++ b/tools/testing/selftests/kdbus/kdbus-test.c
@@ -118,6 +118,12 @@ static const struct kdbus_test tests[] = {
 		.flags	= TEST_CREATE_BUS | TEST_CREATE_CONN,
 	},
 	{
+		.name	= "name-takeover",
+		.desc	= "takeover of names",
+		.func	= kdbus_test_name_takeover,
+		.flags	= TEST_CREATE_BUS | TEST_CREATE_CONN,
+	},
+	{
 		.name	= "message-basic",
 		.desc	= "basic message handling",
 		.func	= kdbus_test_message_basic,
diff --git a/tools/testing/selftests/kdbus/kdbus-test.h b/tools/testing/selftests/kdbus/kdbus-test.h
index a5c6ae8..ee937f9 100644
--- a/tools/testing/selftests/kdbus/kdbus-test.h
+++ b/tools/testing/selftests/kdbus/kdbus-test.h
@@ -72,6 +72,7 @@ int kdbus_test_monitor(struct kdbus_test_env *env);
 int kdbus_test_name_basic(struct kdbus_test_env *env);
 int kdbus_test_name_conflict(struct kdbus_test_env *env);
 int kdbus_test_name_queue(struct kdbus_test_env *env);
+int kdbus_test_name_takeover(struct kdbus_test_env *env);
 int kdbus_test_policy(struct kdbus_test_env *env);
 int kdbus_test_policy_ns(struct kdbus_test_env *env);
 int kdbus_test_policy_priv(struct kdbus_test_env *env);
diff --git a/tools/testing/selftests/kdbus/test-names.c b/tools/testing/selftests/kdbus/test-names.c
index 9217465..e400dc8 100644
--- a/tools/testing/selftests/kdbus/test-names.c
+++ b/tools/testing/selftests/kdbus/test-names.c
@@ -17,44 +17,68 @@
 #include "kdbus-enum.h"
 #include "kdbus-test.h"
 
-static int conn_is_name_owner(const struct kdbus_conn *conn,
-			      const char *needle)
+struct test_name {
+	const char *name;
+	__u64 owner_id;
+	__u64 flags;
+};
+
+static bool conn_test_names(const struct kdbus_conn *conn,
+			    const struct test_name *tests,
+			    unsigned int n_tests)
 {
-	struct kdbus_cmd_list cmd_list = { .size = sizeof(cmd_list) };
+	struct kdbus_cmd_list cmd_list = {};
 	struct kdbus_info *name, *list;
-	bool found = false;
+	unsigned int i;
 	int ret;
 
-	cmd_list.flags = KDBUS_LIST_NAMES;
+	cmd_list.size = sizeof(cmd_list);
+	cmd_list.flags = KDBUS_LIST_NAMES |
+			 KDBUS_LIST_ACTIVATORS |
+			 KDBUS_LIST_QUEUED;
 
 	ret = kdbus_cmd_list(conn->fd, &cmd_list);
 	ASSERT_RETURN(ret == 0);
 
 	list = (struct kdbus_info *)(conn->buf + cmd_list.offset);
-	KDBUS_FOREACH(name, list, cmd_list.list_size) {
-		struct kdbus_item *item;
-		const char *n = NULL;
 
-		KDBUS_ITEM_FOREACH(item, name, items) {
-			if (item->type == KDBUS_ITEM_OWNED_NAME) {
-				n = item->name.name;
+	for (i = 0; i < n_tests; i++) {
+		const struct test_name *t = tests + i;
+		bool found = false;
+
+		KDBUS_FOREACH(name, list, cmd_list.list_size) {
+			struct kdbus_item *item;
 
-				if (name->id == conn->id &&
-				    n && strcmp(needle, n) == 0) {
+			KDBUS_ITEM_FOREACH(item, name, items) {
+				if (item->type != KDBUS_ITEM_OWNED_NAME ||
+				    strcmp(item->name.name, t->name) != 0)
+					continue;
+
+				if (t->owner_id == name->id &&
+				    t->flags == item->name.flags) {
 					found = true;
 					break;
 				}
 			}
 		}
 
-		if (found)
-			break;
+		if (!found)
+			return false;
 	}
 
-	ret = kdbus_free(conn, cmd_list.offset);
-	ASSERT_RETURN(ret == 0);
+	return true;
+}
+
+static bool conn_is_name_primary_owner(const struct kdbus_conn *conn,
+				       const char *needle)
+{
+	struct test_name t = {
+		.name = needle,
+		.owner_id = conn->id,
+		.flags = KDBUS_NAME_PRIMARY,
+	};
 
-	return found ? 0 : -1;
+	return conn_test_names(conn, &t, 1);
 }
 
 int kdbus_test_name_basic(struct kdbus_test_env *env)
@@ -90,15 +114,15 @@ int kdbus_test_name_basic(struct kdbus_test_env *env)
 	ret = kdbus_name_acquire(env->conn, name, NULL);
 	ASSERT_RETURN(ret == 0);
 
-	ret = conn_is_name_owner(env->conn, name);
-	ASSERT_RETURN(ret == 0);
+	ret = conn_is_name_primary_owner(env->conn, name);
+	ASSERT_RETURN(ret == true);
 
 	/* ... and release it again */
 	ret = kdbus_name_release(env->conn, name);
 	ASSERT_RETURN(ret == 0);
 
-	ret = conn_is_name_owner(env->conn, name);
-	ASSERT_RETURN(ret != 0);
+	ret = conn_is_name_primary_owner(env->conn, name);
+	ASSERT_RETURN(ret == false);
 
 	/* check that we can't release it again */
 	ret = kdbus_name_release(env->conn, name);
@@ -140,8 +164,8 @@ int kdbus_test_name_conflict(struct kdbus_test_env *env)
 	ret = kdbus_name_acquire(env->conn, name, NULL);
 	ASSERT_RETURN(ret == 0);
 
-	ret = conn_is_name_owner(env->conn, name);
-	ASSERT_RETURN(ret == 0);
+	ret = conn_is_name_primary_owner(env->conn, name);
+	ASSERT_RETURN(ret == true);
 
 	/* check that we also can't acquire it again from the 2nd connection */
 	ret = kdbus_name_acquire(conn, name, NULL);
@@ -155,13 +179,14 @@ int kdbus_test_name_conflict(struct kdbus_test_env *env)
 int kdbus_test_name_queue(struct kdbus_test_env *env)
 {
 	struct kdbus_conn *conn;
+	struct test_name t[2];
 	const char *name;
 	uint64_t flags;
 	int ret;
 
 	name = "foo.bla.blaz";
 
-	flags = KDBUS_NAME_ALLOW_REPLACEMENT;
+	flags = 0;
 
 	/* create a 2nd connection */
 	conn = kdbus_hello(env->buspath, 0, NULL, 0);
@@ -172,8 +197,8 @@ int kdbus_test_name_queue(struct kdbus_test_env *env)
 	ret = kdbus_name_acquire(env->conn, name, &flags);
 	ASSERT_RETURN(ret == 0);
 
-	ret = conn_is_name_owner(env->conn, name);
-	ASSERT_RETURN(ret == 0);
+	ret = conn_is_name_primary_owner(env->conn, name);
+	ASSERT_RETURN(ret == true);
 
 	/* queue the 2nd connection as waiting owner */
 	flags = KDBUS_NAME_QUEUE;
@@ -181,14 +206,66 @@ int kdbus_test_name_queue(struct kdbus_test_env *env)
 	ASSERT_RETURN(ret == 0);
 	ASSERT_RETURN(flags & KDBUS_NAME_IN_QUEUE);
 
+	t[0].name = name;
+	t[0].owner_id = env->conn->id;
+	t[0].flags = KDBUS_NAME_PRIMARY;
+	t[1].name = name;
+	t[1].owner_id = conn->id;
+	t[1].flags = KDBUS_NAME_QUEUE | KDBUS_NAME_IN_QUEUE;
+	ret = conn_test_names(conn, t, 2);
+	ASSERT_RETURN(ret == true);
+
 	/* release name from 1st connection */
 	ret = kdbus_name_release(env->conn, name);
 	ASSERT_RETURN(ret == 0);
 
 	/* now the name should be owned by the 2nd connection */
-	ret = conn_is_name_owner(conn, name);
+	t[0].name = name;
+	t[0].owner_id = conn->id;
+	t[0].flags = KDBUS_NAME_PRIMARY | KDBUS_NAME_QUEUE;
+	ret = conn_test_names(conn, t, 1);
+	ASSERT_RETURN(ret == true);
+
+	kdbus_conn_free(conn);
+
+	return TEST_OK;
+}
+
+int kdbus_test_name_takeover(struct kdbus_test_env *env)
+{
+	struct kdbus_conn *conn;
+	struct test_name t;
+	const char *name;
+	uint64_t flags;
+	int ret;
+
+	name = "foo.bla.blaz";
+
+	flags = KDBUS_NAME_ALLOW_REPLACEMENT;
+
+	/* create a 2nd connection */
+	conn = kdbus_hello(env->buspath, 0, NULL, 0);
+	ASSERT_RETURN(conn != NULL);
+
+	/* acquire name for 1st connection */
+	ret = kdbus_name_acquire(env->conn, name, &flags);
 	ASSERT_RETURN(ret == 0);
 
+	t.name = name;
+	t.owner_id = env->conn->id;
+	t.flags = KDBUS_NAME_ALLOW_REPLACEMENT | KDBUS_NAME_PRIMARY;
+	ret = conn_test_names(conn, &t, 1);
+	ASSERT_RETURN(ret == true);
+
+	/* now steal name with 2nd connection */
+	flags = KDBUS_NAME_REPLACE_EXISTING;
+	ret = kdbus_name_acquire(conn, name, &flags);
+	ASSERT_RETURN(ret == 0);
+	ASSERT_RETURN(flags & KDBUS_NAME_ACQUIRED);
+
+	ret = conn_is_name_primary_owner(conn, name);
+	ASSERT_RETURN(ret == true);
+
 	kdbus_conn_free(conn);
 
 	return TEST_OK;
-- 
2.4.3

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ