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>
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>
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.
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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(®->rwlock);
.. which dead-locks against kmsg_send():
kdbus_name_lock(reg); (=> down_read(®->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>
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>
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>
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>
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>
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>
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>
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>
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.
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>
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>
Daniel Mack [Thu, 16 Oct 2014 09:38:37 +0000 (11:38 +0200)]
domain: detroy IDRs
Signed-off-by: Daniel Mack <daniel@zonque.org>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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
Greg Kroah-Hartman [Fri, 10 Oct 2014 03:04:58 +0000 (20:04 -0700)]
Merge pull request #26 from michelecurti/master
test: fix typo
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>
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>
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>
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>
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>
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>
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>
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>
Michele Curti [Thu, 9 Oct 2014 12:05:42 +0000 (14:05 +0200)]
test: fix typo
fix typo in bybye test description
Daniel Mack [Wed, 8 Oct 2014 16:04:29 +0000 (18:04 +0200)]
connection: style nit
Signed-off-by: Daniel Mack <daniel@zonque.org>
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>
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>
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>
Daniel Mack [Wed, 8 Oct 2014 13:06:17 +0000 (15:06 +0200)]
TODO: update
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>
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>
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>
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>
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>
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>
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>
Daniel Mack [Wed, 8 Oct 2014 09:29:49 +0000 (11:29 +0200)]
kdbus.h: add features bitmask to cmd_make and cmd_hello (ABI BREAK)
Add a new field called 'features' to struct kdbus_cmd_make and
kdbus_cmd_hello. In these bitmasks, userspace can request features from
the kernel, and the kernel can itself request features from userspace.
For now, we check that this field is set to 0, and bail with
-EOPNOTSUPP otherwise.
Signed-off-by: Daniel Mack <daniel@zonque.org>
Daniel Mack [Tue, 7 Oct 2014 12:43:18 +0000 (14:43 +0200)]
test: fix some 'dead assignment' errors
Daniel Mack [Tue, 7 Oct 2014 08:29:26 +0000 (10:29 +0200)]
test-endpoint: fix nul-termination of string
Found by coverity.
Signed-off-by: Daniel Mack <daniel@zonque.org>
Daniel Mack [Mon, 6 Oct 2014 16:27:05 +0000 (18:27 +0200)]
handle.c: add kdbus_copy_from_user() helper
Add a little helper to check for 8-byte aligment as well as doing
the actual copy_from_user(). Use it from location where we used to
open-code the same functionality.
Signed-off-by: Daniel Mack <daniel@zonque.org>
Daniel Mack [Mon, 6 Oct 2014 16:09:35 +0000 (18:09 +0200)]
kdbus.h: implement KDBUS_CMD_{MSG_CANCEL,FREE} with structs (ABI break)
Rather than passing a pointer to a u64 with these ioctls, use a struct.
That also allows us to pass (currently unused) flags around.
Signed-off-by: Daniel Mack <daniel@zonque.org>
Djalal Harouni [Mon, 6 Oct 2014 15:44:43 +0000 (16:44 +0100)]
pool: kdbus_pool_slice_alloc() release the pool lock on errors
Signed-off-by: Djalal Harouni <tixxdz@opendz.org>
Djalal Harouni [Mon, 6 Oct 2014 15:44:42 +0000 (16:44 +0100)]
doc: KDBUS_CMD_NAME_LIST ioctl might fail with -ENOBUFS
KDBUS_CMD_NAME_LIST might fail with -ENOBUFS if there is no available
memory in the connection's pool.
Signed-off-by: Djalal Harouni <tixxdz@opendz.org>
Daniel Mack [Mon, 6 Oct 2014 12:41:35 +0000 (14:41 +0200)]
names: simplify code in kdbus_cmd_name_acquire()
There's no need to flush notifications after
kdbus_ep_policy_check_own_access(). Hence, we can get rid of the
jump label.
Signed-off-by: Daniel Mack <daniel@zonque.org>
Daniel Mack [Mon, 6 Oct 2014 12:28:19 +0000 (14:28 +0200)]
names: don't refuse unknown flags
We need to allow for forward-compat, so just ignore invalid flags in
kdbus_cmd_name_acquire().
Signed-off-by: Daniel Mack <daniel@zonque.org>
Daniel Mack [Mon, 6 Oct 2014 10:25:52 +0000 (12:25 +0200)]
connection: make kdbus_conn_broadcast() void
As we never return any error from this function anyway, we can as well
make it void.
Signed-off-by: Daniel Mack <daniel@zonque.org>
Djalal Harouni [Sat, 4 Oct 2014 21:37:17 +0000 (22:37 +0100)]
doc: policy: specify on which endpoint implicit rules are enforced
Separate implicit rules doc into two parts one for default endpoints and
the other for custom ones.
Signed-off-by: Djalal Harouni <tixxdz@opendz.org>
Djalal Harouni [Fri, 3 Oct 2014 23:22:00 +0000 (00:22 +0100)]
endpoint: check if the endpoint has a policy before locking DB and connection
Littel optimization on kdbus_ep_policy_check_notification().
Default bus endpoints do not enforce the endpoint policy, so instead
of checking if the endpoint is using the policy in
kdbus_ep_policy_check_see_access_unlocked(), just do the check at the
beginning and avoid all the useless locking.
This is already done for kdbus_ep_policy_check_src_names().
Signed-off-by: Djalal Harouni <tixxdz@opendz.org>
Djalal Harouni [Fri, 3 Oct 2014 23:21:59 +0000 (00:21 +0100)]
connection: broadcast and signaling hide non-fatal errors
Broadcast is one way, we should not care for receivers or their errors.
Currently we may return an error on custom endpoints if the last
receiver is not authorized to see name's of the sender. Even if we
have signaled all previous receivers, if we fail for the last one we may
return an error.
Improve this by just ignoring this type of error. We hide non-fatal
errors, and we return an error only if kdbus_meta_append() fails since
it can not recover. kdbus_meta_append() fails with -ENOMEM, its logic
can perhaps be improved later to have at least a nofail version where we
can recover.
And from D-Bus spec:
"Errors
Messages of type ERROR are most commonly replies to a METHOD_CALL, but
may be returned in reply to any kind of message. The message bus for
example will return an ERROR in reply to a signal emission if the bus
does not have enough memory to send the signal. "
So take this shortcut here, and hide non-fatal errors.
Signed-off-by: Djalal Harouni <tixxdz@opendz.org>
Djalal Harouni [Fri, 3 Oct 2014 23:21:58 +0000 (00:21 +0100)]
endpoint: fix kernel doc for kdbus_ep_policy_check_src_names()
Signed-off-by: Djalal Harouni <tixxdz@opendz.org>
Djalal Harouni [Fri, 3 Oct 2014 23:21:57 +0000 (00:21 +0100)]
kdbus-doc: fix policy doc on default behaviour on buses and custom endpoints
Operations are denied by default on default endpoints unless they are
covered by one of the implicit policy rules.
Operations are denied by default on custom endpoints unless the policy
is instructed to allow some exceptions...
The custom endpoint policy if any goes on top of the bus policy.
Signed-off-by: Djalal Harouni <tixxdz@opendz.org>
Daniel Mack [Fri, 3 Oct 2014 12:01:55 +0000 (14:01 +0200)]
connection: allow unlimited bus connections for privileged users
As described in https://code.google.com/p/d-bus/issues/detail?id=9 by
Simon McVittie:
kdbus allows 256 connections per uid per bus, which the CAP_IPC_OWNER
may exceed.
This could get quite tight for the session bus: I currently have 46
session bus connections, so I'm only an order of magnitude away from
the limit. The session bus is currently restricted to its owning uid
only, and even if other uids are allowed in (perhaps via restricted
endpoints) for Android-style sandboxing, I expect it will be mostly
populated by its owning uid.
I agree with David Herrmann's solution:
Connections are already limited by the per-user FD limit. So maybe we
should just allow unlimited connections by the bus UID, too? All other
connections must be limited, obviously. Otherwise, they can trigger
slow-paths and reduce performance of the bus considerably.
Signed-off-by: Daniel Mack <daniel@zonque.org>
Daniel Mack [Thu, 2 Oct 2014 18:26:15 +0000 (20:26 +0200)]
kdbus.txt: more details on matches and rules
Signed-off-by: Daniel Mack <daniel@zonque.org>
Daniel Mack [Thu, 2 Oct 2014 15:09:09 +0000 (17:09 +0200)]
match: add flags to kdbus_cmd_match (ABI break!)
Add a 64-bit flags field to struct kdbus_cmd_match, and define a flag
that allows for a race-free way of replacing existing matches.
Signed-off-by: Daniel Mack <daniel@zonque.org>
Daniel Mack [Thu, 2 Oct 2014 14:38:03 +0000 (16:38 +0200)]
handle: clean up 'cmd' variable namespace
'cmd' is an integer variable in the ioctl callbacks that denotes the
actual command. A few places in those handlers, however, used to
define a struct by the same name.
Clean up the namespace be renaming the latter.
Signed-off-by: Daniel Mack <daniel@zonque.org>
Daniel Mack [Thu, 2 Oct 2014 14:01:28 +0000 (16:01 +0200)]
match: make KDBUS_CMD_MATCH_REMOVE return -ENOENT when cookie was not found
When the cookie specified in the command struct was not found in the
match database, return -ENOENT.
Signed-off-by: Daniel Mack <daniel@zonque.org>
Daniel Mack [Thu, 2 Oct 2014 10:57:53 +0000 (12:57 +0200)]
kdbus.h: attach items[] to kdbus_cmd_conn_info, not name[] (ABI break!)
Instead of directly attaching the string to kdbus_cmd_conn_info, use
items as we do in all other commands. That allows for more flexibility
later.
Signed-off-by: Daniel Mack <daniel@zonque.org>
David Herrmann [Thu, 2 Oct 2014 10:55:29 +0000 (12:55 +0200)]
test: fix benchmark stats accounting
We should not reset stats before retying a test, otherwise, the test will
file in batch mode as stats.count is 0.
Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
David Herrmann [Thu, 2 Oct 2014 10:35:33 +0000 (12:35 +0200)]
test: add benchmark-mode to clear attach-flags
Processing message attachments can take quite some time. Add a mode to
skip those.
Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
David Herrmann [Thu, 2 Oct 2014 08:58:43 +0000 (10:58 +0200)]
test: beef up benchmark
Make some adjustments to the kdbus benchmark:
* use CLOCK_THREAD_CPUTIME_ID
* use nano-second precision
* make memfd-usage optional
* add UDS comparison
Signed-off-by: David Herrmann <dh.herrmann@gmail.com>