telepathy-mission-control: servicetest: don' t eavesdrop on method replies or errors
Simon McVittie
smcv at kemper.freedesktop.org
Fri Sep 7 09:34:44 PDT 2012
Module: telepathy-mission-control
Branch: master
Commit: 0bb531d7856f4b79edd7d328cef59e58f7f08ac8
URL: http://cgit.freedesktop.org/telepathy/telepathy-mission-control/commit/?id=0bb531d7856f4b79edd7d328cef59e58f7f08ac8
Author: Simon McVittie <simon.mcvittie at collabora.co.uk>
Date: Fri Aug 31 19:49:30 2012 +0100
servicetest: don't eavesdrop on method replies or errors
Eavesdropping on method replies breaks libdbus if you call methods using the
same connection. You can get into a situation like this:
* Test calls a method on MC; say the serial number is 42
* At around the same time, MC calls a method on gnome-keyring and also uses
serial number 42
* gnome-keyring replies, labelled "in reply to 42"
* Test is eavesdropping, so it sees the reply going from gnome-keyring to MC
* Test interprets the reply from gnome-keyring to MC as the reply it was
expecting from MC, sees completely the wrong types, and becomes
confused
This seems unlikely - but because serial numbers are sequential and
start from 1 for each connection (as opposed to starting from a random
offset), two connections can quite easily happen to sync up. I saw it
happen most recently in the gnome-keyring test. With the benefit
of hindsight, I think I've seen this before: whenever the tests
made an Introspect() call which returned a type other than 's', that
was probably this bug.
We never actually generated events for messages other than signals and
method calls, so match those ones specifically, and don't eavesdrop on
replies.
Bug: https://bugs.freedesktop.org/show_bug.cgi?id=54495
Signed-off-by: Simon McVittie <simon.mcvittie at collabora.co.uk>
Reviewed-by: Jonny Lamb <jonny.lamb at collabora.co.uk>
---
tests/twisted/servicetest.py | 10 +++++-----
1 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/tests/twisted/servicetest.py b/tests/twisted/servicetest.py
index c0c63ed..6041831 100644
--- a/tests/twisted/servicetest.py
+++ b/tests/twisted/servicetest.py
@@ -316,12 +316,12 @@ class IteratingEventQueue(BaseEventQueue):
try:
# for dbus > 1.5
- bus.add_match_string("eavesdrop=true")
+ bus.add_match_string("eavesdrop=true,type='signal'")
except dbus.DBusException:
- pass
-
- # for dbus 1.4
- bus.add_match_string("")
+ bus.add_match_string("type='signal'")
+ bus.add_match_string("type='method_call'")
+ else:
+ bus.add_match_string("eavesdrop=true,type='method_call'")
bus.add_message_filter(self._dbus_filter_bound_method)
More information about the telepathy-commits
mailing list