Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Check types of method/signal arguments and return values #118

Open
mvidner opened this issue Jul 19, 2022 · 0 comments
Open

Check types of method/signal arguments and return values #118

mvidner opened this issue Jul 19, 2022 · 0 comments

Comments

@mvidner
Copy link
Owner

mvidner commented Jul 19, 2022

Both at the client and service side we should add type checking of method arguments and return values

(This is related to #97 which was specifically about properties)

  1. Client method arguments, emitting signals: trying to use a string instead of an integer, or the other way around, will raise an exception before the bus sees the wrong type, but the exception is an implementation accident. It should be an explicit

    type A was expected but type B was seen, in argument foo

    (the the method and interface names will be easily seen from the backtrace)

  2. Client return values: not trying to catch confused/malicious services for now

  3. Service method arguments: this should be avoided by client libraries paying attention to introspection data and doing their own type checking (see (1)), but it is relatively easy to send a mistyped call. Here an example of passing an integer where a string is expected, the caller gets to see an exception caused by the wrong type:

    $ dbus-send --print-reply --session --dest=org.ruby.service /org/ruby/MyInstance org.ruby.AnotherInterface.Reverse uint32:42 
    Error org.freedesktop.DBus.Error.Failed: undefined method `split' for 42:Integer
    
         outstr = instr.split(//).reverse.join
                        ^^^^^^; caused by 1 sender=:1.1226 -> dest=org.ruby.service serial=2 reply_serial= path=/org/ruby/MyInstance;  interface=org.ruby.AnotherInterface; member=Reverse error_name=

    TODO: find a well known error name+format for type errors

    Listening for signals: what if someone sends a mistyped signal? Could be even pretty easy if the listener filters only on interface and not a well-known sender

    Properties.Set with a wrong type: I know I said this was about methods, not properties, but I think this check is still missing :-(

  4. Service return values: similar to (1)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant