Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[dbus] Deal with NULL strings on D-Bus signal broadcast attempts
Corrupted settings, empty lists and other hiccups can lead to usb-moded
attempting to send D-Bus signal with NULL strings - which either leads
to omitting signal sending when checked / crashing when not checked.

To avoid crashing, make umdbus_send_signal_ex() send empty string when
signal with null content is given, and add sufficient checks / diagnostic
logging to umdbus_send_config_signal().

Remove null checks from common_send_hidden_modes_signal() and
common_send_whitelisted_modes_signal() so that NULL set gets equated
with empty set and signal broadcasting is never skipped.


Signed-off-by: Simo Piiroinen <simo.piiroinen@jollamobile.com>
  • Loading branch information
spiiroin committed Sep 5, 2018
1 parent 67df698 commit fdc32b0
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 24 deletions.
14 changes: 4 additions & 10 deletions src/usb_moded-common.c
Expand Up @@ -211,23 +211,17 @@ void common_send_available_modes_signal(void)
void common_send_hidden_modes_signal(void)
{
gchar *mode_list = config_get_hidden_modes();
if(mode_list) {
// TODO: cleared list not signaled?
umdbus_send_hidden_modes_signal(mode_list);
g_free(mode_list);
}
umdbus_send_hidden_modes_signal(mode_list);
g_free(mode_list);
}

/** Send whitelisted modes signal
*/
void common_send_whitelisted_modes_signal(void)
{
gchar *mode_list = config_get_mode_whitelist();
if(mode_list) {
// TODO: cleared list not signaled?
umdbus_send_whitelisted_modes_signal(mode_list);
g_free(mode_list);
}
umdbus_send_whitelisted_modes_signal(mode_list);
g_free(mode_list);
}

/* ------------------------------------------------------------------------- *
Expand Down
49 changes: 35 additions & 14 deletions src/usb_moded-dbus.c
Expand Up @@ -190,25 +190,41 @@ static const char umdbus_introspect_usbmoded[] =
*/
static void umdbus_send_config_signal(const char *section, const char *key, const char *value)
{
log_debug("broadcast signal %s(%s, %s, %s)\n", USB_MODE_CONFIG_SIGNAL_NAME, section, key, value);
DBusMessage* msg = 0;

if( !umdbus_service_name_acquired )
{
if( !section || !key || !value ) {
log_err("config notification with NULL %s",
!section ? "section" : !key ? "key" : value);
goto EXIT;
}

if( !umdbus_service_name_acquired ) {
log_err("config notification without service: [%s] %s=%s",
section, key, value);
goto EXIT;
}
else if (umdbus_connection)
{
DBusMessage* msg = dbus_message_new_signal(USB_MODE_OBJECT, USB_MODE_INTERFACE, USB_MODE_CONFIG_SIGNAL_NAME);
if (msg) {
dbus_message_append_args(msg, DBUS_TYPE_STRING, &section,
DBUS_TYPE_STRING, &key,
DBUS_TYPE_STRING, &value,
DBUS_TYPE_INVALID);
dbus_connection_send(umdbus_connection, msg, NULL);
dbus_message_unref(msg);
}

if( !umdbus_connection ) {
log_err("config notification without connection: [%s] %s=%s",
section, key, value);
goto EXIT;
}

log_debug("broadcast signal %s(%s, %s, %s)\n", USB_MODE_CONFIG_SIGNAL_NAME, section, key, value);

msg = dbus_message_new_signal(USB_MODE_OBJECT, USB_MODE_INTERFACE, USB_MODE_CONFIG_SIGNAL_NAME);
if( !msg )
goto EXIT;

dbus_message_append_args(msg, DBUS_TYPE_STRING, &section,
DBUS_TYPE_STRING, &key,
DBUS_TYPE_STRING, &value,
DBUS_TYPE_INVALID);
dbus_connection_send(umdbus_connection, msg, NULL);

EXIT:
if( msg )
dbus_message_unref(msg);
}

static DBusHandlerResult umdbus_msg_handler(DBusConnection *const connection, DBusMessage *const msg, gpointer const user_data)
Expand Down Expand Up @@ -728,6 +744,11 @@ static int umdbus_send_signal_ex(const char *signal_type, const char *content)
int result = 1;
DBusMessage* msg = 0;

/* Assume NULL content equals no value / empty list, and that skipping
* signal broadcast is never preferable over sending empty string. */
if( !content )
content = "";

log_debug("broadcast signal %s(%s)\n", signal_type, content);

if( !umdbus_service_name_acquired )
Expand Down

0 comments on commit fdc32b0

Please sign in to comment.