dbus-send: Validate interface, member names before use

Instead of a failed check or assertion failure and a core dump, let's
produce an error message on stderr and a graceful nonzero exit status.
It's still not going to *work*, but at least we can avoid crashing.

    $ dbus-send / com.example.Nope..Nope
    Interface name was not valid: 'com.example.Nope.'
    $ dbus-send / com.example.Nope.0
    Invalid signal name: Member name was not valid: '0'

Resolves: dbus#338
Signed-off-by: Simon McVittie <smcv@collabora.com>
This commit is contained in:
Simon McVittie 2021-06-21 12:04:05 +01:00
parent dde5c8fdc4
commit a42a07a1fb

View file

@ -488,7 +488,23 @@ main (int argc, char *argv[])
exit (1);
}
*last_dot = '\0';
if (!dbus_validate_interface (name, &error))
{
/* Typically this is "Interface name was not valid: \"xxx\""
* so we don't need to prefix anything special */
fprintf (stderr, "%s\n", error.message);
dbus_error_free (&error);
exit (1);
}
if (!dbus_validate_member (last_dot + 1, &error))
{
fprintf (stderr, "Invalid method name: %s\n", error.message);
dbus_error_free (&error);
exit (1);
}
message = dbus_message_new_method_call (NULL,
path,
name,
@ -508,7 +524,21 @@ main (int argc, char *argv[])
exit (1);
}
*last_dot = '\0';
if (!dbus_validate_interface (name, &error))
{
fprintf (stderr, "%s\n", error.message);
dbus_error_free (&error);
exit (1);
}
if (!dbus_validate_member (last_dot + 1, &error))
{
fprintf (stderr, "Invalid signal name: %s\n", error.message);
dbus_error_free (&error);
exit (1);
}
message = dbus_message_new_signal (path, name, last_dot + 1);
handle_oom (message != NULL);
}