summaryrefslogtreecommitdiffstats
path: root/audio/avdtp.c
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.dentz@openbossa.org>2008-05-05 14:46:39 +0000
committerLuiz Augusto von Dentz <luiz.dentz@openbossa.org>2008-05-05 14:46:39 +0000
commit15892632de70a6ed6a7025a09a11b9e287f8f68c (patch)
tree55e2630c8f58bcecdf91033f4373fc49c0b7b49f /audio/avdtp.c
parentd584577564a1c05ce938493f342ec5dc74a7bca6 (diff)
Fixes avdtp and avctp authorization for incoming connections.
Diffstat (limited to 'audio/avdtp.c')
-rw-r--r--audio/avdtp.c60
1 files changed, 34 insertions, 26 deletions
diff --git a/audio/avdtp.c b/audio/avdtp.c
index ec2a8c12..2e22d8a2 100644
--- a/audio/avdtp.c
+++ b/audio/avdtp.c
@@ -40,6 +40,7 @@
#include <bluetooth/sdp.h>
#include "dbus.h"
+#include "dbus-service.h"
#include "logging.h"
#include "device.h"
@@ -2679,34 +2680,23 @@ int avdtp_unregister_sep(struct avdtp_local_sep *sep)
return 0;
}
-static void auth_cb(DBusPendingCall *call, void *data)
+static void auth_cb(DBusError *derr, void *user_data)
{
- GIOChannel *io;
- struct avdtp *session = data;
- DBusMessage *reply = dbus_pending_call_steal_reply(call);
- DBusError err;
+ struct avdtp *session = user_data;
struct device *dev;
+ GIOChannel *io;
- dbus_pending_call_unref(session->pending_auth);
- session->pending_auth = NULL;
-
- dbus_error_init(&err);
- if (dbus_set_error_from_message(&err, reply)) {
- error("Access denied: %s", err.message);
-
- if (dbus_error_has_name(&err, DBUS_ERROR_NO_REPLY)) {
+ if (derr && dbus_error_is_set(derr)) {
+ error("Access denied: %s", derr->message);
+ if (dbus_error_has_name(derr, DBUS_ERROR_NO_REPLY)) {
debug("Canceling authorization request");
- manager_cancel_authorize(&session->dst,
+ if (service_cancel_auth(&session->dst) < 0)
+ manager_cancel_authorize(&session->dst,
ADVANCED_AUDIO_UUID,
NULL);
}
- dbus_error_free(&err);
-
connection_lost(session, -EACCES);
-
- dbus_message_unref(reply);
-
return;
}
@@ -2730,6 +2720,23 @@ static void auth_cb(DBusPendingCall *call, void *data)
g_io_channel_unref(io);
}
+static void auth_cb_old(DBusPendingCall *call, void *data)
+{
+ struct avdtp *session = data;
+ DBusMessage *reply = dbus_pending_call_steal_reply(call);
+ DBusError err;
+
+ dbus_pending_call_unref(session->pending_auth);
+ session->pending_auth = NULL;
+
+ dbus_error_init(&err);
+ dbus_set_error_from_message(&err, reply);
+ auth_cb(&err, data);
+ dbus_error_free(&err);
+
+ dbus_message_unref(reply);
+}
+
static gboolean avdtp_server_cb(GIOChannel *chan, GIOCondition cond, void *data)
{
int srv_sk, cli_sk;
@@ -2796,13 +2803,6 @@ static gboolean avdtp_server_cb(GIOChannel *chan, GIOCondition cond, void *data)
return TRUE;
}
- if (!manager_authorize(&dst, ADVANCED_AUDIO_UUID, auth_cb, session,
- &session->pending_auth)) {
- close(cli_sk);
- avdtp_unref(session);
- return TRUE;
- }
-
session->mtu = l2o.imtu;
session->sock = cli_sk;
@@ -2811,6 +2811,14 @@ static gboolean avdtp_server_cb(GIOChannel *chan, GIOCondition cond, void *data)
(GIOFunc) session_cb, session);
g_io_channel_unref(io);
+ if (service_req_auth(&src, &dst, ADVANCED_AUDIO_UUID, auth_cb, session) == 0)
+ return TRUE;
+ else if (!manager_authorize(&dst, ADVANCED_AUDIO_UUID, auth_cb_old,
+ session, &session->pending_auth)) {
+ close(cli_sk);
+ avdtp_unref(session);
+ }
+
return TRUE;
}