diff options
| author | Claudio Takahasi <claudio.takahasi@openbossa.org> | 2006-03-21 18:22:39 +0000 | 
|---|---|---|
| committer | Claudio Takahasi <claudio.takahasi@openbossa.org> | 2006-03-21 18:22:39 +0000 | 
| commit | 895eb547951b582fc690528172786232fbb21698 (patch) | |
| tree | 5bf93db8e93c79b10267a896233268bfcabb55bc | |
| parent | 4035bbcc0de791e3fa222d8d8ceba6f589e94c8b (diff) | |
Added bluetooth address validation and fixed adapter msg function handler to catch not implemented methods
| -rw-r--r-- | hcid/dbus-adapter.c | 139 | 
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);  }  | 
