summaryrefslogtreecommitdiffstats
path: root/network
diff options
context:
space:
mode:
authorClaudio Takahasi <claudio.takahasi@openbossa.org>2007-08-29 21:22:21 +0000
committerClaudio Takahasi <claudio.takahasi@openbossa.org>2007-08-29 21:22:21 +0000
commite2b42635514e559b765a7cd763717995d237e7b9 (patch)
treec75566fc3980147a0bf94b1565d172dd14e84e75 /network
parent176b646a7829d683055d95b5d637a3a5dfdd36c0 (diff)
network: additional src and dst role verification
Diffstat (limited to 'network')
-rw-r--r--network/server.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/network/server.c b/network/server.c
index bd19609f..5a441ee6 100644
--- a/network/server.c
+++ b/network/server.c
@@ -395,7 +395,7 @@ static int authorize_connection(const char *address, struct network_server *ns)
return 0;
}
-static int inline chk_role(uint16_t dst_role, uint16_t src_role)
+static uint16_t inline chk_role(uint16_t dst_role, uint16_t src_role)
{
/* Allowed PAN Profile scenarios */
switch (dst_role) {
@@ -403,12 +403,17 @@ static int inline chk_role(uint16_t dst_role, uint16_t src_role)
case BNEP_SVC_GN:
if (src_role == BNEP_SVC_PANU)
return 0;
- break;
+ return BNEP_CONN_INVALID_SRC;
case BNEP_SVC_PANU:
- return 0;
+ if (src_role == BNEP_SVC_PANU ||
+ src_role == BNEP_SVC_GN ||
+ src_role == BNEP_SVC_NAP)
+ return 0;
+
+ return BNEP_CONN_INVALID_SRC;
}
- return -EINVAL;
+ return BNEP_CONN_INVALID_DST;
}
static gboolean connect_setup_event(GIOChannel *chan,
@@ -463,10 +468,9 @@ static gboolean connect_setup_event(GIOChannel *chan,
/* Getting source service: considering 2 bytes size */
src_role = ntohs(bt_get_unaligned((uint16_t *) pservice));
- if (chk_role(src_role, dst_role) < 0) {
- response = BNEP_CONN_NOT_ALLOWED;
+ response = chk_role(src_role, dst_role);
+ if (response)
goto reply;
- }
snprintf(path, MAX_PATH_LENGTH, NETWORK_PATH"/%s", bnep_name(dst_role));
dbus_connection_get_object_user_data(connection, path, (void *) &ns);