summaryrefslogtreecommitdiffstats
path: root/hcid
diff options
context:
space:
mode:
authorClaudio Takahasi <claudio.takahasi@openbossa.org>2006-03-21 18:22:39 +0000
committerClaudio Takahasi <claudio.takahasi@openbossa.org>2006-03-21 18:22:39 +0000
commit895eb547951b582fc690528172786232fbb21698 (patch)
tree5bf93db8e93c79b10267a896233268bfcabb55bc /hcid
parent4035bbcc0de791e3fa222d8d8ceba6f589e94c8b (diff)
Added bluetooth address validation and fixed adapter msg function handler to catch not implemented methods
Diffstat (limited to 'hcid')
-rw-r--r--hcid/dbus-adapter.c139
1 files changed, 103 insertions, 36 deletions
diff --git a/hcid/dbus-adapter.c b/hcid/dbus-adapter.c
index b8c2d006..c0befdbd 100644
--- a/hcid/dbus-adapter.c
+++ b/hcid/dbus-adapter.c
@@ -28,6 +28,7 @@
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
+#include <ctype.h>
#include <sys/socket.h>
#include <bluetooth/bluetooth.h>
@@ -73,6 +74,43 @@ static const char *phone_minor_cls[] = {
"isdn"
};
+static int is_valid_address(const char *addr)
+{
+ char tmp[18];
+ char *ptr = tmp;
+
+ if (!addr)
+ return -1;
+
+ if (strlen(addr) != 17)
+ return -1;
+
+ memcpy(tmp, addr, 18);
+
+ while (ptr) {
+
+ *ptr = toupper(*ptr);
+ if (*ptr < '0'|| (*ptr > '9' && *ptr < 'A') || *ptr > 'F')
+ return -1;
+
+ ptr++;
+ *ptr = toupper(*ptr);
+ if (*ptr < '0'|| (*ptr > '9' && *ptr < 'A') || *ptr > 'F')
+ return -1;
+
+ ptr++;
+ *ptr = toupper(*ptr);
+ if (*ptr == 0)
+ break;
+
+ if (*ptr != ':')
+ return -1;
+
+ ptr++;
+ }
+
+ return 0;
+}
int find_connection_handle(int dd, bdaddr_t *peer)
{
struct hci_conn_info_req *cr;
@@ -862,6 +900,9 @@ static DBusHandlerResult handle_dev_get_remote_name_req(DBusConnection *conn, DB
return error_invalid_arguments(conn, msg);
}
+ if (is_valid_address(peer_addr) < 0)
+ return error_invalid_arguments(conn, msg);
+
ecode = get_device_address(dbus_data->dev_id, addr, sizeof(addr));
if (ecode < 0)
return error_failed(conn, msg, -ecode);
@@ -927,6 +968,9 @@ static DBusHandlerResult handle_dev_get_remote_alias_req(DBusConnection *conn, D
return error_invalid_arguments(conn, msg);
}
+ if (is_valid_address(addr_ptr) < 0)
+ return error_invalid_arguments(conn, msg);
+
str2ba(addr_ptr, &bdaddr);
ecode = get_device_alias(dbus_data->dev_id, &bdaddr, str, sizeof(str));
@@ -965,7 +1009,7 @@ static DBusHandlerResult handle_dev_set_remote_alias_req(DBusConnection *conn, D
return error_invalid_arguments(conn, msg);
}
- if (strlen(str_ptr) == 0) {
+ if ((strlen(str_ptr) == 0) || (is_valid_address(addr_ptr) < 0)) {
error("Alias change failed: Invalid parameter");
return error_invalid_arguments(conn, msg);
}
@@ -1002,12 +1046,6 @@ static DBusHandlerResult handle_dev_last_seen_req(DBusConnection *conn, DBusMess
char addr[18], *addr_ptr, *str;
int ecode;
- ecode = get_device_address(dbus_data->dev_id, addr, sizeof(addr));
- if (ecode < 0)
- return error_failed(conn, msg, -ecode);
-
- snprintf(filename, PATH_MAX, "%s/%s/lastseen", STORAGEDIR, addr);
-
dbus_error_init(&err);
dbus_message_get_args(msg, &err,
DBUS_TYPE_STRING, &addr_ptr,
@@ -1019,6 +1057,15 @@ static DBusHandlerResult handle_dev_last_seen_req(DBusConnection *conn, DBusMess
return error_invalid_arguments(conn, msg);
}
+ if (is_valid_address(addr_ptr) < 0)
+ return error_invalid_arguments(conn, msg);
+
+ ecode = get_device_address(dbus_data->dev_id, addr, sizeof(addr));
+ if (ecode < 0)
+ return error_failed(conn, msg, -ecode);
+
+ snprintf(filename, PATH_MAX, "%s/%s/lastseen", STORAGEDIR, addr);
+
str = textfile_get(filename, addr_ptr);
if (!str)
return error_failed(conn, msg, ENXIO);
@@ -1046,12 +1093,6 @@ static DBusHandlerResult handle_dev_last_used_req(DBusConnection *conn, DBusMess
char addr[18], *addr_ptr, *str;
int ecode;
- ecode = get_device_address(dbus_data->dev_id, addr, sizeof(addr));
- if (ecode < 0)
- return error_failed(conn, msg, -ecode);
-
- snprintf(filename, PATH_MAX, "%s/%s/lastused", STORAGEDIR, addr);
-
dbus_error_init(&err);
dbus_message_get_args(msg, &err,
DBUS_TYPE_STRING, &addr_ptr,
@@ -1063,6 +1104,16 @@ static DBusHandlerResult handle_dev_last_used_req(DBusConnection *conn, DBusMess
return error_invalid_arguments(conn, msg);
}
+ if (is_valid_address(addr_ptr) < 0)
+ return error_invalid_arguments(conn, msg);
+
+ ecode = get_device_address(dbus_data->dev_id, addr, sizeof(addr));
+ if (ecode < 0)
+ return error_failed(conn, msg, -ecode);
+
+ snprintf(filename, PATH_MAX, "%s/%s/lastused", STORAGEDIR, addr);
+
+
str = textfile_get(filename, addr_ptr);
if (!str)
return error_failed(conn, msg, ENXIO);
@@ -1107,7 +1158,8 @@ static DBusHandlerResult handle_dev_create_bonding_req(DBusConnection *conn, DBu
return error_invalid_arguments(conn, msg);
}
- /* FIXME: check if the address is valid */
+ if (is_valid_address(peer_addr) < 0)
+ return error_invalid_arguments(conn, msg);
str2ba(peer_addr, &peer_bdaddr);
@@ -1220,14 +1272,6 @@ static DBusHandlerResult handle_dev_remove_bonding_req(DBusConnection *conn, DBu
bdaddr_t bdaddr;
int dd;
- dd = hci_open_dev(dbus_data->dev_id);
- if (dd < 0)
- return error_no_such_adapter(conn, msg);
-
- get_device_address(dbus_data->dev_id, addr, sizeof(addr));
-
- snprintf(filename, PATH_MAX, "%s/%s/linkkeys", STORAGEDIR, addr);
-
dbus_error_init(&err);
dbus_message_get_args(msg, &err,
DBUS_TYPE_STRING, &addr_ptr,
@@ -1239,6 +1283,18 @@ static DBusHandlerResult handle_dev_remove_bonding_req(DBusConnection *conn, DBu
return error_invalid_arguments(conn, msg);
}
+ if (is_valid_address(addr_ptr) < 0)
+ return error_invalid_arguments(conn, msg);
+
+ dd = hci_open_dev(dbus_data->dev_id);
+ if (dd < 0)
+ return error_no_such_adapter(conn, msg);
+
+ get_device_address(dbus_data->dev_id, addr, sizeof(addr));
+
+ snprintf(filename, PATH_MAX, "%s/%s/linkkeys", STORAGEDIR, addr);
+
+
/* Delete the link key from storage */
textfile_del(filename, addr_ptr);
@@ -1301,12 +1357,6 @@ static DBusHandlerResult handle_dev_has_bonding_req(DBusConnection *conn, DBusMe
dbus_bool_t result;
int ecode;
- ecode = get_device_address(dbus_data->dev_id, addr, sizeof(addr));
- if (ecode < 0)
- return error_failed(conn, msg, -ecode);
-
- snprintf(filename, PATH_MAX, "%s/%s/linkkeys", STORAGEDIR, addr);
-
dbus_error_init(&err);
dbus_message_get_args(msg, &err,
DBUS_TYPE_STRING, &addr_ptr,
@@ -1318,6 +1368,15 @@ static DBusHandlerResult handle_dev_has_bonding_req(DBusConnection *conn, DBusMe
return error_invalid_arguments(conn, msg);
}
+ if (is_valid_address(addr_ptr) < 0)
+ return error_invalid_arguments(conn, msg);
+
+ ecode = get_device_address(dbus_data->dev_id, addr, sizeof(addr));
+ if (ecode < 0)
+ return error_failed(conn, msg, -ecode);
+
+ snprintf(filename, PATH_MAX, "%s/%s/linkkeys", STORAGEDIR, addr);
+
str = textfile_get(filename, addr_ptr);
if (str) {
result = TRUE;
@@ -1380,12 +1439,6 @@ static DBusHandlerResult handle_dev_get_pin_code_length_req(DBusConnection *conn
uint8_t length;
int len, ecode;
- ecode = get_device_address(dbus_data->dev_id, addr, sizeof(addr));
- if (ecode < 0)
- return error_failed(conn, msg, -ecode);
-
- str2ba(addr, &local);
-
dbus_error_init(&err);
dbus_message_get_args(msg, &err,
DBUS_TYPE_STRING, &addr_ptr,
@@ -1397,6 +1450,15 @@ static DBusHandlerResult handle_dev_get_pin_code_length_req(DBusConnection *conn
return error_invalid_arguments(conn, msg);
}
+ if (is_valid_address(addr_ptr) < 0)
+ return error_invalid_arguments(conn, msg);
+
+ ecode = get_device_address(dbus_data->dev_id, addr, sizeof(addr));
+ if (ecode < 0)
+ return error_failed(conn, msg, -ecode);
+
+ str2ba(addr, &local);
+
str2ba(addr_ptr, &peer);
len = read_pin_length(&local, &peer);
@@ -1434,6 +1496,9 @@ static DBusHandlerResult handle_dev_get_encryption_key_size_req(DBusConnection *
return error_invalid_arguments(conn, msg);
}
+ if (is_valid_address(addr_ptr) < 0)
+ return error_invalid_arguments(conn, msg);
+
str2ba(addr_ptr, &bdaddr);
val = get_encryption_key_size(dbus_data->dev_id, &bdaddr);
@@ -1653,11 +1718,13 @@ DBusHandlerResult msg_func_device(DBusConnection *conn, DBusMessage *msg, void *
if (handler)
return handler(conn, msg, data);
+ else
+ return error_not_implemented(conn, msg);
}
else if (!strcmp(SECURITY_INTERFACE, iface))
return handle_security_method(conn, msg, data);
else if (!strcmp(RFCOMM_INTERFACE, iface))
return handle_rfcomm_method(conn, msg, data);
-
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+ else
+ return error_not_implemented(conn, msg);
}