names: Fix KDBUS_NAME_IN_QUEUE flag in kdbus_name_acquire()
authorLukasz Skalski <l.skalski@partner.samsung.com>
Mon, 16 Dec 2013 14:43:41 +0000 (15:43 +0100)
committerKay Sievers <kay@vrfy.org>
Mon, 16 Dec 2013 16:31:58 +0000 (17:31 +0100)
names.c
names.h
test/test-kdbus.c

diff --git a/names.c b/names.c
index a389e60fdc9479ccdc66be1836abb60641c255b2..fa9ebcd16b5d23c7ad7b45b6120e0ff086197554 100644 (file)
--- a/names.c
+++ b/names.c
@@ -264,7 +264,7 @@ struct kdbus_name_entry *kdbus_name_lookup(struct kdbus_name_registry *reg,
        return e;
 }
 
-static int kdbus_name_queue_conn(struct kdbus_conn *conn, u64 flags,
+static int kdbus_name_queue_conn(struct kdbus_conn *conn, u64 *flags,
                                 struct kdbus_name_entry *e)
 {
        struct kdbus_name_queue_item *q;
@@ -274,10 +274,11 @@ static int kdbus_name_queue_conn(struct kdbus_conn *conn, u64 flags,
                return -ENOMEM;
 
        q->conn = conn;
-       q->flags = flags;
+       q->flags = *flags;
 
        list_add_tail(&q->entry_entry, &e->queue_list);
        list_add_tail(&q->conn_entry, &conn->names_queue_list);
+       *flags |= KDBUS_NAME_IN_QUEUE;
 
        return 0;
 }
@@ -285,7 +286,7 @@ static int kdbus_name_queue_conn(struct kdbus_conn *conn, u64 flags,
 /* called with entries_lock held */
 static int kdbus_name_handle_takeover(struct kdbus_name_registry *reg,
                                      struct kdbus_conn *conn,
-                                     struct kdbus_name_entry *e, u64 flags,
+                                     struct kdbus_name_entry *e, u64 *flags,
                                      struct list_head *notify_list)
 {
        int ret;
@@ -299,13 +300,13 @@ static int kdbus_name_handle_takeover(struct kdbus_name_registry *reg,
 
        kdbus_notify_name_change(KDBUS_ITEM_NAME_CHANGE,
                                 e->conn->id, conn->id,
-                                e->flags, flags,
+                                e->flags, *flags,
                                 e->name, notify_list);
 
        /* hand over ownership */
        kdbus_name_entry_remove_owner(e);
        kdbus_name_entry_set_owner(e, conn);
-       e->flags = flags;
+       e->flags = *flags;
 
        return 0;
 }
@@ -373,7 +374,7 @@ bool kdbus_name_is_valid(const char *p)
  */
 int kdbus_name_acquire(struct kdbus_name_registry *reg,
                       struct kdbus_conn *conn,
-                      const char *name, u64 flags,
+                      const char *name, u64 *flags,
                       struct kdbus_name_entry **entry)
 {
        struct kdbus_name_entry *e = NULL;
@@ -406,7 +407,7 @@ int kdbus_name_acquire(struct kdbus_name_registry *reg,
                }
 
                /* take over the name if both parties agree */
-               if ((flags & KDBUS_NAME_REPLACE_EXISTING) &&
+               if ((*flags & KDBUS_NAME_REPLACE_EXISTING) &&
                    (e->flags & KDBUS_NAME_ALLOW_REPLACEMENT)) {
                        ret = kdbus_name_handle_takeover(reg, conn, e, flags,
                                                         &notify_list);
@@ -414,7 +415,7 @@ int kdbus_name_acquire(struct kdbus_name_registry *reg,
                }
 
                /* add it to the queue waiting for the name */
-               if (flags & KDBUS_NAME_QUEUE) {
+               if (*flags & KDBUS_NAME_QUEUE) {
                        ret = kdbus_name_queue_conn(conn, flags, e);
                        goto exit_unlock;
                }
@@ -440,10 +441,10 @@ int kdbus_name_acquire(struct kdbus_name_registry *reg,
 
        if (conn->flags & KDBUS_HELLO_ACTIVATOR) {
                e->activator = kdbus_conn_ref(conn);
-               flags = KDBUS_NAME_ACTIVATOR;
+               *flags = KDBUS_NAME_ACTIVATOR;
        }
 
-       e->flags = flags;
+       e->flags = *flags;
        INIT_LIST_HEAD(&e->queue_list);
        hash_add(reg->entries_hash, &e->hentry, hash);
        kdbus_name_entry_set_owner(e, conn);
@@ -538,7 +539,7 @@ int kdbus_cmd_name_acquire(struct kdbus_name_registry *reg,
        }
 
        ret = kdbus_name_acquire(reg, conn, cmd_name->name,
-                                cmd_name->flags, &e);
+                                &cmd_name->flags, &e);
        if (ret < 0)
                goto exit_unref_conn;
 
diff --git a/names.h b/names.h
index d81a5709ba22cd0ac05b14f220d897fd12789ffd..98a81042841fbc168b45271c8c3c7d36f8b4c91d 100644 (file)
--- a/names.h
+++ b/names.h
@@ -50,7 +50,7 @@ void kdbus_name_registry_free(struct kdbus_name_registry *reg);
 
 int kdbus_name_acquire(struct kdbus_name_registry *reg,
                       struct kdbus_conn *conn,
-                      const char *name, u64 flags,
+                      const char *name, u64 *flags,
                       struct kdbus_name_entry **entry);
 int kdbus_cmd_name_acquire(struct kdbus_name_registry *reg,
                           struct kdbus_conn *conn,
index 94d346f3b2f3b91d9f2a77810634ff5288268117..9cd4a0cc163b5477a21d6046f3980d49084c1bc2 100644 (file)
@@ -545,7 +545,7 @@ static int check_name_queue(struct kdbus_check_env *env)
        ret = ioctl(conn->fd, KDBUS_CMD_NAME_ACQUIRE, cmd_name);
        ASSERT_RETURN(ret == 0);
 
-       ASSERT_RETURN(cmd_name->flags & KDBUS_NAME_QUEUE);
+       ASSERT_RETURN(cmd_name->flags & KDBUS_NAME_IN_QUEUE);
 
        /* release name from 1st connection */
        cmd_name->flags = 0;