Merge pull request #1276 from 4e554c4c/bad_items

Don't trust SNI names, fixes #1274
This commit is contained in:
Drew DeVault 2017-07-13 10:53:54 -04:00 committed by GitHub
commit e33792e80a
3 changed files with 16 additions and 5 deletions

View File

@ -28,6 +28,7 @@ void sni_icon_ref_free(struct sni_icon_ref *sni_ref);
/** /**
* Will return a new item and get its icon. (see warning below) * Will return a new item and get its icon. (see warning below)
* May return `NULL` if `name` is not valid.
*/ */
struct StatusNotifierItem *sni_create(const char *name); struct StatusNotifierItem *sni_create(const char *name);

View File

@ -413,6 +413,12 @@ static void get_unique_name(struct StatusNotifierItem *item) {
} }
struct StatusNotifierItem *sni_create(const char *name) { struct StatusNotifierItem *sni_create(const char *name) {
// Make sure `name` is well formed
if (!dbus_validate_bus_name(name, NULL)) {
sway_log(L_INFO, "Name (%s) is not a bus name. We cannot create an item.", name);
return NULL;
}
struct StatusNotifierItem *item = malloc(sizeof(struct StatusNotifierItem)); struct StatusNotifierItem *item = malloc(sizeof(struct StatusNotifierItem));
item->name = strdup(name); item->name = strdup(name);
item->unique_name = NULL; item->unique_name = NULL;

View File

@ -90,10 +90,12 @@ static void get_items_reply(DBusPendingCall *pending, void *_data) {
struct StatusNotifierItem *item = sni_create(name); struct StatusNotifierItem *item = sni_create(name);
if (item) {
sway_log(L_DEBUG, "Item registered with host: %s", name); sway_log(L_DEBUG, "Item registered with host: %s", name);
list_add(tray->items, item); list_add(tray->items, item);
dirty = true; dirty = true;
} }
}
bail: bail:
dbus_message_unref(reply); dbus_message_unref(reply);
@ -141,9 +143,11 @@ static DBusHandlerResult signal_handler(DBusConnection *connection,
if (list_seq_find(tray->items, sni_str_cmp, name) == -1) { if (list_seq_find(tray->items, sni_str_cmp, name) == -1) {
struct StatusNotifierItem *item = sni_create(name); struct StatusNotifierItem *item = sni_create(name);
if (item) {
list_add(tray->items, item); list_add(tray->items, item);
dirty = true; dirty = true;
} }
}
return DBUS_HANDLER_RESULT_HANDLED; return DBUS_HANDLER_RESULT_HANDLED;
} else if (dbus_message_is_signal(message, "org.freedesktop.StatusNotifierWatcher", } else if (dbus_message_is_signal(message, "org.freedesktop.StatusNotifierWatcher",