[Telepathy-commits] [telepathy-salut/master] SalutStreamTube: fix a crash on initiator side when the bytestream is closed while not fully open
Alban Crequy
alban.crequy at collabora.co.uk
Mon Dec 1 03:45:53 PST 2008
---
src/tube-stream.c | 35 ++++++++++++++++++++++-------------
1 files changed, 22 insertions(+), 13 deletions(-)
diff --git a/src/tube-stream.c b/src/tube-stream.c
index 8a6e4a9..819db59 100644
--- a/src/tube-stream.c
+++ b/src/tube-stream.c
@@ -128,13 +128,24 @@ struct _SalutTubeStreamPrivate
* direct TCP connections). One tube can have several bytestreams. The
* mapping between the tube bytestream and the transport to the local
* application is stored in the transport_to_bytestream and
- * bytestream_to_transport fields. */
+ * bytestream_to_transport fields. This is used both on initiator-side and
+ * on recipient-side. */
- /* (GibberTransport *) -> (GibberBytestreamIface *) */
- GHashTable *transport_to_bytestream;
- /* (GibberBytestreamIface *) -> (GibberTransport *) */
+ /* (GibberBytestreamIface *) -> (GibberTransport *)
+ *
+ * The (b->t) is inserted as soon as they are created. On initiator side,
+ * we receive an incoming bytestream, create a transport and insert (b->t).
+ * On recipient side, we receive an incoming transport, create a bytestream
+ * and insert (b->t).
+ */
GHashTable *bytestream_to_transport;
+ /* (GibberTransport *) -> (GibberBytestreamIface *)
+ *
+ * The (t->b) is inserted when the bytestream is open.
+ */
+ GHashTable *transport_to_bytestream;
+
TpHandle initiator;
gchar *service;
GHashTable *parameters;
@@ -210,7 +221,7 @@ transport_handler (GibberTransport *transport,
bytestream = g_hash_table_lookup (priv->transport_to_bytestream, transport);
if (bytestream == NULL)
{
- DEBUG ("no bytestream associated with this transport");
+ DEBUG ("no open bytestream associated with this transport");
return;
}
@@ -238,19 +249,19 @@ transport_disconnected_cb (GibberTransport *transport,
static void
remove_transport (SalutTubeStream *self,
+ GibberBytestreamIface *bytestream,
GibberTransport *transport)
{
SalutTubeStreamPrivate *priv = SALUT_TUBE_STREAM_GET_PRIVATE (self);
- GibberBytestreamIface *bytestream;
-
- bytestream = g_hash_table_lookup (priv->transport_to_bytestream, transport);
- g_assert (bytestream != NULL);
DEBUG ("disconnect and remove transport");
g_signal_handlers_disconnect_matched (transport, G_SIGNAL_MATCH_DATA,
0, 0, NULL, NULL, self);
gibber_transport_disconnect (transport);
+
+ /* the transport may not be in transport_to_bytestream if the bytestream was
+ * not fully open */
g_hash_table_remove (priv->transport_to_bytestream, transport);
g_hash_table_remove (priv->bytestream_to_transport, bytestream);
@@ -271,7 +282,7 @@ transport_buffer_empty_cb (GibberTransport *transport,
if (state == GIBBER_BYTESTREAM_STATE_CLOSED)
{
DEBUG ("buffer is now empty. Transport can be removed");
- remove_transport (self, transport);
+ remove_transport (self, bytestream, transport);
return;
}
@@ -291,8 +302,6 @@ add_transport (SalutTubeStream *self,
g_hash_table_insert (priv->transport_to_bytestream,
g_object_ref (transport), g_object_ref (bytestream));
- g_hash_table_insert (priv->bytestream_to_transport,
- g_object_ref (bytestream), g_object_ref (transport));
g_signal_connect (transport, "disconnected",
G_CALLBACK (transport_disconnected_cb), self);
@@ -363,7 +372,7 @@ extra_bytestream_state_changed_cb (GibberBytestreamIface *bytestream,
if (gibber_transport_buffer_is_empty (transport))
{
DEBUG ("Buffer is empty, we can remove the transport");
- remove_transport (self, transport);
+ remove_transport (self, bytestream, transport);
}
else
{
--
1.5.6.5
More information about the Telepathy-commits
mailing list