From: <svn...@op...> - 2009-03-30 11:05:49
|
Author: bellmich Date: Mon Mar 30 13:05:37 2009 New Revision: 1023 URL: http://libsyncml.opensync.org/changeset/1023 Log: - fixed duplicate disconnects which can cause memory leaks - fixed wrong trace statement Modified: trunk/libsyncml/sml_transport.c Modified: trunk/libsyncml/sml_transport.c ============================================================================== --- trunk/libsyncml/sml_transport.c Thu Mar 26 17:54:02 2009 (r1022) +++ trunk/libsyncml/sml_transport.c Mon Mar 30 13:05:37 2009 (r1023) @@ -148,6 +148,26 @@ smlTrace(TRACE_INTERNAL, "%s: No disconnect function", __func__); break; } + /* If there is a disconnect request + * but the connection is already down + * then an earlier disconnect happened + * (perhaps initiated by the remote peer) + * and we can ignore the disconnect. + */ + if (smlTransportIsServer(tsp) && !cmd->link->link_data) { + /* The SERVER is already disconnected. */ + smlTrace(TRACE_INTERNAL, + "%s: The server link was already disconnected.", + __func__); + break; + } + if (!smlTransportIsServer(tsp) && !tsp->connected) { + /* The CLIENT is already disconnected. */ + smlTrace(TRACE_INTERNAL, + "%s: The client was already disconnected.", + __func__); + break; + } tsp->functions.disconnect(tsp->transport_data, cmd->link ? cmd->link->link_data : NULL); break; } @@ -287,7 +307,7 @@ { if (!smlTransportIsServer(tsp)) g_error("A disconnect event with a link was received " \ - "but the transport layer is a server."); + "but the transport layer is not a server."); if (link->link_data) g_error("A disconnect event with a link was received " \ "but the link still contains the " \ |