On Thu, Sep 03, 2015 at 04:29:21PM +0200, Marcus Folkesson wrote:
> dbus library calls abort() if it got a non-expected type passed to it.
> ---
> src/agent-connman.c | 89
> +++++++++++++++++++++++++++++++++++++++++++++++++++--
> 1 file changed, 86 insertions(+), 3 deletions(-)
>
> diff --git a/src/agent-connman.c b/src/agent-connman.c
> index 2d714b5..381fd25 100644
> --- a/src/agent-connman.c
> +++ b/src/agent-connman.c
> @@ -54,6 +54,34 @@ static bool check_reply_has_dict(DBusMessage *reply)
> return false;
> }
>
> +static bool check_message_is_basic_type(DBusMessageIter *entry)
> +{
> + int type = dbus_message_iter_get_arg_type(entry);
> + switch (type) {
> + case DBUS_TYPE_BYTE:
> + case DBUS_TYPE_BOOLEAN:
> + case DBUS_TYPE_INT16:
> + case DBUS_TYPE_UINT16:
> + case DBUS_TYPE_INT32:
> + case DBUS_TYPE_UINT32:
> + case DBUS_TYPE_INT64:
> + case DBUS_TYPE_UINT64:
> + case DBUS_TYPE_DOUBLE:
> + case DBUS_TYPE_STRING:
> + case DBUS_TYPE_OBJECT_PATH:
> + case DBUS_TYPE_SIGNATURE:
> + case DBUS_TYPE_UNIX_FD:
> + return true;
> +
> + case DBUS_TYPE_VARIANT:
> + case DBUS_TYPE_ARRAY:
> + case DBUS_TYPE_STRUCT:
> + case DBUS_TYPE_DICT_ENTRY:
> + default:
> + return false;
> + }
> +}
> +
> struct request_input_reply {
> struct connman_service *service;
> struct connman_peer *peer;
> @@ -110,7 +138,14 @@ static void request_input_passphrase_reply(DBusMessage
> *reply, void *user_data)
> if (dbus_message_iter_get_arg_type(&entry)
> != DBUS_TYPE_VARIANT)
> break;
> +
> dbus_message_iter_recurse(&entry, &value);
> + if (!check_message_is_basic_type(&value)) {
> + error = CONNMAN_ERROR_INTERFACE
> ".InvalidArguments";
> + values_received = false;
> + break;
> + }
> +
> dbus_message_iter_get_basic(&value, &identity);
>
> } else if (g_str_equal(key, "Passphrase")) {
> @@ -118,7 +153,14 @@ static void request_input_passphrase_reply(DBusMessage
> *reply, void *user_data)
> if (dbus_message_iter_get_arg_type(&entry)
> != DBUS_TYPE_VARIANT)
> break;
> +
> dbus_message_iter_recurse(&entry, &value);
> + if (!check_message_is_basic_type(&value)) {
> + error = CONNMAN_ERROR_INTERFACE
> ".InvalidArguments";
> + values_received = false;
> + break;
> + }
> +
> dbus_message_iter_get_basic(&value, &passphrase);
>
> } else if (g_str_equal(key, "WPS")) {
> @@ -128,7 +170,14 @@ static void request_input_passphrase_reply(DBusMessage
> *reply, void *user_data)
> if (dbus_message_iter_get_arg_type(&entry)
> != DBUS_TYPE_VARIANT)
> break;
> +
> dbus_message_iter_recurse(&entry, &value);
> + if (!check_message_is_basic_type(&value)) {
> + error = CONNMAN_ERROR_INTERFACE
> ".InvalidArguments";
> + values_received = false;
> + break;
> + }
> +
> dbus_message_iter_get_basic(&value, &wpspin);
> break;
> } else if (g_str_equal(key, "Name")) {
> @@ -136,7 +185,14 @@ static void request_input_passphrase_reply(DBusMessage
> *reply, void *user_data)
> if (dbus_message_iter_get_arg_type(&entry)
> != DBUS_TYPE_VARIANT)
> break;
> +
> dbus_message_iter_recurse(&entry, &value);
> + if (!check_message_is_basic_type(&value)) {
> + error = CONNMAN_ERROR_INTERFACE
> ".InvalidArguments";
> + values_received = false;
> + break;
> + }
> +
> dbus_message_iter_get_basic(&value, &name);
> name_len = strlen(name);
> } else if (g_str_equal(key, "SSID")) {
> @@ -144,16 +200,25 @@ static void request_input_passphrase_reply(DBusMessage
> *reply, void *user_data)
>
> dbus_message_iter_next(&entry);
> if (dbus_message_iter_get_arg_type(&entry)
> - != DBUS_TYPE_VARIANT)
> + != DBUS_TYPE_VARIANT) {
> + error = CONNMAN_ERROR_INTERFACE
> ".InvalidArguments";
> + values_received = false;
> break;
> + }
> dbus_message_iter_recurse(&entry, &value);
> if (dbus_message_iter_get_arg_type(&value)
> - != DBUS_TYPE_ARRAY)
> + != DBUS_TYPE_ARRAY) {
> + error = CONNMAN_ERROR_INTERFACE
> ".InvalidArguments";
> + values_received = false;
> break;
> + }
> dbus_message_iter_recurse(&value, &array_iter);
> if (dbus_message_iter_get_arg_type(&array_iter)
> - != DBUS_TYPE_BYTE)
> + != DBUS_TYPE_BYTE) {
> + error = CONNMAN_ERROR_INTERFACE
> ".InvalidArguments";
> + values_received = false;
> break;
> + }
> dbus_message_iter_get_fixed_array(&array_iter, &name,
> &name_len);
> }
> @@ -401,7 +466,14 @@ static void request_input_login_reply(DBusMessage
> *reply, void *user_data)
> if (dbus_message_iter_get_arg_type(&entry)
> != DBUS_TYPE_VARIANT)
> break;
> +
> dbus_message_iter_recurse(&entry, &value);
> + if (!check_message_is_basic_type(&value)) {
> + error = CONNMAN_ERROR_INTERFACE
> ".InvalidArguments";
> + values_received = false;
> + break;
> + }
> +
> dbus_message_iter_get_basic(&value, &username);
>
> } else if (g_str_equal(key, "Password")) {
> @@ -410,6 +482,12 @@ static void request_input_login_reply(DBusMessage
> *reply, void *user_data)
> DBUS_TYPE_VARIANT)
> break;
> dbus_message_iter_recurse(&entry, &value);
> + if (!check_message_is_basic_type(&value)) {
> + error = CONNMAN_ERROR_INTERFACE
> ".InvalidArguments";
> + values_received = false;
> + break;
> + }
> +
> dbus_message_iter_get_basic(&value, &password);
> }
>
> @@ -718,6 +796,11 @@ static void request_peer_authorization_reply(DBusMessage
> *reply,
> != DBUS_TYPE_VARIANT)
> break;
> dbus_message_iter_recurse(&entry, &value);
> + if (!check_message_is_basic_type(&value)) {
> + error = CONNMAN_ERROR_INTERFACE
> ".InvalidArguments";
> + break;
> + }
> +
> dbus_message_iter_get_basic(&value, &wpspin);
> break;
> }
> --
> 1.9.1
>
Just saw a patch from jhannika posted on the channel:
jgke.fi/dump/typecheck.patch
It practically to the same thing.
Cheers,
Marcus Folkesson
_______________________________________________
connman mailing list
[email protected]
https://lists.connman.net/mailman/listinfo/connman