From e650e2542386119c59dee3570ab75210d8bc7ffd Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Sat, 18 Feb 2017 15:05:06 +0100 Subject: [PATCH] tests: Add test for dbus fd passing failures The server will exhaust all fds before the fd list in the dbus request is opened. We do expect it to fail in the client. https://bugzilla.gnome.org/show_bug.cgi?id=778540 --- tests/Makefile.am | 1 + tests/dbus/filedescriptor-errors.test | 77 +++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 tests/dbus/filedescriptor-errors.test diff --git a/tests/Makefile.am b/tests/Makefile.am index f824f4e4e..268409bc0 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -247,6 +247,7 @@ TESTS = \ dbus/async-errors.test \ dbus/signals.test \ dbus/filedescriptor.test \ + dbus/filedescriptor-errors.test \ dbus/dicts.test \ dbus/bug596862.vala \ dbus/bug602003.test \ diff --git a/tests/dbus/filedescriptor-errors.test b/tests/dbus/filedescriptor-errors.test new file mode 100644 index 000000000..96f28cff9 --- /dev/null +++ b/tests/dbus/filedescriptor-errors.test @@ -0,0 +1,77 @@ +Packages: gio-2.0 gio-unix-2.0 posix +D-Bus + +Program: client + +[DBus (name = "org.example.Test")] +interface Test : Object { + public abstract string test (UnixOutputStream output_stream) throws IOError; +} + +void pipe (out UnixInputStream input, out UnixOutputStream output) throws IOError { + int pipefd[2]; + if (Posix.pipe (pipefd) < 0) { + throw new IOError.FAILED ("Pipe creation failed"); + } + input = new UnixInputStream (pipefd[0], true); + output = new UnixOutputStream (pipefd[1], true); +} + +void main () { + // client + Test test = Bus.get_proxy_sync (BusType.SESSION, "org.example.Test", "/org/example/test"); + + UnixInputStream i; + UnixOutputStream o; + pipe (out i, out o); + + try { + test.test (o); + // We expect the request to fail + assert_not_reached (); + } catch (Error e) { + } +} + +Program: server + +[DBus (name = "org.example.Test")] +class Test : Object { + public void test (UnixOutputStream output_stream) throws IOError { + uint8[] buffer = new uint8[1]; + buffer[0] = 42; + output_stream.write (buffer); + } +} + +MainLoop main_loop; + +void client_exit (Pid pid, int status) { + // client finished, terminate server + assert (status == 0); + main_loop.quit (); +} + +void main () { + var conn = Bus.get_sync (BusType.SESSION); + conn.register_object ("/org/example/test", new Test ()); + + // try to register service in session bus + var request_result = conn.call_sync ("org.freedesktop.DBus", "/org/freedesktop/DBus", "org.freedesktop.DBus", "RequestName", + new Variant ("(su)", "org.example.Test", 0x4), null, 0, -1); + assert ((uint) request_result.get_child_value (0) == 1); + + // server ready, spawn client + Pid client_pid; + Process.spawn_async (null, { "test", "/dbus/filedescriptor-errors/client" }, null, SpawnFlags.DO_NOT_REAP_CHILD, null, out client_pid); + ChildWatch.add (client_pid, client_exit); + + main_loop = new MainLoop (); + + /* Exhaust fds before the incoming request */ + int fd = 0; + while (fd >= 0) + fd = Posix.open ("/", 0); + + main_loop.run (); +} -- 2.47.3