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
connman@connman.net
https://lists.connman.net/mailman/listinfo/connman

Reply via email to