]> git.ipfire.org Git - thirdparty/dbus.git/commitdiff
dbus-send: Validate interface, member names before use
authorSimon McVittie <smcv@collabora.com>
Mon, 21 Jun 2021 11:04:05 +0000 (12:04 +0100)
committerSimon McVittie <smcv@collabora.com>
Mon, 21 Jun 2021 11:04:05 +0000 (12:04 +0100)
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>
tools/dbus-send.c

index b6b2d6757186bbc2e7b8a6ab6f2d554828bae8d1..65f9854eec7ec6843f2859a36462b87de458a190 100644 (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);
     }