Skip to content

Commit

Permalink
[alarmtracker] Ignore alarms in act dead if home is encrypted. Fixes …
Browse files Browse the repository at this point in the history
…JB#45727

As alarm data is stored in /home partition, alarms are not supported in
act dead if home is encrypted.

While it can be assumed that timed is not running and thus no alarm
notifications should not be detected, dsme must also ignore persistently
cached next alarm time so that it does not block shutdown from act dead.

Signed-off-by: Simo Piiroinen <simo.piiroinen@jollamobile.com>
  • Loading branch information
spiiroin committed May 16, 2019
1 parent a1e65a4 commit 3070ca1
Show file tree
Hide file tree
Showing 5 changed files with 112 additions and 25 deletions.
4 changes: 4 additions & 0 deletions .depend
Expand Up @@ -160,6 +160,7 @@ modules/abootsettings.pic.o:\

modules/alarmtracker.o:\
modules/alarmtracker.c\
dsme/utility.h\
include/dsme/logging.h\
include/dsme/modules.h\
include/dsme/timers.h\
Expand All @@ -168,6 +169,7 @@ modules/alarmtracker.o:\

modules/alarmtracker.pic.o:\
modules/alarmtracker.c\
dsme/utility.h\
include/dsme/logging.h\
include/dsme/modules.h\
include/dsme/timers.h\
Expand All @@ -176,6 +178,7 @@ modules/alarmtracker.pic.o:\

modules/batterytracker.o:\
modules/batterytracker.c\
dsme/utility.h\
include/dsme/logging.h\
include/dsme/modulebase.h\
include/dsme/modules.h\
Expand All @@ -186,6 +189,7 @@ modules/batterytracker.o:\

modules/batterytracker.pic.o:\
modules/batterytracker.c\
dsme/utility.h\
include/dsme/logging.h\
include/dsme/modulebase.h\
include/dsme/modules.h\
Expand Down
32 changes: 32 additions & 0 deletions dsme/utility.c
Expand Up @@ -42,6 +42,7 @@
static void dsme_free_crypt_device (struct crypt_device *cdev);
static struct crypt_device *dsme_get_crypt_device_for_home(void);
bool dsme_home_is_encrypted (void);
const char *dsme_state_repr (dsme_state_t state);

/* ========================================================================= *
* Probing for encrypted home partition
Expand Down Expand Up @@ -104,3 +105,34 @@ dsme_home_is_encrypted(void)

return is_encrypted;
}

/* ========================================================================= *
* Debug helpers
* ========================================================================= */

/** Human readable dsme_state_t represenation for debugging purposes
*
* @param state State enumeration value
*
* @return human readable representation of the enumeration value
*/
const char *
dsme_state_repr(dsme_state_t state)
{
const char *repr = "UNKNOWN";

switch( state ) {
case DSME_STATE_SHUTDOWN: repr = "SHUTDOWN"; break;
case DSME_STATE_USER: repr = "USER"; break;
case DSME_STATE_ACTDEAD: repr = "ACTDEAD"; break;
case DSME_STATE_REBOOT: repr = "REBOOT"; break;
case DSME_STATE_BOOT: repr = "BOOT"; break;
case DSME_STATE_NOT_SET: repr = "NOT_SET"; break;
case DSME_STATE_TEST: repr = "TEST"; break;
case DSME_STATE_MALF: repr = "MALF"; break;
case DSME_STATE_LOCAL: repr = "LOCAL"; break;
default: break;
}

return repr;
}
5 changes: 4 additions & 1 deletion dsme/utility.h
Expand Up @@ -26,6 +26,8 @@
#ifndef DSME_UTILITY_H_
# define DSME_UTILITY_H_

# include <dsme/state.h>

# include <stdbool.h>

/* ========================================================================= *
Expand All @@ -36,6 +38,7 @@
* UTILITY
* ------------------------------------------------------------------------- */

bool dsme_home_is_encrypted(void);
bool dsme_home_is_encrypted(void);
const char *dsme_state_repr (dsme_state_t state);

#endif /* DSME_UTILITY_H_ */
71 changes: 70 additions & 1 deletion modules/alarmtracker.c
Expand Up @@ -44,6 +44,7 @@
#include "../include/dsme/timers.h"
#include "../include/dsme/modules.h"
#include "../include/dsme/logging.h"
#include "../dsme/utility.h"

#include <dsme/state.h>
#include <dsme/protocol.h>
Expand Down Expand Up @@ -101,6 +102,14 @@ static void alarmtracker_alarmstate_cancel_evaluate (void);
static int alarmtracker_alarmstate_evaluate_cb (void *aptr);
static void alarmtracker_alarmstate_evaluate (void);

/* ------------------------------------------------------------------------- *
* ALARMTRACKER_DSMESTATE
* ------------------------------------------------------------------------- */

static dsme_state_t alarmtracker_dsmestate_get (void);
static void alarmtracker_dsmestate_update(dsme_state_t state);
static void alarmtracker_dsmestate_query (void);

/* ------------------------------------------------------------------------- *
* ALARMTRACKER_DBUS
* ------------------------------------------------------------------------- */
Expand Down Expand Up @@ -146,6 +155,9 @@ static bool alarmtracker_alarmstate_current = false;
*/
static dsme_timer_t alarmtracker_alarmstate_evaluate_id = 0;

/** Cached dsme state */
static dsme_state_t alarmtracker_dsmestate_current = DSME_STATE_NOT_SET;

/* ========================================================================= *
* UTILITY
* ========================================================================= */
Expand Down Expand Up @@ -425,7 +437,14 @@ alarmtracker_alarmstate_evaluate(void)
/* stop pending re-evaluation timer */
alarmtracker_alarmstate_cancel_evaluate();

if( alarmtime == 0 ) {
if( alarmtracker_dsmestate_get() == DSME_STATE_ACTDEAD &&
dsme_home_is_encrypted() ) {
/* encrypted home is not available in act-dead,
* alarms can't be shown and must be ignored even
* if timed would be reporting them. */
alarm_set = false;
}
else if( alarmtime == 0 ) {
/* there are no alarms */
alarm_set = false;
}
Expand Down Expand Up @@ -455,6 +474,48 @@ alarmtracker_alarmstate_evaluate(void)
alarmtracker_alarmstate_broadcast();
}

/* ========================================================================= *
* ALARMTRACKER_DSMESTATE
* ========================================================================= */

/** Get cached dsme state
*
* @return return the last reported dsme state
*/
static dsme_state_t
alarmtracker_dsmestate_get(void)
{
return alarmtracker_dsmestate_current;
}

/** Update cached dsme state
*
* @param state dsme state from change notification
*/
static void
alarmtracker_dsmestate_update(dsme_state_t state)
{
if( alarmtracker_dsmestate_current != state ) {
dsme_log(LOG_DEBUG, PFIX"dsme_state: %s -> %s",
dsme_state_repr(alarmtracker_dsmestate_current),
dsme_state_repr(state));
alarmtracker_dsmestate_current = state;
alarmtracker_alarmstate_evaluate();
}
}

/** Send internal to dsme query for dsme state
*
* This function should be called on module load to obtain initial state.
*/
static void
alarmtracker_dsmestate_query(void)
{
/* get dsme state so that we can report it over D-Bus if asked to */
DSM_MSGTYPE_STATE_QUERY req_state = DSME_MSG_INIT(DSM_MSGTYPE_STATE_QUERY);
broadcast_internally(&req_state);
}

/* ========================================================================= *
* ALARMTRACKER_DBUS
* ========================================================================= */
Expand Down Expand Up @@ -492,6 +553,12 @@ static bool dbus_signals_bound = false;
* DSME message handlers
* ========================================================================= */

DSME_HANDLER(DSM_MSGTYPE_STATE_CHANGE_IND, server, msg)
{
/* Change notification / reply to alarmtracker_dsmestate_query() */
alarmtracker_dsmestate_update(msg->state);
}

DSME_HANDLER(DSM_MSGTYPE_WAKEUP, client, msg)
{
/* Wakeup scheduled from alarmtracker_alarmtime_schedule_save() */
Expand Down Expand Up @@ -522,6 +589,7 @@ DSME_HANDLER(DSM_MSGTYPE_STATE_QUERY, client, req)

module_fn_info_t message_handlers[] =
{
DSME_HANDLER_BINDING(DSM_MSGTYPE_STATE_CHANGE_IND),
DSME_HANDLER_BINDING(DSM_MSGTYPE_WAKEUP),
DSME_HANDLER_BINDING(DSM_MSGTYPE_DBUS_CONNECTED),
DSME_HANDLER_BINDING(DSM_MSGTYPE_DBUS_DISCONNECT),
Expand All @@ -545,6 +613,7 @@ module_init(module_t *handle)
dsme_log(LOG_DEBUG, PFIX"loading plugin");

alarmtracker_alarmtime_load();
alarmtracker_dsmestate_query();
}

/** Handle module unload time actions
Expand Down
25 changes: 2 additions & 23 deletions modules/batterytracker.c
Expand Up @@ -5,7 +5,7 @@
issue warnings. If battery level goes below safe limit, make shutdown
<p>
Copyright (C) 2013-2017 Jolla Oy.
Copyright (C) 2013-2019 Jolla Oy.
@author Pekka Lundstrom <pekka.lundstrom@jolla.com>
@author Simo Piiroinen <simo.piiroinen@jollamobile.com>
Expand All @@ -32,6 +32,7 @@
#include "../include/dsme/timers.h"
#include "../include/dsme/modules.h"
#include "../include/dsme/logging.h"
#include "../dsme/utility.h"

#include <dsme/state.h>
#include <dsme/protocol.h>
Expand Down Expand Up @@ -190,7 +191,6 @@ static void dsme_battery_level_set (dsme_battery_level_t l
* dsme_state
* ------------------------------------------------------------------------- */

static const char *dsme_state_repr (dsme_state_t state);
static void dsme_state_set (dsme_state_t state);

/* ------------------------------------------------------------------------- *
Expand Down Expand Up @@ -601,27 +601,6 @@ static void dsme_battery_level_set(dsme_battery_level_t level)
* dsme_state
* ========================================================================= */

static const char *
dsme_state_repr(dsme_state_t state)
{
const char *repr = "UNKNOWN";

switch( state ) {
case DSME_STATE_SHUTDOWN: repr = "SHUTDOWN"; break;
case DSME_STATE_USER: repr = "USER"; break;
case DSME_STATE_ACTDEAD: repr = "ACTDEAD"; break;
case DSME_STATE_REBOOT: repr = "REBOOT"; break;
case DSME_STATE_BOOT: repr = "BOOT"; break;
case DSME_STATE_NOT_SET: repr = "NOT_SET"; break;
case DSME_STATE_TEST: repr = "TEST"; break;
case DSME_STATE_MALF: repr = "MALF"; break;
case DSME_STATE_LOCAL: repr = "LOCAL"; break;
default: break;
}

return repr;
}

static dsme_state_t dsme_state = DSME_STATE_NOT_SET;

static void
Expand Down

0 comments on commit 3070ca1

Please sign in to comment.