diff options
| author | Marco Trevisan (Treviño) <mail@3v1n0.net> | 2015-02-09 20:36:04 +0100 |
|---|---|---|
| committer | Marco Trevisan (Treviño) <mail@3v1n0.net> | 2015-02-09 20:36:04 +0100 |
| commit | ac34d549b09e021013c521cda8a1e0440c1301dc (patch) | |
| tree | e43655a2ae3711734e661a34e23823dac11f1566 /UnityCore | |
| parent | 91751edf0399c555c309cf75ae7e13e2f21d700e (diff) | |
DBusIndicators: don't crash on mismatching variant signature, log errors
(bzr r3899.2.72)
Diffstat (limited to 'UnityCore')
| -rw-r--r-- | UnityCore/DBusIndicators.cpp | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/UnityCore/DBusIndicators.cpp b/UnityCore/DBusIndicators.cpp index 1745707be..d19a4aec7 100644 --- a/UnityCore/DBusIndicators.cpp +++ b/UnityCore/DBusIndicators.cpp @@ -37,6 +37,19 @@ namespace indicator namespace { DECLARE_LOGGER(logger, "unity.indicator.dbus"); + +inline bool verify_variant_type(GVariant* value, const gchar* type) +{ + if (!g_variant_is_of_type (value, G_VARIANT_TYPE(type))) + { + LOG_ERROR(logger) << "Got invalid variant type: '" + << g_variant_get_type_string(value) << "' ('" + << type << "' was expected)"; + return false; + } + + return true; +} } // anonymous namespace @@ -205,6 +218,9 @@ void DBusIndicators::Impl::OnIconsPathChanged(GVariant*) void DBusIndicators::Impl::OnEntryActivated(GVariant* parameters) { + if (!verify_variant_type(parameters, "(ss(iiuu))")) + return; + glib::String panel; glib::String entry_id; nux::Rect geo; @@ -216,6 +232,9 @@ void DBusIndicators::Impl::OnEntryActivated(GVariant* parameters) void DBusIndicators::Impl::OnEntryActivatedRequest(GVariant* parameters) { + if (!verify_variant_type(parameters, "(s)")) + return; + glib::String entry_name; g_variant_get(parameters, "(s)", &entry_name); @@ -225,6 +244,9 @@ void DBusIndicators::Impl::OnEntryActivatedRequest(GVariant* parameters) void DBusIndicators::Impl::OnEntryShowNowChanged(GVariant* parameters) { + if (!verify_variant_type(parameters, "(sb)")) + return; + glib::String entry_name; gboolean show_now; g_variant_get(parameters, "(sb)", &entry_name, &show_now); @@ -335,6 +357,9 @@ void DBusIndicators::Impl::Sync(GVariant* args, glib::Error const& error) gboolean image_visible = false; gint32 priority = -1; + if (!verify_variant_type(args, "(" ENTRY_ARRAY_SIGNATURE ")")) + return; + std::unordered_map<Indicator::Ptr, Indicator::Entries> indicators; g_variant_get(args, "(" ENTRY_ARRAY_SIGNATURE ")", &iter); |
