platform/core/system/kdbus-bus.git
10 years agonames: check if name is valid for CMD_NAME_ACQUIRE and CMD_NAME_RELEASE
Djalal Harouni [Fri, 24 Oct 2014 22:11:49 +0000 (23:11 +0100)]
names: check if name is valid for CMD_NAME_ACQUIRE and CMD_NAME_RELEASE

Signed-off-by: Djalal Harouni <tixxdz@opendz.org>
10 years agokdbus.h: fix kernel doc
Lukasz Skalski [Fri, 24 Oct 2014 10:18:12 +0000 (12:18 +0200)]
kdbus.h: fix kernel doc

10 years agoconnection: keep SYNC messages alive on EINTR
David Herrmann [Thu, 23 Oct 2014 13:11:43 +0000 (15:11 +0200)]
connection: keep SYNC messages alive on EINTR

If a SYNC-SEND is interrupted by a signal, there is no way we can restart
the syscall. If we returned ERESTARTSYS, we'd queue the message again on
restart. This is very irritating, therefore, we never support restarting
syscalls. Instead, we return EINPROGRESS if the message was queued but no
reply was received, yet.

Internally, we turn the 'sync' reply_wait into an 'async' reply. This way,
it will be treated the same way as any other asynchronous reply.

Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
10 years agoconnection: dont leak sync replies
David Herrmann [Thu, 23 Oct 2014 12:15:14 +0000 (14:15 +0200)]
connection: dont leak sync replies

If a timeout occurs before we can queue a reply to a message, we might
queue it _after_ the sync caller already returned and dropped its ref.
Avoid this by using the 'waiting' flag to sync between sender and
receiver.

Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
10 years agoconnection: make sure to delete reply_wake entries
David Herrmann [Thu, 23 Oct 2014 12:02:55 +0000 (14:02 +0200)]
connection: make sure to delete reply_wake entries

If we reply to a pending method call, we must make sure to only allow a
single connection to respond. Therefore, unqueue reply_wake entries
unconditionally after we allowed a single call to pass through.

Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
10 years agoconnection: hold conn_reply ref on reply_wake
David Herrmann [Thu, 23 Oct 2014 12:01:03 +0000 (14:01 +0200)]
connection: hold conn_reply ref on reply_wake

We pass reply_wake around without holding any locks. It might get
destructed by parallel timeouts of other replies that are faster than we
are. Make sure we hold a reference to avoid those races.

Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
10 years agoconnection: make conn_reply ref-counted
David Herrmann [Thu, 23 Oct 2014 11:56:35 +0000 (13:56 +0200)]
connection: make conn_reply ref-counted

conn_reply objects are used all over the place. We often pass pointers
around without actually holding the parent lock. They might get destructed
while we use it. To avoid this, make it ref-counted so there's no need to
constantly hold locks..

Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
10 years agoconnection: conn_add_expected_reply -> conn_reply_new
David Herrmann [Thu, 23 Oct 2014 11:49:00 +0000 (13:49 +0200)]
connection: conn_add_expected_reply -> conn_reply_new

Rename kdbus_conn_add_expected_reply() to kdbus_conn_reply_new(). The
function no longer adds replies but only allocates them. No reason to keep
the old name.

Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
10 years agoconnection: dont leak replies if message-queueing fails
David Herrmann [Thu, 23 Oct 2014 11:30:13 +0000 (13:30 +0200)]
connection: dont leak replies if message-queueing fails

Currently, we queue the conn_reply _before_ queueing the actual message.
This might leak conn_reply objects if we cannot queue the message. Avoid
this by queuing the conn_reply object at the same time we queue the
message.

Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
10 years agoconnection: correctly filter messages on name takeover
David Herrmann [Thu, 23 Oct 2014 10:53:41 +0000 (12:53 +0200)]
connection: correctly filter messages on name takeover

If a name is taken over by an activator, we move messages that were
targetted at the this exact name over. However, we must make sure to leave
all other messages correctly queued on the source, so it can continue
using other names it might posess.

This fixes the filtering we apply on the messages itself, to no longer
leak them. Furthermore, it also applies proper filtering to the conn_reply
objects, so only matching objects are moved.

Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
10 years agoconnection: rename reply->conn to reply->reply_dst
David Herrmann [Thu, 23 Oct 2014 10:34:45 +0000 (12:34 +0200)]
connection: rename reply->conn to reply->reply_dst

reply->conn is pretty vague and I have a hard time remembering which side
of the communication it points to. Rename it to "reply_dst" so it's clear
that it points to the destination of the reply (or: origin of the call).

Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
10 years agoconnection: don't send DEAD-NOTIFICATIONS on sync SENDs
David Herrmann [Thu, 23 Oct 2014 10:20:06 +0000 (12:20 +0200)]
connection: don't send DEAD-NOTIFICATIONS on sync SENDs

If we synchronously send messages, we never queue notifications on the
sender if a timeout or reset occurs. Fix the DEAD_DESTINATION handling to
not queue such messages either.

Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
10 years agoconnection: simplify reply cleanups
David Herrmann [Thu, 23 Oct 2014 10:16:25 +0000 (12:16 +0200)]
connection: simplify reply cleanups

There is no reason why we cannot destroy replies while holding a
connection lock. If the reply points to the connection whose lock we hold,
we also have another ref on that connection due to our context. If the
lock points to another connection, we can simply unref it at any time.

Note that we never cause disconnects on the connection. We only unref it!
The object destruction is a simple memory cleanup. Nothing fancy is done
there, and no inter-object refs can exist anymore (otherwise, it would not
get freed). Therefore, fix all our callers to free replies directly,
instead of releasing the locks first.

Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
10 years agotest-fd: make sure that passed fds do not also allow fd queueing
Djalal Harouni [Wed, 22 Oct 2014 19:44:23 +0000 (20:44 +0100)]
test-fd: make sure that passed fds do not also allow fd queueing

Signed-off-by: Djalal Harouni <tixxdz@opendz.org>
10 years agokdbus.h: rename kdbus_{cmd,}_conn_info → kdbus_{cmd,}_info
Daniel Mack [Wed, 22 Oct 2014 16:36:45 +0000 (18:36 +0200)]
kdbus.h: rename kdbus_{cmd,}_conn_info → kdbus_{cmd,}_info

As we now use kdbus_cmd_conn_info and kdbus_conn_info for bus creator
information as well, rename the structs to a more generic term.

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agokdbus.h: add KDBUS_CMD_BUS_CREATOR_INFO
Daniel Mack [Wed, 22 Oct 2014 16:01:19 +0000 (18:01 +0200)]
kdbus.h: add KDBUS_CMD_BUS_CREATOR_INFO

Add a call to return metadata on the task that created a bus, at the
moment it did so. The call behaves similar to KDBUS_CMD_CONN_INFO, and
shares the same dispatcher code in handle.c.

While at it, factor out bus-related test functions to their own file,
and also add some code test the new ioctl.

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agomessage: switch to fget_raw() to allow passing O_PATH file descriptors
Djalal Harouni [Wed, 22 Oct 2014 14:45:04 +0000 (15:45 +0100)]
message: switch to fget_raw() to allow passing O_PATH file descriptors

Signed-off-by: Djalal Harouni <tixxdz@opendz.org>
10 years agomessage: we want to allow O_PATHed file descriptors
Djalal Harouni [Wed, 22 Oct 2014 14:39:27 +0000 (15:39 +0100)]
message: we want to allow O_PATHed file descriptors

Signed-off-by: Djalal Harouni <tixxdz@opendz.org>
10 years agotest-fd: add a bloom filter to broadcast message
Daniel Mack [Wed, 22 Oct 2014 12:18:18 +0000 (14:18 +0200)]
test-fd: add a bloom filter to broadcast message

Satisfy a kernel check so we can be sure we really bail out due
to the check we're actually enforcing.

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agomessage: allow memfds for broadcast messages
Daniel Mack [Wed, 22 Oct 2014 12:05:39 +0000 (14:05 +0200)]
message: allow memfds for broadcast messages

As discussed on LPC.

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agoconnection: remove unused variable
Daniel Mack [Wed, 22 Oct 2014 11:49:05 +0000 (13:49 +0200)]
connection: remove unused variable

That was introduced by a wrong conflict resolution.

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agotest: just define KDBUS_SYSNAME_MAX_LEN here in test-endpoint
Djalal Harouni [Wed, 22 Oct 2014 11:41:34 +0000 (12:41 +0100)]
test: just define KDBUS_SYSNAME_MAX_LEN here in test-endpoint

Signed-off-by: Djalal Harouni <tixxdz@opendz.org>
10 years agotest: make sure that creating endpoint with long names will fail
Djalal Harouni [Wed, 22 Oct 2014 10:24:39 +0000 (11:24 +0100)]
test: make sure that creating endpoint with long names will fail

Signed-off-by: Djalal Harouni <tixxdz@opendz.org>
10 years agotest-sync: do a second recv only when SA_RESTART was passed
Djalal Harouni [Wed, 22 Oct 2014 10:22:45 +0000 (11:22 +0100)]
test-sync: do a second recv only when SA_RESTART was passed

The test was working for all cases, but fix it to only check for the
SA_RESTART case.

Signed-off-by: Djalal Harouni <tixxdz@opendz.org>
10 years agoMakefile: add 'doc' target
Daniel Mack [Wed, 22 Oct 2014 10:08:41 +0000 (12:08 +0200)]
Makefile: add 'doc' target

So easy the process of checking kernel-doc entries

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agohandle.c: fix and add kernel-doc
Daniel Mack [Wed, 22 Oct 2014 09:58:01 +0000 (11:58 +0200)]
handle.c: fix and add kernel-doc

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agoRevert "notify: set item->size"
Daniel Mack [Wed, 22 Oct 2014 09:52:04 +0000 (11:52 +0200)]
Revert "notify: set item->size"

This reverts commit b62c3ed2b7bed76935a57a9a65e7bba63602b4c4.

m->msg.items[0].size is already set from kdbus_kmsg_new(), so this
is unnecessary. Furthermode, we need to ALIGN8() the item size, which
kdbus_kmsg_new() also does for us already.

10 years agotest: use kdbus_msg_dump() to check for message integrity
Daniel Mack [Wed, 22 Oct 2014 09:49:05 +0000 (11:49 +0200)]
test: use kdbus_msg_dump() to check for message integrity

Make kdbus_msg_dump() return an error in case there's anything wrong
with the message. Return such errors from kdbus_msg_recv(). We currently
fail with notifications.

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agoconnection.c: cosmetic cleanup
Daniel Mack [Tue, 21 Oct 2014 18:52:45 +0000 (20:52 +0200)]
connection.c: cosmetic cleanup

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agoconnection: switch to absolute timeouts (API break)
Daniel Mack [Tue, 21 Oct 2014 18:23:07 +0000 (20:23 +0200)]
connection: switch to absolute timeouts (API break)

Make the timeouts in struct kdbus_msg.timeout_ns absolute.

This is necessary in order to support blocking sync calls with
SA_RESTART behavior.

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agotest-sync: implement send_reply()
Daniel Mack [Tue, 21 Oct 2014 18:17:45 +0000 (20:17 +0200)]
test-sync: implement send_reply()

Implement a new helper function to reply to pending messages.

Formerly, the test abused the timeout parameter to respond, knowing
that its value will eventually end up in the kdbus message in the
same union as the cookie_reply field.

In the process of switching to absolute timeouts, however, this bites
us, so move this hack out of the way first.

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agoconnection: drop unused variable
David Herrmann [Tue, 21 Oct 2014 20:05:44 +0000 (22:05 +0200)]
connection: drop unused variable

The 'ts' variable is no longer used. Drop it.

Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
10 years agoconnection: remove debugging printk()
David Herrmann [Tue, 21 Oct 2014 20:04:12 +0000 (22:04 +0200)]
connection: remove debugging printk()

This probably wasn't meant to be included in the commit. Remove stray
printk() debugging helper.

Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
10 years agoconnection.c: comments cleanup
Daniel Mack [Tue, 21 Oct 2014 17:56:41 +0000 (19:56 +0200)]
connection.c: comments cleanup

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agokdbus.h: split in and out flags of ioctls (ABI break)
Daniel Mack [Tue, 21 Oct 2014 17:07:14 +0000 (19:07 +0200)]
kdbus.h: split in and out flags of ioctls (ABI break)

Instead of negotating kernel flags via the same field for input and
output, use two different bitfields for that, and call the returned
flags 'kernel_flags'.

The approach implemented before didn't turn out to work too well for
more complex userspace programs that retain the same ioctl buffers
for multiple calls, and which had to manually save and restore the
flags before.

While at it, rename conn_flags → flags in kdbus_cmd_hello to ease
the internal helper functions and unify the API a bit more.

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agokdbus.h: factor out name info struct (ABI break)
Daniel Mack [Tue, 21 Oct 2014 16:59:23 +0000 (18:59 +0200)]
kdbus.h: factor out name info struct (ABI break)

Introduce struct kdbus_name_info and report information on name lists
with it, instead of (ab)using struct kdbus_cmd_name for it.

That way, we can get rid of two fields in the latter.

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agohandle: use dynamic major/minor allocation (ABI break)
David Herrmann [Tue, 21 Oct 2014 12:11:36 +0000 (14:11 +0200)]
handle: use dynamic major/minor allocation (ABI break)

Instead of requiring 1 major per domain, we now allocate major/minor
combinations dynamically. So far, only a single major is allocated during
module init, but the code can easily be extended to even make those
dynamic. However, device-cgroups require us to have a fixed major. User
space must be aware that major/minor numbers no longer have any specific
meaning. Each major/minor combination might be assigned to any domain
and/or endpoint! Apart from this semantics change, the ABI stays the same.

Furthermore, this patch reworks the kdbus_domain_new() and kdbus_ep_new()
functions to avoid races against UEVENT_ADD. Both objects must be active
before we call device_add() and thus produce UEVENT_ADD.

Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
10 years agomessage: document the verify fd and increment usage count logic
Djalal Harouni [Mon, 20 Oct 2014 20:40:35 +0000 (21:40 +0100)]
message: document the verify fd and increment usage count logic

We explicitly verify the fd and then just increment the usage counter.

Signed-off-by: Djalal Harouni <tixxdz@opendz.org>
10 years agoutil: fput files refs in reverse order
Djalal Harouni [Mon, 20 Oct 2014 20:28:42 +0000 (21:28 +0100)]
util: fput files refs in reverse order

Signed-off-by: Djalal Harouni <tixxdz@opendz.org>
10 years agomessage: minor optimization no need to pass invalid fds to fget()
Djalal Harouni [Mon, 20 Oct 2014 20:04:11 +0000 (21:04 +0100)]
message: minor optimization no need to pass invalid fds to fget()

Signed-off-by: Djalal Harouni <tixxdz@opendz.org>
10 years agotest-fd: fix the fd passing test and use KDBUS_MSG_MAX_FDS for normal fds
Djalal Harouni [Mon, 20 Oct 2014 16:57:40 +0000 (17:57 +0100)]
test-fd: fix the fd passing test and use KDBUS_MSG_MAX_FDS for normal fds

Signed-off-by: Djalal Harouni <tixxdz@opendz.org>
10 years agomessage: revert commit 65b277d6c0 since KDBUS_MSG_MAX_FDS is only for normal fds
Djalal Harouni [Mon, 20 Oct 2014 16:50:57 +0000 (17:50 +0100)]
message: revert commit 65b277d6c0 since KDBUS_MSG_MAX_FDS is only for normal fds

As noted by Daniel, the KDBUS_MSG_MAX_FDS is only for normal fds,
messages that carry payloads as memfds will be accounted against
KDBUS_MSG_MAX_ITEMS, so revert and restore the previous logic.

Signed-off-by: Djalal Harouni <tixxdz@opendz.org>
10 years agomessage: account both memfds and fds against KDBUS_MSG_MAX_FDS
Djalal Harouni [Mon, 20 Oct 2014 16:13:14 +0000 (17:13 +0100)]
message: account both memfds and fds against KDBUS_MSG_MAX_FDS

Ensure that the number of memfds and normal fds will not exceed
KDBUS_MSG_MAX_FDS per message.

Signed-off-by: Djalal Harouni <tixxdz@opendz.org>
10 years agotest-fd: add tests for fd and memfd accounting
Djalal Harouni [Mon, 20 Oct 2014 16:12:12 +0000 (17:12 +0100)]
test-fd: add tests for fd and memfd accounting

Signed-off-by: Djalal Harouni <tixxdz@opendz.org>
10 years agohandle: allocate handle after domain lookup
Daniel Mack [Mon, 20 Oct 2014 15:28:55 +0000 (17:28 +0200)]
handle: allocate handle after domain lookup

Just a small cleanup that orders memory allocation after the domain
has been looked up. That saves us an extra kfree() in the error path.

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agoTODO: remove external-API entry
David Herrmann [Mon, 20 Oct 2014 13:47:06 +0000 (15:47 +0200)]
TODO: remove external-API entry

We decided on how to handle external API compatibility:
 * unknown flags are rejected and properly overwritten by the kernel
 * unknown items have to be ignored by *BOTH* sides

Drop this entry from the TODO list.

Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
10 years agoconnection: make attach_flags atomic
David Herrmann [Mon, 20 Oct 2014 13:41:49 +0000 (15:41 +0200)]
connection: make attach_flags atomic

Instead of requiring connection locks, make conn->attach_flags a 64bit
atomic. This isn't particularly fast on archs that don't optimize
atomic64, but it simplifies the locking in kdbus. Requiring the connection
lock is just annoying. Furthermore, most 'real' archs should provide 64bit
atomics, anyway.

Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
10 years agoutil.c: degrade (valid & KDBUS_FLAG_KERNEL) to warning
Daniel Mack [Mon, 20 Oct 2014 13:29:28 +0000 (15:29 +0200)]
util.c: degrade (valid & KDBUS_FLAG_KERNEL) to warning

Don't BUG_ON(valid & KDBUS_FLAG_KERNEL), a warning is sufficient.

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agometadata: split KDBUS_ATTACH_COMM in _PID and _TID (ABI break)
Daniel Mack [Mon, 20 Oct 2014 12:39:27 +0000 (14:39 +0200)]
metadata: split KDBUS_ATTACH_COMM in _PID and _TID (ABI break)

Allow users to specify KDBUS_ATTACH_COMM_PID and KDBUS_ATTACH_COMM_TID
separately. This also makes the attachment maintainance in metdata.c
cleaner.

Users that use _KDBUS_ATTACH_ALL just need to recompile.

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agobus: make conn_rwlock a low-level lock
David Herrmann [Mon, 20 Oct 2014 13:24:15 +0000 (15:24 +0200)]
bus: make conn_rwlock a low-level lock

conn_rwlock protects the connection lists on a bus. Those lists are
usually only accessed deep down in our call-paths, so we can safely order
conn_rwlock _after_ bus->lock and ep->lock. We can even order it after
registry->lock and thus fix a dead-lock in list_names where we used to
have:
    down_read(&bus->conn_rwlock);
    down_read(&reg->rwlock);

.. which dead-locks against kmsg_send():
    kdbus_name_lock(reg); (=> down_read(&reg->rwlock))
    down_read(&bus->conn_rwlock);

The new lock-order isn't particularly beautiful, but there's currently no
way around it. We have to lock destination names on kmsg_send() to make
sure an activator does not get activated concurrently. We could lock
conn_rwlock in kmsg_send() early, but this is kinda ugly regarding
kdbus_conn_wait_reply(). Therefore, for now, lock conn_rwlock late. We can
always change the lock order again later.

Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
10 years agoconnection: split kdbus_conn_wait_reply() off kdbus_conn_kmsg_send()
David Herrmann [Mon, 20 Oct 2014 12:51:51 +0000 (14:51 +0200)]
connection: split kdbus_conn_wait_reply() off kdbus_conn_kmsg_send()

Move the helper to wait synchronously for a reply into
kdbus_conn_wait_reply(). This reduces the size of kdbus_conn_kmsg_send()
further and makes it much easier to review.

Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
10 years agoqueue: consolidate kdbus_queue_entry_*fds_install()
Daniel Mack [Mon, 20 Oct 2014 12:33:13 +0000 (14:33 +0200)]
queue: consolidate kdbus_queue_entry_*fds_install()

Combine code from kdbus_queue_entry_fds_install() and
kdbus_queue_entry_memfds_install() and make simplify the caller site.

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agomessage, queue: pin files over their entire lifetime
Daniel Mack [Mon, 20 Oct 2014 11:58:55 +0000 (13:58 +0200)]
message, queue: pin files over their entire lifetime

Make sure the passed fds and memfds are pinned throughout their usage
in kdbus, that is, until they are installed. That closes a race gap in
which a user could possibly replace an fd after submitting a message to
the kernel and the message's delivery and the fd's installation.

While at it, also move the seal check for memfds from queue.c to
message.c and introduce a method to free an array of struct file*.

Now, the incoming QA check in message.c will make sure the files are of
the correct type, memfds are sealed etc. After that, when queue entry
items are created, we call get_file() on each of the passed files to
add increase the reference count once more, and decrement them when the
entry is installed in the receiver's task.

Also, the reference taken my the kmsg are dropped from
kdbus_kmsg_free().

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agotree-wide: rework flags negotiation (ABI break)
Daniel Mack [Fri, 17 Oct 2014 11:43:14 +0000 (13:43 +0200)]
tree-wide: rework flags negotiation (ABI break)

We are obliged to reject all bits in flags fields that are not known
to the kernel. In order to let userspace know which flags the kernel
knowns about, we agreed to always write back to the flags field in the
ioctl buffer, even if the call succeeded. The kernel will, however,
will always set the KDBUS_FLAG_KERNEL bit, which consequently is always
invalid when submitted by userspace.

Move some checks from other place to handle.c, and update the testsuite
and documentation accordingly.

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agoqueue: set O_CLOEXEC on installed file descriptors
Daniel Mack [Fri, 17 Oct 2014 07:55:51 +0000 (09:55 +0200)]
queue: set O_CLOEXEC on installed file descriptors

The receiver can still opt-out for this with fcntl(), but by default,
we should really set O_CLOEXEC.

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agokdbus.h: remove features bitfield from make calls (ABI break)
Daniel Mack [Thu, 16 Oct 2014 16:12:54 +0000 (18:12 +0200)]
kdbus.h: remove features bitfield from make calls (ABI break)

After discussion in the systemd hackfest, we agreed on flags
negotiation via the flags fields, so there's no need for a bitmask
called 'features' anymore. Drop it.

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agoqueue.c: move a stack variable before the variable array
Greg Kroah-Hartman [Fri, 17 Oct 2014 08:23:27 +0000 (10:23 +0200)]
queue.c: move a stack variable before the variable array

This way the compiler doesn't have to calculate the location of the
pointer "on the fly".

Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
10 years agoRevert KDBUS_HELLO_ACCEPT_MEMFD support (ABI break)
Kay Sievers [Fri, 17 Oct 2014 08:00:35 +0000 (10:00 +0200)]
Revert KDBUS_HELLO_ACCEPT_MEMFD support (ABI break)

Memfds are a basic exchange mechanism not supposed to be
optional per connection. A per-bus flag, instead of a
per-connection one, would probably be acceptable,
but its usefulness is questionable at this point.

Broadcasts can contain memfds and we would silently messages
for such connections, which is not the expected behavior.

Receivers just need to make sure to be able to receive messages
with memfd payload, otherwise they are just not fully supporting
the common kdbus interface.

Contracts of not supporting memfds on private buses are fine,
but the general purpose communication will always require
memfds to be supported by all clients.

10 years agolimits: lower KDBUS_MSG_MAX_FDS to 253
Daniel Mack [Thu, 16 Oct 2014 10:16:56 +0000 (12:16 +0200)]
limits: lower KDBUS_MSG_MAX_FDS to 253

Lower the number of maximum file descriptors accepted as a message item
to 253. See commit bba14de98 (Linux) for the rationale behind that
number.

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agometadata: update meta->attached once the attach succeeded
Daniel Mack [Thu, 16 Oct 2014 09:57:57 +0000 (11:57 +0200)]
metadata: update meta->attached once the attach succeeded

If we fail to append metadata items, but ignore the errors on purpose
for broadcast messages, we might end up with the same metadata multiple
times if we only update meta->attached wt the end of
kdbus_meta_append().

Hence, set each bit individually once the attachment succeeded.

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agodomain: detroy IDRs
Daniel Mack [Thu, 16 Oct 2014 09:38:37 +0000 (11:38 +0200)]
domain: detroy IDRs

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agobus.c: remove unneeded include
Daniel Mack [Thu, 16 Oct 2014 09:18:44 +0000 (11:18 +0200)]
bus.c: remove unneeded include

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agonotify: set item->size
Daniel Mack [Thu, 16 Oct 2014 09:16:20 +0000 (11:16 +0200)]
notify: set item->size

Fully initialize the API. We should also have strict checking for this
on userspace.

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agodoc: document the new KDBUS_HELLO_ACCEPT_MEMFD flag
Djalal Harouni [Tue, 14 Oct 2014 21:44:37 +0000 (22:44 +0100)]
doc: document the new KDBUS_HELLO_ACCEPT_MEMFD flag

Signed-off-by: Djalal Harouni <tixxdz@opendz.org>
10 years agoconnection: use KDBUS_HELLO_ACCEPT_MEMFD to check for passed memfds
Djalal Harouni [Tue, 14 Oct 2014 21:34:50 +0000 (22:34 +0100)]
connection: use KDBUS_HELLO_ACCEPT_MEMFD to check for passed memfds

Signed-off-by: Djalal Harouni <tixxdz@opendz.org>
10 years agotest-activator: add more tests for the activation logic
Djalal Harouni [Tue, 14 Oct 2014 19:47:50 +0000 (20:47 +0100)]
test-activator: add more tests for the activation logic

Signed-off-by: Djalal Harouni <tixxdz@opendz.org>
10 years agotest-util: add test_is_capable() to check for capabilities and use it
Djalal Harouni [Tue, 14 Oct 2014 13:22:57 +0000 (14:22 +0100)]
test-util: add test_is_capable() to check for capabilities and use it

Signed-off-by: Djalal Harouni <tixxdz@opendz.org>
10 years agotest-util: move RUN_UNPRIVILEGED definitions to kdbus-util.h
Djalal Harouni [Mon, 13 Oct 2014 22:27:07 +0000 (23:27 +0100)]
test-util: move RUN_UNPRIVILEGED definitions to kdbus-util.h

Will be used by other tests

Signed-off-by: Djalal Harouni <tixxdz@opendz.org>
10 years agokdbus.h: add KDBUS_HELLO_ACCEPT_MEMFD (ABI break)
Daniel Mack [Tue, 14 Oct 2014 17:53:23 +0000 (19:53 +0200)]
kdbus.h: add KDBUS_HELLO_ACCEPT_MEMFD (ABI break)

Add another flags to the connection's flags to denote whether it
want to receive memfds. Reject messages with -ECOMM if it contains
a memfd if the receiver can't cope with it.

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agotests: strncpy() corrections
Daniel Mack [Tue, 14 Oct 2014 12:54:27 +0000 (14:54 +0200)]
tests: strncpy() corrections

Use the correct maximum size with strncpy(), even though we're using
small static strings as sources.

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agodoc: KDBUS_MSG_FLAGS_SYNC_REPLY can be interrupted by a signal delivery
Djalal Harouni [Mon, 13 Oct 2014 15:59:17 +0000 (16:59 +0100)]
doc: KDBUS_MSG_FLAGS_SYNC_REPLY can be interrupted by a signal delivery

Signed-off-by: Djalal Harouni <tixxdz@opendz.org>
10 years agotest-sync: ensure sync is interruptible and it ignors SA_RESTART flag
Djalal Harouni [Mon, 13 Oct 2014 15:41:35 +0000 (16:41 +0100)]
test-sync: ensure sync is interruptible and it ignors SA_RESTART flag

Signed-off-by: Djalal Harouni <tixxdz@opendz.org>
10 years agotest: test monitor connections for broadcast messages
Djalal Harouni [Sun, 12 Oct 2014 18:42:16 +0000 (19:42 +0100)]
test: test monitor connections for broadcast messages

Signed-off-by: Djalal Harouni <tixxdz@opendz.org>
10 years agotest-fd: ensure that broadcasting fds and memfds will fail with -ENOTUNIQ
Djalal Harouni [Sun, 12 Oct 2014 18:01:52 +0000 (19:01 +0100)]
test-fd: ensure that broadcasting fds and memfds will fail with -ENOTUNIQ

Signed-off-by: Djalal Harouni <tixxdz@opendz.org>
10 years agokdbus.txt: fix things spotted by Alban Crequy
Daniel Mack [Sun, 12 Oct 2014 15:42:44 +0000 (17:42 +0200)]
kdbus.txt: fix things spotted by Alban Crequy

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agokdbus.txt: fixes
Daniel Mack [Sun, 12 Oct 2014 14:50:03 +0000 (16:50 +0200)]
kdbus.txt: fixes

Fix issues spotted by Greg.

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agohandle: do not look at 'features' for now
Daniel Mack [Fri, 10 Oct 2014 17:08:38 +0000 (19:08 +0200)]
handle: do not look at 'features' for now

We still need to decide how we wanna handle this.

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agoMerge branch 'master' of https://code.google.com/p/d-bus
Greg Kroah-Hartman [Fri, 10 Oct 2014 03:04:41 +0000 (20:04 -0700)]
Merge branch 'master' of https://code.google.com/p/d-bus

10 years agoMerge pull request #26 from michelecurti/master
Greg Kroah-Hartman [Fri, 10 Oct 2014 03:04:58 +0000 (20:04 -0700)]
Merge pull request #26 from michelecurti/master

test: fix typo

10 years agonames: on KDBUS_CMD_NAME_RELEASE check that connection can see the name
Djalal Harouni [Thu, 9 Oct 2014 21:56:03 +0000 (22:56 +0100)]
names: on KDBUS_CMD_NAME_RELEASE check that connection can see the name

Before trying to release a name verify that the connection is able to
see the name on the endpoint, we do this since custom endpoint may
install policies to restrict SEE access if we do not perform this check,
then a connection may try KDBUS_CMD_NAME_RELEASE ioctl() and brute force
names owned by other connections, in this case it will get the
-EADDRINUSE error which indicates that the name is in use, later it can
monitor the name by re-trying the call, this way it can bypass the
notification checks that are done for
{KDBUS_ITEM_NAME_ADD|KDBUS_ITEM_NAME_REMOVE}.

The kdbus_ep_policy_check_notification() checks first if the connection
is able to see the notifications. So follow and don't leak hints from
KDBUS_CMD_NAME_RELEASE.

No need to check for OWN access, since for other connections as stated
above a name will fail with -EADDRINUSE.

Signed-off-by: Djalal Harouni <tixxdz@opendz.org>
10 years agoendpoint: add function kdbus_ep_policy_check_see_access() and use it
Djalal Harouni [Thu, 9 Oct 2014 21:51:26 +0000 (22:51 +0100)]
endpoint: add function kdbus_ep_policy_check_see_access() and use it

Add the locked version of kdbus_ep_policy_check_see_access_unlocked()
and use it where appropriate.

Signed-off-by: Djalal Harouni <tixxdz@opendz.org>
10 years agobroadcast: add TALK access checks for broadcast messages
Djalal Harouni [Thu, 9 Oct 2014 21:38:43 +0000 (22:38 +0100)]
broadcast: add TALK access checks for broadcast messages

Add code to perform broadcast access checks, we split the shared code
into two functions:
kdbus_custom_ep_check_talk_access()
kdbus_ep_has_default_talk_access()

And add kdbus_ep_policy_check_broadcast() to do the broadcast access
checks.

To perform broadcast, these rules must be satisfied:

1) Check custom endpoint policies, if it allows the TALK continue,
   otherwise block.

2) If the sender connection is a privileged connection, allow
broadcast.

3) If the sender and receiver run under the same user, allow broadcast.

4) If the sender connection owns names on the bus and if
the destination connection do not own names, allow broadcast. Otherwise
fail check the bus policy rules for these two reasons:

   * anonymous connections should not signal to other connections.
   * receivers that own names may have policies that block the TALK
     access, so do not bypass this.

  This openes the case where connections that own names may gain TALK
  access to other connections on the bus through broadcast! Yes but
  since this is the intended behaviour of signals we can't do
  otherwise. Of course as stated above if the destination owns names
  then broadcasts are subject to policy rules (we do not bypass policy
  rules).

5) If the policy rules of the default endpoint block the TALK access,
then block broadcasts, otherwise allow it.

These are the same rules that apply to TALK access and unicast checks,
the only exception is rule 4) that was introduced to allow services to
signal on the bus.

Signed-off-by: Djalal Harouni <tixxdz@opendz.org>
10 years agoconnection: make conn->name_count atomic
Djalal Harouni [Thu, 9 Oct 2014 21:26:51 +0000 (22:26 +0100)]
connection: make conn->name_count atomic

Make conn->name_count an atomic type, so it can be checked safely later
when checking that the connection does really own names.

While we are it fix another count bug in kdbus_cmd_name_acquire() now we
register a slot by increment the counter before all operations, and we
decrement it before returning, this way we do not race for names and no
need to use complex locks.

Signed-off-by: Djalal Harouni <tixxdz@opendz.org>
10 years agotest: test-policy-priv do broadcast tests after a policy holder is uploaded
Djalal Harouni [Wed, 8 Oct 2014 17:43:34 +0000 (18:43 +0100)]
test: test-policy-priv do broadcast tests after a policy holder is uploaded

Add more broadcast tests that will run after a policy holder is uploaded
on the bus.

Each test is documented. Currently we fail at these tests, next patches
will fix this.

Signed-off-by: Djalal Harouni <tixxdz@opendz.org>
10 years agotest: test-policy-priv do broadcast tests before a policy holder is uploaded
Djalal Harouni [Wed, 8 Oct 2014 09:59:17 +0000 (10:59 +0100)]
test: test-policy-priv do broadcast tests before a policy holder is uploaded

Add broadcast tests, and modify RUN_UNPRIVILEGED() so we can specify
the uid/gid of the user to drop in and run tests.

Move all the tests that check the default behaviour of the bus and
before a policy holder is uploaded to their function:
test_priv_before_policy_upload().

Each test is documented.

Signed-off-by: Djalal Harouni <tixxdz@opendz.org>
10 years agodoc: document the new broadcast behaviour
Djalal Harouni [Thu, 9 Oct 2014 19:32:00 +0000 (20:32 +0100)]
doc: document the new broadcast behaviour

Currently we do not check senders when doing broadcasts.

In order to block the following scenarios, we need to improve the
broadcast logic and check the policy rules before allowing broadcast
messages.

* Since unprivileged users can't use unicast to communicate unless a
  policy that permits this was uploaded, follow and block broadcast
  communications between unprivileged users unless a policy rule that
  allows this is satisfied.

* We do not want unprivileged connections that do not own names to
  send signals to privileged connections.

* We do not want unprivileged connections that do not own names to
  send signals to other connections that might own names.

So to achieve this and to allow broadcast messages for legitimate
scenarios, we follow the same unicast checks, and we introduce one
implicit rule to allow broadcast from connections that own names.

1) Check custom endpoint policies, if it allows the TALK continue,
otherwise block.

2) If the sender connection is a privileged connection, allow broadcast.

3) If the sender and receiver run under the same user, allow broadcast.

4) If the sender connection owns names on the bus and if the
   destination connection do not own names, allow broadcast.
   Otherwise check bus policy rules for these two reasons:

   * anonymous connections should not signal to other connections.
   * receivers that own names may have policies that block the TALK
     access, so do not bypass this.

   This openes the case where connections that own names may gain TALK
   access to other connections on the bus through broadcast! Yes but
   since this is the intended behaviour of signals we can't do
   otherwise. Of course as stated above if the destination owns names
   then broadcasts are subject to policy rules (we do not bypass policy
   rules).

5) If the policy rules of the default endpoint block the TALK access,
then block broadcasts, otherwise allow it.

These are the same rules that apply to TALK access and unicast checks,
the only exception is rule 4) that was instroduced to allow services to
signal on the bus.

Signed-off-by: Djalal Harouni <tixxdz@opendz.org>
10 years agoconnection: attach KDBUS_ATTACH_NAMES | KDBUS_ATTACH_CONN_NAME to faked creds
Daniel Mack [Thu, 9 Oct 2014 14:31:59 +0000 (16:31 +0200)]
connection: attach KDBUS_ATTACH_NAMES | KDBUS_ATTACH_CONN_NAME to faked creds

If the source connection has faked credentials, the metadata object
associated with the kmsg may still be augmented by KDBUS_ATTACH_NAMES
and KDBUS_ATTACH_CONN_NAME.

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agotest: fix typo
Michele Curti [Thu, 9 Oct 2014 12:05:42 +0000 (14:05 +0200)]
test: fix typo

fix typo in bybye test description

10 years agoconnection: style nit
Daniel Mack [Wed, 8 Oct 2014 16:04:29 +0000 (18:04 +0200)]
connection: style nit

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agoconnection: check for msg->dst_id == name_entry->conn->id
Daniel Mack [Wed, 8 Oct 2014 15:55:53 +0000 (17:55 +0200)]
connection: check for msg->dst_id == name_entry->conn->id

When sending a message, we now allow both the ID and the name to be
specified. In such cases, make sure to reject the message if the
connection that currently owns the name does not match the given ID.

This allows us to tie the action of sending a message to the fact that
the connection still owns a certain name, which is essential for
enforcing a policy from userspace (bus-proxyd) in a race-free way.

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agomessage: allow both names and unique IDs at the same time
Daniel Mack [Wed, 8 Oct 2014 15:36:34 +0000 (17:36 +0200)]
message: allow both names and unique IDs at the same time

Do not bail if a name item is passed while the message is addressed to
a unique ID. We'll use that message configuration in the next patch.

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agokdbus.txt: more information about faked credentials and metadata attachment
Daniel Mack [Wed, 8 Oct 2014 13:29:35 +0000 (15:29 +0200)]
kdbus.txt: more information about faked credentials and metadata attachment

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agoTODO: update
Daniel Mack [Wed, 8 Oct 2014 13:06:17 +0000 (15:06 +0200)]
TODO: update

10 years agoconnection: suppress message metadata attachment for faked creds
Daniel Mack [Wed, 8 Oct 2014 12:59:31 +0000 (14:59 +0200)]
connection: suppress message metadata attachment for faked creds

If a connection has installed faked credentials upon its creation, alter
the message treatment so that

 a) the kmsg's metadata is not a freshly allocated one but a full copy
    of the source connection's owner_meta

 b) no new items are attached to that metadata object

The problem here is that when a privileged bus user provided fake
credentials, it did that because it wants to be a proxy for another
task. In this case, 'current' would point us to the information of
the proxy's task, not the proxied one. As we don't want to provide
receivers with wrong information, make sure the only metadata items
that are added to messages are those which we have in faked form
already.

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agometadata: add kdbus_meta_dup()
Daniel Mack [Wed, 8 Oct 2014 12:47:44 +0000 (14:47 +0200)]
metadata: add kdbus_meta_dup()

Add a way to duplicate a metadata object. This will be needed to dup
conn->owner_meta and attach that to messages, instead of new items
retrieved from 'current'.

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agotree-wide: reject unknown flags
Daniel Mack [Wed, 8 Oct 2014 10:42:07 +0000 (12:42 +0200)]
tree-wide: reject unknown flags

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>
10 years agotest: print filename in assertion
Daniel Mack [Wed, 8 Oct 2014 09:28:42 +0000 (11:28 +0200)]
test: print filename in assertion

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agohandle: use sizeof(*type)
Daniel Mack [Wed, 8 Oct 2014 09:09:40 +0000 (11:09 +0200)]
handle: use sizeof(*type)

Just a cosmetic change for the sake of consistency.

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agometadata: clean up code, and remove invalid comment
Daniel Mack [Tue, 7 Oct 2014 15:39:47 +0000 (17:39 +0200)]
metadata: clean up code, and remove invalid comment

Signed-off-by: Daniel Mack <daniel@zonque.org>
10 years agotree-wide: s/_EP_/_ENDPOINT_/g (API break)
Daniel Mack [Wed, 8 Oct 2014 11:52:41 +0000 (13:52 +0200)]
tree-wide: s/_EP_/_ENDPOINT_/g (API break)

Avoid abbr. and rename EP → ENDPOINT.

Signed-off-by: Daniel Mack <daniel@zonque.org>