From 20431a4c166d7de2831483466d22741a2293f937 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 3 Jan 2017 15:27:23 +0100 Subject: [PATCH 1/5] exported-object: add NM_EXPORT_PATH_NUMBERED() macro --- src/nm-exported-object.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/nm-exported-object.h b/src/nm-exported-object.h index 75f9c59a6d..3bb2536764 100644 --- a/src/nm-exported-object.h +++ b/src/nm-exported-object.h @@ -23,6 +23,8 @@ /*****************************************************************************/ +#define NM_EXPORT_PATH_NUMBERED(basepath) ""basepath"/%u" + char *nm_exported_object_skeletonify_method_name (const char *dbus_method_name); typedef struct { From 32dd257d31694523b735780090f889298c175e8c Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 3 Jan 2017 15:27:23 +0100 Subject: [PATCH 2/5] exported-object: use NM_EXPORT_PATH_NUMBERED() macro --- src/devices/nm-device.c | 2 +- src/devices/wifi/nm-wifi-ap.c | 2 +- src/nm-active-connection.c | 2 +- src/nm-checkpoint.c | 2 +- src/nm-dhcp4-config.c | 2 +- src/nm-dhcp6-config.c | 2 +- src/nm-ip4-config.c | 2 +- src/nm-ip6-config.c | 2 +- src/ppp/nm-ppp-manager.c | 2 +- src/settings/nm-settings-connection.c | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c index af201d8ce9..c980133466 100644 --- a/src/devices/nm-device.c +++ b/src/devices/nm-device.c @@ -13070,7 +13070,7 @@ nm_device_class_init (NMDeviceClass *klass) g_type_class_add_private (object_class, sizeof (NMDevicePrivate)); - exported_object_class->export_path = NM_DBUS_PATH "/Devices/%u"; + exported_object_class->export_path = NM_EXPORT_PATH_NUMBERED (NM_DBUS_PATH"/Devices"); object_class->dispose = dispose; object_class->finalize = finalize; diff --git a/src/devices/wifi/nm-wifi-ap.c b/src/devices/wifi/nm-wifi-ap.c index 98e97ead4f..c5d8af25ba 100644 --- a/src/devices/wifi/nm-wifi-ap.c +++ b/src/devices/wifi/nm-wifi-ap.c @@ -969,7 +969,7 @@ nm_wifi_ap_class_init (NMWifiAPClass *ap_class) GObjectClass *object_class = G_OBJECT_CLASS (ap_class); NMExportedObjectClass *exported_object_class = NM_EXPORTED_OBJECT_CLASS (ap_class); - exported_object_class->export_path = NM_DBUS_PATH_ACCESS_POINT "/%u"; + exported_object_class->export_path = NM_EXPORT_PATH_NUMBERED (NM_DBUS_PATH_ACCESS_POINT); object_class->get_property = get_property; object_class->finalize = finalize; diff --git a/src/nm-active-connection.c b/src/nm-active-connection.c index 85ca6a20c2..17fb82e50a 100644 --- a/src/nm-active-connection.c +++ b/src/nm-active-connection.c @@ -1168,7 +1168,7 @@ nm_active_connection_class_init (NMActiveConnectionClass *ac_class) g_type_class_add_private (ac_class, sizeof (NMActiveConnectionPrivate)); - exported_object_class->export_path = NM_DBUS_PATH "/ActiveConnection/%u"; + exported_object_class->export_path = NM_EXPORT_PATH_NUMBERED (NM_DBUS_PATH"/ActiveConnection"); object_class->get_property = get_property; object_class->set_property = set_property; diff --git a/src/nm-checkpoint.c b/src/nm-checkpoint.c index 6632ce4918..7d89e61ef8 100644 --- a/src/nm-checkpoint.c +++ b/src/nm-checkpoint.c @@ -455,7 +455,7 @@ nm_checkpoint_class_init (NMCheckpointClass *checkpoint_class) GObjectClass *object_class = G_OBJECT_CLASS (checkpoint_class); NMExportedObjectClass *exported_object_class = NM_EXPORTED_OBJECT_CLASS (checkpoint_class); - exported_object_class->export_path = NM_DBUS_PATH "/Checkpoint/%u"; + exported_object_class->export_path = NM_EXPORT_PATH_NUMBERED (NM_DBUS_PATH"/Checkpoint"); exported_object_class->export_on_construction = FALSE; object_class->dispose = dispose; diff --git a/src/nm-dhcp4-config.c b/src/nm-dhcp4-config.c index 5106c73dad..10f58bc62b 100644 --- a/src/nm-dhcp4-config.c +++ b/src/nm-dhcp4-config.c @@ -156,7 +156,7 @@ nm_dhcp4_config_class_init (NMDhcp4ConfigClass *config_class) object_class->get_property = get_property; object_class->finalize = finalize; - exported_object_class->export_path = NM_DBUS_PATH "/DHCP4Config/%u"; + exported_object_class->export_path = NM_EXPORT_PATH_NUMBERED (NM_DBUS_PATH"/DHCP4Config"); exported_object_class->export_on_construction = TRUE; obj_properties[PROP_OPTIONS] = diff --git a/src/nm-dhcp6-config.c b/src/nm-dhcp6-config.c index d3188a2033..d51d77ef37 100644 --- a/src/nm-dhcp6-config.c +++ b/src/nm-dhcp6-config.c @@ -154,7 +154,7 @@ nm_dhcp6_config_class_init (NMDhcp6ConfigClass *config_class) object_class->get_property = get_property; object_class->finalize = finalize; - exported_object_class->export_path = NM_DBUS_PATH "/DHCP6Config/%u"; + exported_object_class->export_path = NM_EXPORT_PATH_NUMBERED (NM_DBUS_PATH"/DHCP6Config"); exported_object_class->export_on_construction = TRUE; obj_properties[PROP_OPTIONS] = diff --git a/src/nm-ip4-config.c b/src/nm-ip4-config.c index 4c0883cdba..2bd0d36cb3 100644 --- a/src/nm-ip4-config.c +++ b/src/nm-ip4-config.c @@ -2473,7 +2473,7 @@ nm_ip4_config_class_init (NMIP4ConfigClass *config_class) GObjectClass *object_class = G_OBJECT_CLASS (config_class); NMExportedObjectClass *exported_object_class = NM_EXPORTED_OBJECT_CLASS (config_class); - exported_object_class->export_path = NM_DBUS_PATH "/IP4Config/%u"; + exported_object_class->export_path = NM_EXPORT_PATH_NUMBERED (NM_DBUS_PATH"/IP4Config"); object_class->get_property = get_property; object_class->set_property = set_property; diff --git a/src/nm-ip6-config.c b/src/nm-ip6-config.c index 661d4377b6..713e2c12a0 100644 --- a/src/nm-ip6-config.c +++ b/src/nm-ip6-config.c @@ -2237,7 +2237,7 @@ nm_ip6_config_class_init (NMIP6ConfigClass *config_class) GObjectClass *object_class = G_OBJECT_CLASS (config_class); NMExportedObjectClass *exported_object_class = NM_EXPORTED_OBJECT_CLASS (config_class); - exported_object_class->export_path = NM_DBUS_PATH "/IP6Config/%u"; + exported_object_class->export_path = NM_EXPORT_PATH_NUMBERED (NM_DBUS_PATH"/IP6Config"); /* virtual methods */ object_class->get_property = get_property; diff --git a/src/ppp/nm-ppp-manager.c b/src/ppp/nm-ppp-manager.c index bf24552fb3..cc7451c97b 100644 --- a/src/ppp/nm-ppp-manager.c +++ b/src/ppp/nm-ppp-manager.c @@ -1232,7 +1232,7 @@ nm_ppp_manager_class_init (NMPPPManagerClass *manager_class) object_class->get_property = get_property; object_class->set_property = set_property; - exported_object_class->export_path = NM_DBUS_PATH "/PPP/%u"; + exported_object_class->export_path = NM_EXPORT_PATH_NUMBERED (NM_DBUS_PATH"/PPP"); obj_properties[PROP_PARENT_IFACE] = g_param_spec_string (NM_PPP_MANAGER_PARENT_IFACE, "", "", diff --git a/src/settings/nm-settings-connection.c b/src/settings/nm-settings-connection.c index bf62f91322..4441803a69 100644 --- a/src/settings/nm-settings-connection.c +++ b/src/settings/nm-settings-connection.c @@ -2793,7 +2793,7 @@ nm_settings_connection_class_init (NMSettingsConnectionClass *class) g_type_class_add_private (class, sizeof (NMSettingsConnectionPrivate)); - exported_object_class->export_path = NM_DBUS_PATH_SETTINGS "/%u"; + exported_object_class->export_path = NM_EXPORT_PATH_NUMBERED (NM_DBUS_PATH_SETTINGS); object_class->constructed = constructed; object_class->dispose = dispose; From 8006045d0de717059c70feed0a845a8ee7ddb7db Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 3 Jan 2017 15:28:22 +0100 Subject: [PATCH 3/5] exported-object: make export_path D-Bus counter 64 bit An overflow of the 32 bit guint is possible and rather ugly because the D-Bus path should be unique and not repeat. Avoid that by extending the counter to 64 bit. --- src/nm-exported-object.c | 12 +++++++----- src/nm-exported-object.h | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/nm-exported-object.c b/src/nm-exported-object.c index f3831c8f67..47430bb350 100644 --- a/src/nm-exported-object.c +++ b/src/nm-exported-object.c @@ -564,7 +564,7 @@ _create_export_path (NMExportedObjectClass *klass) { const char *class_export_path, *p; static GHashTable *prefix_counters; - guint *counter; + guint64 *counter; class_export_path = klass->export_path; @@ -575,17 +575,19 @@ _create_export_path (NMExportedObjectClass *klass) if (G_UNLIKELY (!prefix_counters)) prefix_counters = g_hash_table_new (g_str_hash, g_str_equal); - g_assert (p[1] == 'u'); - g_assert (strchr (p + 1, '%') == NULL); + nm_assert (p[1] == 'l'); + nm_assert (p[2] == 'l'); + nm_assert (p[3] == 'u'); + nm_assert (p[4] == '\0'); counter = g_hash_table_lookup (prefix_counters, class_export_path); if (!counter) { - counter = g_slice_new0 (guint); + counter = g_slice_new0 (guint64); g_hash_table_insert (prefix_counters, g_strdup (class_export_path), counter); } NM_PRAGMA_WARNING_DISABLE("-Wformat-nonliteral") - return g_strdup_printf (class_export_path, (*counter)++); + return g_strdup_printf (class_export_path, (long long unsigned) (*counter)++); NM_PRAGMA_WARNING_REENABLE } diff --git a/src/nm-exported-object.h b/src/nm-exported-object.h index 3bb2536764..7d3481296f 100644 --- a/src/nm-exported-object.h +++ b/src/nm-exported-object.h @@ -23,7 +23,7 @@ /*****************************************************************************/ -#define NM_EXPORT_PATH_NUMBERED(basepath) ""basepath"/%u" +#define NM_EXPORT_PATH_NUMBERED(basepath) ""basepath"/%llu" char *nm_exported_object_skeletonify_method_name (const char *dbus_method_name); From cd1466190ef01a81548791dee23fcc100615d5ce Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 3 Jan 2017 15:44:06 +0100 Subject: [PATCH 4/5] exported-object: don't clone class_export_path for counter cache It's a static string anyway. --- src/nm-exported-object.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/nm-exported-object.c b/src/nm-exported-object.c index 47430bb350..0ad7301249 100644 --- a/src/nm-exported-object.c +++ b/src/nm-exported-object.c @@ -583,7 +583,7 @@ _create_export_path (NMExportedObjectClass *klass) counter = g_hash_table_lookup (prefix_counters, class_export_path); if (!counter) { counter = g_slice_new0 (guint64); - g_hash_table_insert (prefix_counters, g_strdup (class_export_path), counter); + g_hash_table_insert (prefix_counters, (char *) class_export_path, counter); } NM_PRAGMA_WARNING_DISABLE("-Wformat-nonliteral") From 2486dc5c451bdbc3dd83478ed305c03a98591ee5 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 3 Jan 2017 15:46:58 +0100 Subject: [PATCH 5/5] exported-object: don't use "/0" for D-Bus paths but start with 1 Only use non-negative index values for the D-Bus path. This is purely cosmetical, as the actual path value should be treated as opaque. Still, avoid using 0 and start counting at 1. --- src/nm-exported-object.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/nm-exported-object.c b/src/nm-exported-object.c index 0ad7301249..a53a3123e8 100644 --- a/src/nm-exported-object.c +++ b/src/nm-exported-object.c @@ -587,7 +587,7 @@ _create_export_path (NMExportedObjectClass *klass) } NM_PRAGMA_WARNING_DISABLE("-Wformat-nonliteral") - return g_strdup_printf (class_export_path, (long long unsigned) (*counter)++); + return g_strdup_printf (class_export_path, (long long unsigned) (++(*counter))); NM_PRAGMA_WARNING_REENABLE }