tree-wide: reject unknown flags
authorDaniel Mack <daniel@zonque.org>
Wed, 8 Oct 2014 10:42:07 +0000 (12:42 +0200)
committerDaniel Mack <daniel@zonque.org>
Wed, 8 Oct 2014 15:29:58 +0000 (17:29 +0200)
After further discussion, we concluded that we need to be strict on
the checking of flags and reject everything that we don't know.

If we eventually need more flags, we have to deal with feature
negotiation.

Signed-off-by: Daniel Mack <daniel@zonque.org>
connection.c
handle.c
match.c
message.c
names.c

index 8c0d2b4043cf21f278a04805ed5816ea206a339c..daccdabda0075b2362cf62ca0ac28d1c40348ea2 100644 (file)
@@ -220,6 +220,12 @@ int kdbus_cmd_msg_recv(struct kdbus_conn *conn,
        struct kdbus_queue_entry *entry = NULL;
        int ret;
 
+       /* Reject unknown flags */
+       if (recv->flags & ~(KDBUS_RECV_PEEK |
+                           KDBUS_RECV_DROP |
+                           KDBUS_RECV_USE_PRIORITY))
+               return -EOPNOTSUPP;
+
        if (recv->offset > 0)
                return -EINVAL;
 
@@ -1169,6 +1175,9 @@ int kdbus_cmd_conn_info(struct kdbus_conn *conn,
        int ret = 0;
        u64 flags;
 
+       if (cmd_info->flags & ~_KDBUS_ATTACH_ALL)
+               return -EOPNOTSUPP;
+
        if (cmd_info->id == 0) {
                const char *name;
 
@@ -1298,6 +1307,9 @@ int kdbus_cmd_conn_update(struct kdbus_conn *conn,
        u64 attach_flags;
        int ret;
 
+       if (cmd->flags != 0)
+               return -EOPNOTSUPP;
+
        KDBUS_ITEMS_FOREACH(item, cmd->items, KDBUS_ITEMS_SIZE(cmd, items)) {
                switch (item->type) {
                case KDBUS_ITEM_ATTACH_FLAGS:
@@ -1371,6 +1383,13 @@ int kdbus_conn_new(struct kdbus_ep *ep,
 
        BUG_ON(*c);
 
+       /* Reject unknown flags */
+       if (hello->conn_flags & ~(KDBUS_HELLO_ACCEPT_FD |
+                                 KDBUS_HELLO_ACTIVATOR |
+                                 KDBUS_HELLO_POLICY_HOLDER |
+                                 KDBUS_HELLO_MONITOR))
+               return -EOPNOTSUPP;
+
        is_monitor = hello->conn_flags & KDBUS_HELLO_MONITOR;
        is_activator = hello->conn_flags & KDBUS_HELLO_ACTIVATOR;
        is_policy_holder = hello->conn_flags & KDBUS_HELLO_POLICY_HOLDER;
index 95bfea875cc2bb129fe06b414a7fb65dd5afa658..99bd10651de40dadceda46e7b5c2beefaeb5c793 100644 (file)
--- a/handle.c
+++ b/handle.c
@@ -314,6 +314,13 @@ static long kdbus_handle_ioctl_control(struct file *file, unsigned int cmd,
                        break;
                }
 
+               /* Reject unknown flags */
+               if (make->flags & ~(KDBUS_MAKE_ACCESS_GROUP |
+                                   KDBUS_MAKE_ACCESS_WORLD)) {
+                       ret = -EOPNOTSUPP;
+                       break;
+               }
+
                if (make->flags & KDBUS_MAKE_ACCESS_WORLD) {
                        mode = 0666;
                } else if (make->flags & KDBUS_MAKE_ACCESS_GROUP) {
@@ -371,6 +378,13 @@ static long kdbus_handle_ioctl_control(struct file *file, unsigned int cmd,
                        break;
                }
 
+               /* Reject unknown flags */
+               if (make->flags & ~(KDBUS_MAKE_ACCESS_GROUP |
+                                   KDBUS_MAKE_ACCESS_WORLD)) {
+                       ret = -EOPNOTSUPP;
+                       break;
+               }
+
                if (make->flags & KDBUS_MAKE_ACCESS_WORLD)
                        mode = 0666;
 
@@ -452,6 +466,9 @@ static long kdbus_handle_ioctl_ep(struct file *file, unsigned int cmd,
                } else if (make->flags & KDBUS_MAKE_ACCESS_GROUP) {
                        mode = 0660;
                        gid = current_fsgid();
+               } else if (make->flags) {
+                       ret = -EOPNOTSUPP;
+                       break;
                }
 
                /* custom endpoints always have a policy db */
@@ -835,6 +852,9 @@ static long kdbus_handle_ioctl_ep_connected(struct file *file, unsigned int cmd,
                if (ret < 0)
                        break;
 
+               if (cmd_cancel.flags != 0)
+                       return -EOPNOTSUPP;
+
                ret = kdbus_cmd_msg_cancel(conn, cmd_cancel.cookie);
                break;
        }
@@ -853,6 +873,9 @@ static long kdbus_handle_ioctl_ep_connected(struct file *file, unsigned int cmd,
                if (ret < 0)
                        break;
 
+               if (cmd_free.flags != 0)
+                       return -EOPNOTSUPP;
+
                ret = kdbus_pool_release_offset(conn->pool, cmd_free.offset);
                break;
        }
diff --git a/match.c b/match.c
index 689c0e236fee22880939f29222a62b6f5044ef4b..c3296ba72ac581f5c0000e302c351ef42f738650 100644 (file)
--- a/match.c
+++ b/match.c
@@ -372,6 +372,9 @@ int kdbus_match_db_add(struct kdbus_conn *conn,
 
        lockdep_assert_held(conn);
 
+       if (cmd->flags != 0)
+               return -EOPNOTSUPP;
+
        entry = kzalloc(sizeof(*entry), GFP_KERNEL);
        if (!entry) {
                ret = -ENOMEM;
@@ -514,6 +517,9 @@ int kdbus_match_db_remove(struct kdbus_conn *conn,
 
        lockdep_assert_held(conn);
 
+       if (cmd->flags != 0)
+               return -EOPNOTSUPP;
+
        mutex_lock(&db->entries_lock);
        ret = __kdbus_match_db_remove_unlocked(db, cmd->cookie);
        mutex_unlock(&db->entries_lock);
index 7dd3711d2f1f5b336e4ce76577179905c6b52f2b..83ea5ae6c68854c2351e9a8ada9c58376db59b52 100644 (file)
--- a/message.c
+++ b/message.c
@@ -304,6 +304,14 @@ int kdbus_kmsg_new_from_user(struct kdbus_conn *conn,
                goto exit_free;
        }
 
+       /* Reject unknown flags */
+       if (m->msg.flags & ~(KDBUS_MSG_FLAGS_EXPECT_REPLY |
+                            KDBUS_MSG_FLAGS_SYNC_REPLY |
+                            KDBUS_MSG_FLAGS_NO_AUTO_START)) {
+               ret = -EOPNOTSUPP;
+               goto exit_free;
+       }
+
        if (m->msg.flags & KDBUS_MSG_FLAGS_EXPECT_REPLY) {
                /* requests for replies need a timeout */
                if (m->msg.timeout_ns == 0) {
diff --git a/names.c b/names.c
index 91849e35f42f88de293eacb8329cc978a10cbec4..86c13734241f5de6066a24ec87323323267ff5c7 100644 (file)
--- a/names.c
+++ b/names.c
@@ -642,6 +642,11 @@ int kdbus_cmd_name_acquire(struct kdbus_name_registry *reg,
        const char *name;
        int ret;
 
+       if (cmd->flags & ~(KDBUS_NAME_REPLACE_EXISTING |
+                          KDBUS_NAME_ALLOW_REPLACEMENT |
+                          KDBUS_NAME_QUEUE))
+               return -EOPNOTSUPP;
+
        if (conn->name_count > KDBUS_CONN_MAX_NAMES)
                return -E2BIG;
 
@@ -675,6 +680,9 @@ int kdbus_cmd_name_release(struct kdbus_name_registry *reg,
        int ret;
        const char *name;
 
+       if (cmd->flags != 0)
+               return -EOPNOTSUPP;
+
        ret = kdbus_items_get_str(cmd->items, KDBUS_ITEMS_SIZE(cmd, items),
                                  KDBUS_ITEM_NAME, &name);
        if (ret < 0)
@@ -859,6 +867,13 @@ int kdbus_cmd_name_list(struct kdbus_name_registry *reg,
 
        policy_db = &conn->ep->policy_db;
 
+       /* Reject unknown flags */
+       if (cmd->flags & ~(KDBUS_NAME_LIST_UNIQUE |
+                          KDBUS_NAME_LIST_NAMES |
+                          KDBUS_NAME_LIST_ACTIVATORS |
+                          KDBUS_NAME_LIST_QUEUED))
+               return -EOPNOTSUPP;
+
        /* lock order: domain -> bus -> ep -> names -> conn */
        down_read(&conn->bus->conn_rwlock);
        down_read(&reg->rwlock);