diff options
author | Claudio Takahasi <claudio.takahasi@openbossa.org> | 2006-03-17 02:56:47 +0000 |
---|---|---|
committer | Claudio Takahasi <claudio.takahasi@openbossa.org> | 2006-03-17 02:56:47 +0000 |
commit | 7858540a0474675cdfcbef5711ad1c49fc0b736c (patch) | |
tree | f280abe7795366867f2b833213b2788230d51b8f /hcid/dbus-adapter.c | |
parent | ad51f992f0c529a928edad39a045864a02e641af (diff) |
added signature verification and code cleanup
Diffstat (limited to 'hcid/dbus-adapter.c')
-rw-r--r-- | hcid/dbus-adapter.c | 315 |
1 files changed, 220 insertions, 95 deletions
diff --git a/hcid/dbus-adapter.c b/hcid/dbus-adapter.c index fffb6fd4..ebc532dc 100644 --- a/hcid/dbus-adapter.c +++ b/hcid/dbus-adapter.c @@ -96,35 +96,20 @@ int find_connection_handle(int dd, bdaddr_t *peer) return handle; } -static int bonding_requests_find(const void *a, const void *b) +static int bonding_requests_append(struct slist **list, bdaddr_t *bdaddr, DBusMessage *msg, bonding_state_t bonding_state) { - const struct bonding_request_info *dev = a; - const bdaddr_t *peer = b; + struct bonding_request_info *dev; + dev = malloc(sizeof(*dev)); if (!dev) return -1; - if (memcmp(dev->addr, peer, sizeof(*peer)) == 0) { - return 0; - } - - return -1; -} - -static int bonding_requests_append(struct slist **list, bdaddr_t *addr, DBusMessage *msg, bonding_state_t bonding_state) -{ - struct bonding_request_info *data; - - data = malloc(sizeof(*data)); - if (!data) - return -1; - - data->addr = malloc(sizeof(*data->addr)); - memcpy(data->addr, addr, sizeof(*data->addr)); - data->msg = msg; - data->bonding_state = bonding_state; + dev->bdaddr = malloc(sizeof(*dev->bdaddr)); + memcpy(dev->bdaddr, bdaddr, sizeof(*dev->bdaddr)); + dev->msg = msg; + dev->bonding_state = bonding_state; - *list = slist_append(*list, data); + *list = slist_append(*list, dev); return 0; } @@ -272,13 +257,22 @@ static DBusHandlerResult handle_dev_set_mode_req(DBusConnection *conn, DBusMessa { const struct hci_dbus_data *dbus_data = data; DBusMessage *reply; + DBusError err; const char* scan_mode; uint8_t hci_mode; const uint8_t current_mode = dbus_data->mode; int dd; - dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &scan_mode, - DBUS_TYPE_INVALID); + dbus_error_init(&err); + dbus_message_get_args(msg, &err, + DBUS_TYPE_STRING, &scan_mode, + DBUS_TYPE_INVALID); + + if (dbus_error_is_set(&err)) { + error("Can't extract message arguments:%s", err.message); + dbus_error_free(&err); + return error_invalid_arguments(conn, msg); + } if (!scan_mode) return error_invalid_arguments(conn, msg); @@ -351,11 +345,19 @@ static DBusHandlerResult handle_dev_set_discoverable_to_req(DBusConnection *conn { struct hci_dbus_data *dbus_data = data; DBusMessage *reply; - DBusMessageIter iter; + DBusError err; uint32_t timeout; - dbus_message_iter_init(msg, &iter); - dbus_message_iter_get_basic(&iter, &timeout); + dbus_error_init(&err); + dbus_message_get_args(msg, &err, + DBUS_TYPE_UINT32, &timeout, + DBUS_TYPE_INVALID); + + if (dbus_error_is_set(&err)) { + error("Can't extract message arguments:%s", err.message); + dbus_error_free(&err); + return error_invalid_arguments(conn, msg); + } dbus_data->discoverable_timeout = timeout; @@ -525,16 +527,24 @@ static DBusHandlerResult handle_dev_set_minor_class_req(DBusConnection *conn, DB { struct hci_dbus_data *dbus_data = data; DBusConnection *connection = get_dbus_connection(); - DBusMessageIter iter; DBusMessage *reply, *signal; + DBusError err; bdaddr_t bdaddr; const char *minor; uint8_t cls[3]; uint32_t dev_class = 0xFFFFFFFF; int i, dd; - dbus_message_iter_init(msg, &iter); - dbus_message_iter_get_basic(&iter, &minor); + dbus_error_init(&err); + dbus_message_get_args(msg, &err, + DBUS_TYPE_STRING, &minor, + DBUS_TYPE_INVALID); + + if (dbus_error_is_set(&err)) { + error("Can't extract message arguments:%s", err.message); + dbus_error_free(&err); + return error_invalid_arguments(conn, msg); + } if (!minor) return error_invalid_arguments(conn, msg); @@ -662,14 +672,22 @@ static DBusHandlerResult handle_dev_get_name_req(DBusConnection *conn, DBusMessa static DBusHandlerResult handle_dev_set_name_req(DBusConnection *conn, DBusMessage *msg, void *data) { struct hci_dbus_data *dbus_data = data; - DBusMessageIter iter; DBusMessage *reply; + DBusError err; bdaddr_t bdaddr; char *str_ptr; - int err; + int ecode; - dbus_message_iter_init(msg, &iter); - dbus_message_iter_get_basic(&iter, &str_ptr); + dbus_error_init(&err); + dbus_message_get_args(msg, &err, + DBUS_TYPE_STRING, &str_ptr, + DBUS_TYPE_INVALID); + + if (dbus_error_is_set(&err)) { + error("Can't extract message arguments:%s", err.message); + dbus_error_free(&err); + return error_invalid_arguments(conn, msg); + } if (strlen(str_ptr) == 0) { error("Name change failed: Invalid parameter"); @@ -680,9 +698,9 @@ static DBusHandlerResult handle_dev_set_name_req(DBusConnection *conn, DBusMessa write_local_name(&bdaddr, str_ptr); - err = set_device_name(dbus_data->dev_id, str_ptr); - if (err < 0) - return error_failed(conn, msg, -err); + ecode = set_device_name(dbus_data->dev_id, str_ptr); + if (ecode < 0) + return error_failed(conn, msg, -ecode); reply = dbus_message_new_method_return(msg); if (!reply) @@ -704,18 +722,29 @@ static DBusHandlerResult handle_dev_get_remote_revision_req(DBusConnection *conn static DBusHandlerResult handle_dev_get_remote_manufacturer_req(DBusConnection *conn, DBusMessage *msg, void *data) { struct hci_dbus_data *dbus_data = data; - DBusMessageIter iter; DBusMessage *reply; + DBusError err; char filename[PATH_MAX + 1]; char addr[18], *addr_ptr, *str; int compid; + int ecode; - get_device_address(dbus_data->dev_id, addr, sizeof(addr)); + 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/manufacturers", STORAGEDIR, addr); - dbus_message_iter_init(msg, &iter); - dbus_message_iter_get_basic(&iter, &addr_ptr); + dbus_error_init(&err); + dbus_message_get_args(msg, &err, + DBUS_TYPE_STRING, &addr_ptr, + DBUS_TYPE_INVALID); + + if (dbus_error_is_set(&err)) { + error("Can't extract message arguments:%s", err.message); + dbus_error_free(&err); + return error_invalid_arguments(conn, msg); + } str = textfile_get(filename, addr_ptr); if (!str) @@ -740,12 +769,20 @@ static DBusHandlerResult handle_dev_get_remote_manufacturer_req(DBusConnection * static DBusHandlerResult handle_dev_get_remote_company_req(DBusConnection *conn, DBusMessage *msg, void *data) { DBusMessage *reply; + DBusError err; bdaddr_t bdaddr; char oui[9], *str_bdaddr, *tmp; - dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &str_bdaddr, - DBUS_TYPE_INVALID); + dbus_error_init(&err); + dbus_message_get_args(msg, &err, + DBUS_TYPE_STRING, &str_bdaddr, + DBUS_TYPE_INVALID); + if (dbus_error_is_set(&err)) { + error("Can't extract message arguments:%s", err.message); + dbus_error_free(&err); + return error_invalid_arguments(conn, msg); + } str2ba(str_bdaddr, &bdaddr); ba2oui(&bdaddr, oui); @@ -773,16 +810,25 @@ static DBusHandlerResult handle_dev_get_remote_name_req(DBusConnection *conn, DB char filename[PATH_MAX + 1], addr[18]; struct hci_dbus_data *dbus_data = data; DBusMessage *reply = NULL; + DBusError err; const char *str_bdaddr; char *name; - int err; + int ecode; - dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &str_bdaddr, - DBUS_TYPE_INVALID); + dbus_error_init(&err); + dbus_message_get_args(msg, &err, + DBUS_TYPE_STRING, &str_bdaddr, + DBUS_TYPE_INVALID); - err = get_device_address(dbus_data->dev_id, addr, sizeof(addr)); - if (err < 0) - return error_failed(conn, msg, -err); + if (dbus_error_is_set(&err)) { + error("Can't extract message arguments:%s", err.message); + dbus_error_free(&err); + 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/names", STORAGEDIR, addr); @@ -808,20 +854,28 @@ static DBusHandlerResult handle_dev_get_remote_name_req(DBusConnection *conn, DB static DBusHandlerResult handle_dev_get_remote_alias_req(DBusConnection *conn, DBusMessage *msg, void *data) { struct hci_dbus_data *dbus_data = data; - DBusMessageIter iter; DBusMessage *reply; + DBusError err; char str[249], *str_ptr = str, *addr_ptr; bdaddr_t bdaddr; - int err; + int ecode; - dbus_message_iter_init(msg, &iter); - dbus_message_iter_get_basic(&iter, &addr_ptr); + dbus_error_init(&err); + dbus_message_get_args(msg, &err, + DBUS_TYPE_STRING, &addr_ptr, + DBUS_TYPE_INVALID); + + if (dbus_error_is_set(&err)) { + error("Can't extract message arguments:%s", err.message); + dbus_error_free(&err); + return error_invalid_arguments(conn, msg); + } str2ba(addr_ptr, &bdaddr); - err = get_device_alias(dbus_data->dev_id, &bdaddr, str, sizeof(str)); - if (err < 0) - return error_failed(conn, msg, -err); + ecode = get_device_alias(dbus_data->dev_id, &bdaddr, str, sizeof(str)); + if (ecode < 0) + return error_failed(conn, msg, -ecode); reply = dbus_message_new_method_return(msg); if (!reply) @@ -837,16 +891,23 @@ static DBusHandlerResult handle_dev_set_remote_alias_req(DBusConnection *conn, D { struct hci_dbus_data *dbus_data = data; DBusConnection *connection = get_dbus_connection(); - DBusMessageIter iter; DBusMessage *reply, *signal; + DBusError err; char *str_ptr, *addr_ptr; bdaddr_t bdaddr; - int err; + int ecode; - dbus_message_iter_init(msg, &iter); - dbus_message_iter_get_basic(&iter, &addr_ptr); - dbus_message_iter_next(&iter); - dbus_message_iter_get_basic(&iter, &str_ptr); + dbus_error_init(&err); + dbus_message_get_args(msg, &err, + DBUS_TYPE_STRING, &addr_ptr, + DBUS_TYPE_STRING, &str_ptr, + DBUS_TYPE_INVALID); + + if (dbus_error_is_set(&err)) { + error("Can't extract message arguments:%s", err.message); + dbus_error_free(&err); + return error_invalid_arguments(conn, msg); + } if (strlen(str_ptr) == 0) { error("Alias change failed: Invalid parameter"); @@ -855,9 +916,9 @@ static DBusHandlerResult handle_dev_set_remote_alias_req(DBusConnection *conn, D str2ba(addr_ptr, &bdaddr); - err = set_device_alias(dbus_data->dev_id, &bdaddr, str_ptr); - if (err < 0) - return error_failed(conn, msg, -err); + ecode = set_device_alias(dbus_data->dev_id, &bdaddr, str_ptr); + if (ecode < 0) + return error_failed(conn, msg, -ecode); signal = dev_signal_factory(dbus_data->dev_id, "RemoteAliasChanged", DBUS_TYPE_STRING, &addr_ptr, @@ -879,17 +940,28 @@ static DBusHandlerResult handle_dev_set_remote_alias_req(DBusConnection *conn, D static DBusHandlerResult handle_dev_last_seen_req(DBusConnection *conn, DBusMessage *msg, void *data) { struct hci_dbus_data *dbus_data = data; - DBusMessageIter iter; DBusMessage *reply; + DBusError err; char filename[PATH_MAX + 1]; char addr[18], *addr_ptr, *str; + int ecode; - get_device_address(dbus_data->dev_id, addr, sizeof(addr)); + 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_message_iter_init(msg, &iter); - dbus_message_iter_get_basic(&iter, &addr_ptr); + dbus_error_init(&err); + dbus_message_get_args(msg, &err, + DBUS_TYPE_STRING, &addr_ptr, + DBUS_TYPE_INVALID); + + if (dbus_error_is_set(&err)) { + error("Can't extract message arguments:%s", err.message); + dbus_error_free(&err); + return error_invalid_arguments(conn, msg); + } str = textfile_get(filename, addr_ptr); if (!str) @@ -912,17 +984,28 @@ static DBusHandlerResult handle_dev_last_seen_req(DBusConnection *conn, DBusMess static DBusHandlerResult handle_dev_last_used_req(DBusConnection *conn, DBusMessage *msg, void *data) { struct hci_dbus_data *dbus_data = data; - DBusMessageIter iter; DBusMessage *reply; + DBusError err; char filename[PATH_MAX + 1]; char addr[18], *addr_ptr, *str; + int ecode; - get_device_address(dbus_data->dev_id, addr, sizeof(addr)); + 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_message_iter_init(msg, &iter); - dbus_message_iter_get_basic(&iter, &addr_ptr); + dbus_error_init(&err); + dbus_message_get_args(msg, &err, + DBUS_TYPE_STRING, &addr_ptr, + DBUS_TYPE_INVALID); + + if (dbus_error_is_set(&err)) { + error("Can't extract message arguments:%s", err.message); + dbus_error_free(&err); + return error_invalid_arguments(conn, msg); + } str = textfile_get(filename, addr_ptr); if (!str) @@ -952,9 +1035,9 @@ static DBusHandlerResult handle_dev_create_bonding_req(DBusConnection *conn, DBu char *peer_addr; char *str; struct hci_dbus_data *dbus_data = data; - struct slist *tmp_list; + struct slist *l; bdaddr_t peer_bdaddr; - int dd, handle; + int dd, handle, ecode; bonding_state_t bonding_state; dbus_error_init(&err); @@ -971,12 +1054,14 @@ static DBusHandlerResult handle_dev_create_bonding_req(DBusConnection *conn, DBu str2ba(peer_addr, &peer_bdaddr); /* check if there is a pending bonding request */ - tmp_list = slist_find(dbus_data->bonding_requests, &peer_bdaddr, bonding_requests_find); + l = slist_find(dbus_data->bonding_requests, &peer_bdaddr, bonding_requests_find); - if (tmp_list) + if (l) return error_bonding_in_progress(conn, msg); - get_device_address(dbus_data->dev_id, local_addr, sizeof(local_addr)); + ecode = get_device_address(dbus_data->dev_id, local_addr, sizeof(local_addr)); + if (ecode < 0) /* FIXME: remove the peer bdaddr from the list */ + return error_failed(conn, msg, -ecode); /* check if a link key already exists */ snprintf(filename, PATH_MAX, "%s/%s/linkkeys", STORAGEDIR, local_addr); @@ -1069,9 +1154,9 @@ static DBusHandlerResult handle_dev_remove_bonding_req(DBusConnection *conn, DBu { struct hci_dbus_data *dbus_data = data; DBusConnection *connection = get_dbus_connection(); - DBusMessageIter iter; DBusMessage *reply; DBusMessage *signal; + DBusError err; char filename[PATH_MAX + 1]; char addr[18], *addr_ptr; struct hci_conn_info_req *cr; @@ -1086,8 +1171,16 @@ static DBusHandlerResult handle_dev_remove_bonding_req(DBusConnection *conn, DBu snprintf(filename, PATH_MAX, "%s/%s/linkkeys", STORAGEDIR, addr); - dbus_message_iter_init(msg, &iter); - dbus_message_iter_get_basic(&iter, &addr_ptr); + dbus_error_init(&err); + dbus_message_get_args(msg, &err, + DBUS_TYPE_STRING, &addr_ptr, + DBUS_TYPE_INVALID); + + if (dbus_error_is_set(&err)) { + error("Can't extract message arguments:%s", err.message); + dbus_error_free(&err); + return error_invalid_arguments(conn, msg); + } /* Delete the link key from storage */ textfile_del(filename, addr_ptr); @@ -1144,18 +1237,29 @@ static DBusHandlerResult handle_dev_remove_bonding_req(DBusConnection *conn, DBu static DBusHandlerResult handle_dev_has_bonding_req(DBusConnection *conn, DBusMessage *msg, void *data) { struct hci_dbus_data *dbus_data = data; - DBusMessageIter iter; DBusMessage *reply; + DBusError err; char filename[PATH_MAX + 1]; char addr[18], *addr_ptr, *str; dbus_bool_t result; + int ecode; - get_device_address(dbus_data->dev_id, addr, sizeof(addr)); + 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_message_iter_init(msg, &iter); - dbus_message_iter_get_basic(&iter, &addr_ptr); + dbus_error_init(&err); + dbus_message_get_args(msg, &err, + DBUS_TYPE_STRING, &addr_ptr, + DBUS_TYPE_INVALID); + + if (dbus_error_is_set(&err)) { + error("Can't extract message arguments:%s", err.message); + dbus_error_free(&err); + return error_invalid_arguments(conn, msg); + } str = textfile_get(filename, addr_ptr); if (str) { @@ -1187,8 +1291,11 @@ static DBusHandlerResult handle_dev_list_bondings_req(DBusConnection *conn, DBus DBusMessage *reply; char filename[PATH_MAX + 1]; char addr[18]; + int ecode; - get_device_address(dbus_data->dev_id, addr, sizeof(addr)); + 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); @@ -1209,19 +1316,29 @@ static DBusHandlerResult handle_dev_list_bondings_req(DBusConnection *conn, DBus static DBusHandlerResult handle_dev_get_pin_code_length_req(DBusConnection *conn, DBusMessage *msg, void *data) { struct hci_dbus_data *dbus_data = data; - DBusMessageIter iter; DBusMessage *reply; + DBusError err; bdaddr_t local, peer; char addr[18], *addr_ptr; uint8_t length; - int len; + int len, ecode; - get_device_address(dbus_data->dev_id, addr, sizeof(addr)); + ecode = get_device_address(dbus_data->dev_id, addr, sizeof(addr)); + if (ecode < 0) + return error_failed(conn, msg, -ecode); str2ba(addr, &local); - dbus_message_iter_init(msg, &iter); - dbus_message_iter_get_basic(&iter, &addr_ptr); + dbus_error_init(&err); + dbus_message_get_args(msg, &err, + DBUS_TYPE_STRING, &addr_ptr, + DBUS_TYPE_INVALID); + + if (dbus_error_is_set(&err)) { + error("Can't extract message arguments:%s", err.message); + dbus_error_free(&err); + return error_invalid_arguments(conn, msg); + } str2ba(addr_ptr, &peer); @@ -1242,15 +1359,23 @@ static DBusHandlerResult handle_dev_get_pin_code_length_req(DBusConnection *conn static DBusHandlerResult handle_dev_get_encryption_key_size_req(DBusConnection *conn, DBusMessage *msg, void *data) { struct hci_dbus_data *dbus_data = data; - DBusMessageIter iter; DBusMessage *reply; + DBusError err; bdaddr_t bdaddr; char *addr_ptr; uint8_t size; int val; - dbus_message_iter_init(msg, &iter); - dbus_message_iter_get_basic(&iter, &addr_ptr); + dbus_error_init(&err); + dbus_message_get_args(msg, &err, + DBUS_TYPE_STRING, &addr_ptr, + DBUS_TYPE_INVALID); + + if (dbus_error_is_set(&err)) { + error("Can't extract message arguments:%s", err.message); + dbus_error_free(&err); + return error_invalid_arguments(conn, msg); + } str2ba(addr_ptr, &bdaddr); |