Re: [PATCH BlueZ] obexd: Fix not destroying session if owner disconnects

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

On Fri, Sep 11, 2015 at 10:16 AM, Luiz Augusto von Dentz
<luiz.dentz@xxxxxxxxx> wrote:
> From: Luiz Augusto von Dentz <luiz.von.dentz@xxxxxxxxx>
>
> If the owner disconnects the session should be destroyed even if the
> connection is pending:
>
> obexd/client/session.c:owner_disconnected()
> obexd/client/session.c:obc_session_shutdown() 0x822abb8
> obexd/client/session.c:obc_session_ref() 0x822abb8: ref=3
> obexd/client/session.c:obc_session_unref() 0x822abb8: ref=2
> obexd/client/bluetooth.c:transport_connect() port 19
> obexd/client/bluetooth.c:transport_callback()
> obexd/client/session.c:transport_func()
> obexd/client/bluetooth.c:bluetooth_getpacketopt()
> obexd/client/pbap.c:pbap_probe() /org/bluez/obex/client/session1
> obexd/client/session.c:obc_session_ref() 0x822abb8: ref=3
> obexd/client/session.c:obc_session_register() Session(0x822abb8) registered /org/bluez/obex/client/session1
> obexd/client/session.c:obc_session_unref() 0x822abb8: ref=2
>
> To fix this the code now checks if the connect callback is pending, in
> that case destroy the callback releasing the reference it carrying.
> ---
>  obexd/client/session.c | 34 ++++++++++++++++++++++++++++------
>  1 file changed, 28 insertions(+), 6 deletions(-)
>
> diff --git a/obexd/client/session.c b/obexd/client/session.c
> index d6da0a7..7248768 100644
> --- a/obexd/client/session.c
> +++ b/obexd/client/session.c
> @@ -112,6 +112,7 @@ struct obc_session {
>         GQueue *queue;
>         guint process_id;
>         char *folder;
> +       struct callback_data *callback;
>  };
>
>  static GSList *sessions = NULL;
> @@ -303,6 +304,16 @@ disconnect:
>         session_free(session);
>  }
>
> +static void callback_destroy(struct callback_data *callback, GError *err)
> +{
> +       struct obc_session *session = callback->session;
> +
> +       callback->func(session, NULL, err, callback->data);
> +       g_free(callback);
> +       session->callback = NULL;
> +       obc_session_unref(session);
> +}
> +
>  static void connect_cb(GObex *obex, GError *err, GObexPacket *rsp,
>                                                         gpointer user_data)
>  {
> @@ -322,11 +333,9 @@ static void connect_cb(GObex *obex, GError *err, GObexPacket *rsp,
>                                 "OBEX Connect failed with 0x%02x", rsp_code);
>
>  done:
> -       callback->func(callback->session, NULL, gerr, callback->data);
> +       callback_destroy(callback, gerr);
>         if (gerr != NULL)
>                 g_error_free(gerr);
> -       obc_session_unref(callback->session);
> -       g_free(callback);
>  }
>
>  static void session_disconnected(GObex *obex, GError *err, gpointer user_data)
> @@ -415,17 +424,28 @@ static void transport_func(GIOChannel *io, GError *err, gpointer user_data)
>
>         return;
>  done:
> -       callback->func(callback->session, NULL, err, callback->data);
> -       obc_session_unref(callback->session);
> -       g_free(callback);
> +       callback_destroy(callback, err);
>  }
>
>  static void owner_disconnected(DBusConnection *connection, void *user_data)
>  {
>         struct obc_session *session = user_data;
> +       GError *err;
>
>         DBG("");
>
> +       /*
> +        * If connection still connecting notify the callback to destroy the
> +        * session.
> +        */
> +       if (session->callback) {
> +               err = g_error_new(OBEX_IO_ERROR, OBEX_IO_DISCONNECTED,
> +                                               "Session closed by user");
> +               callback_destroy(session->callback, err);
> +               g_error_free(err);
> +               return;
> +       }
> +
>         obc_session_shutdown(session);
>  }
>
> @@ -531,6 +551,8 @@ static int session_connect(struct obc_session *session,
>                 return -EINVAL;
>         }
>
> +       session->callback = callback;
> +
>         return 0;
>  }
>
> --
> 2.4.3

Applied.


-- 
Luiz Augusto von Dentz
--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux