diff options
author | Simon McVittie <smcv@collabora.com> | 2021-06-21 12:04:05 +0100 |
---|---|---|
committer | Simon McVittie <smcv@collabora.com> | 2021-06-21 12:04:05 +0100 |
commit | a42a07a1fb8afe559e1f2dcc636c8d2a81e44f89 (patch) | |
tree | db45946ee474cd730e0565b1b3e4be72e40d2688 | |
parent | dde5c8fdc42048054683ca985899ef67466ac27a (diff) |
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>
-rw-r--r-- | tools/dbus-send.c | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/tools/dbus-send.c b/tools/dbus-send.c index b6b2d675..65f9854e 100644 --- a/tools/dbus-send.c +++ b/tools/dbus-send.c @@ -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); } |