Skip to content

Commit

Permalink
[dsme] Avoid recursion during dsmesock disconnecting. Fixes JB#38474
Browse files Browse the repository at this point in the history
Using availability of dsme dbus service as an trigger for disconnecting
also the dsmesock connection creates a shutdown time hazard where mce
attempts to recursively deactivate process watchdog on an already closed
connection.

As dsme dropping from systembus no longer means that dsme is about to
exit, do not trigger dsmesock disconnects when dsme service loses name
owner on system bus.

Avoid recursive process watchdog quits during disconnect by doing the
quitting only once / connect after removal of socket io watch.

Drop reconnect attempts on I/O error situations as they are unlikely
to do any good and can lead to further recursive behavior.

Do not initiate new dsmesock connections while device is shutting down.

Signed-off-by: Simo Piiroinen <simo.piiroinen@jollamobile.com>
  • Loading branch information
spiiroin committed Apr 26, 2017
1 parent 4a7cb6a commit 2995b4d
Showing 1 changed file with 24 additions and 27 deletions.
51 changes: 24 additions & 27 deletions mce-dsme.c
Expand Up @@ -123,7 +123,6 @@ static gboolean mce_dsme_socket_recv_cb (GIOChannel *source, GIOCondi
static bool mce_dsme_socket_is_connected (void);
static bool mce_dsme_socket_connect (void);
static void mce_dsme_socket_disconnect (void);
static void mce_dsme_socket_reconnect (void);

/* ------------------------------------------------------------------------- *
* DBUS_HANDLERS
Expand Down Expand Up @@ -558,6 +557,10 @@ static void mce_dsme_set_shutting_down(bool shutting_down)
mce_log(LL_DEVEL, "Shutdown %s",
mce_dsme_shutting_down_flag ? "started" : "canceled");

/* Re-evaluate dsmesock connection */
if( !mce_dsme_shutting_down_flag )
mce_dsme_socket_connect();

execute_datapipe(&shutting_down_pipe,
GINT_TO_POINTER(mce_dsme_shutting_down_flag),
USE_INDATA, CACHE_INDATA);
Expand Down Expand Up @@ -588,10 +591,6 @@ static bool mce_dsme_socket_send(gpointer msg, const char *request_name)
if( dsmesock_send(mce_dsme_socket_connection, msg) == -1) {
mce_log(LL_ERR, "failed to send %s to dsme; %m",
request_name);

/* close and try to re-connect */
mce_dsme_socket_reconnect();
goto EXIT;
}

mce_log(LL_DEBUG, "%s sent to DSME", request_name);
Expand Down Expand Up @@ -688,8 +687,17 @@ static bool mce_dsme_socket_connect(void)
{
GIOChannel *iochan = NULL;

/* Make sure we start from closed state */
mce_dsme_socket_disconnect();
/* No new connections during shutdown */
if( mce_dsme_is_shutting_down() )
goto EXIT;

/* No new connections unless dsme dbus service is up */
if( dsme_available != SERVICE_STATE_RUNNING )
goto EXIT;

/* Already connected ? */
if( mce_dsme_socket_recv_id )
goto EXIT;

mce_log(LL_DEBUG, "Opening DSME socket");

Expand Down Expand Up @@ -721,39 +729,32 @@ static bool mce_dsme_socket_connect(void)
EXIT:
if( iochan ) g_io_channel_unref(iochan);

if( !mce_dsme_socket_recv_id )
mce_dsme_socket_disconnect();

return mce_dsme_socket_is_connected();
}

/** Close dsmesock connection
*/
static void mce_dsme_socket_disconnect(void)
{
if( mce_dsme_socket_is_connected() )
mce_dsme_processwd_quit();

if( mce_dsme_socket_recv_id ) {
mce_log(LL_DEBUG, "Removing DSME socket notifier");
g_source_remove(mce_dsme_socket_recv_id);
mce_dsme_socket_recv_id = 0;

/* Still having had a live socket notifier means: We have
* initiated the dsmesock disconnect and need to deactivate
* the process watchdog before actually disconnecting. */
mce_dsme_processwd_quit();
}

if( mce_dsme_socket_connection ) {
mce_log(LL_DEBUG, "Closing DSME socket");
dsmesock_close(mce_dsme_socket_connection);
mce_dsme_socket_connection = 0;
}

// FIXME: should we assume something about the system state?
}

/** Close dsmesock connection and reconnect if/when dsme is available
*/
static void mce_dsme_socket_reconnect(void)
{
mce_dsme_socket_disconnect();

if( dsme_available == SERVICE_STATE_RUNNING )
mce_dsme_socket_connect();
}

/* ========================================================================= *
Expand Down Expand Up @@ -896,10 +897,9 @@ static void mce_dsme_datapipe_dsme_available_cb(gconstpointer const data)
service_state_repr(prev),
service_state_repr(dsme_available));

/* Re-evaluate dsmesock connection */
if( dsme_available == SERVICE_STATE_RUNNING )
mce_dsme_socket_connect();
else
mce_dsme_socket_disconnect();

EXIT:
return;
Expand Down Expand Up @@ -1035,9 +1035,6 @@ void mce_dsme_exit(void)

mce_dsme_dbus_quit();

if( mce_dsme_socket_is_connected() )
mce_dsme_processwd_quit();

mce_dsme_socket_disconnect();

mce_dsme_datapipe_quit();
Expand Down

0 comments on commit 2995b4d

Please sign in to comment.