URL: https://github.com/SSSD/sssd/pull/740
Author: pbrezina
 Title: #740: sbus: avoid using invalid stack point in SBUS_INTERFACE
Action: synchronized

To pull the PR as Git branch:
git remote add ghsssd https://github.com/SSSD/sssd
git fetch ghsssd pull/740/head:pr740
git checkout pr740
From 230e53213583ffad0de7ad015b367b91912591a7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <pbrez...@redhat.com>
Date: Mon, 4 Feb 2019 12:00:01 +0100
Subject: [PATCH 1/2] sbus: avoid using invalid stack point in SBUS_INTERFACE

SBUS_INTERFACE macros expanded as:
struct sbus_interface bus =
    ({ sbus_interface(
        "org.freedesktop.DBus",
        ((void *)0),
        (((const struct sbus_method[])
        {
            ({
                /* ... compile time check of function signature omitted */ ;
                sbus_method_sync(/* ... full list of params omitted */);
            }),
  ...

This however includes an issue that methods/properties/signals are returned
by value, however stored in sbus_interface as pointers. Once we return out
of the top-level block and assign resulting sbus_interface into 'bus' variable
those objects allocated on stack becomes invalid and can be overwritten by other
allocations on stack.

This patch overcomes this issue by changing declaration of SBUS_INTERFACE and
avoiding using this top-level block. This still keeps the declarative structure
and simplifies the code as it does not require any memory handling and
tests for successful allocations.

    const struct sbus_method __ ## varname ## _m[] = methods;                 \
    const struct sbus_signal __ ## varname ## _s[] = signals;                 \
    const struct sbus_property __ ## varname ## _p[] = properties;            \
    struct sbus_interface varname = SBUS_IFACE_ ## iface(                     \
        (__ ## varname ## _m),                                                \
        (__ ## varname ## _s),                                                \
        (__ ## varname ## _p)                                                 \
    )

Resolves:
https://pagure.io/SSSD/sssd/issue/3924
---
 src/monitor/monitor.c                   |  2 +-
 src/providers/data_provider/dp.c        | 10 +++++-----
 src/providers/data_provider_be.c        |  2 +-
 src/providers/proxy/proxy_child.c       |  2 +-
 src/providers/proxy/proxy_client.c      |  2 +-
 src/responder/autofs/autofssrv.c        |  2 +-
 src/responder/common/responder_iface.c  |  6 +++---
 src/responder/ifp/ifp_iface/ifp_iface.c | 24 ++++++++++++------------
 src/responder/ifp/ifpsrv.c              |  2 +-
 src/responder/nss/nss_iface.c           |  2 +-
 src/responder/nss/nsssrv.c              |  2 +-
 src/sbus/interface/sbus_introspection.c |  2 +-
 src/sbus/interface/sbus_properties.c    |  2 +-
 src/sbus/sbus_interface.h               | 22 +++++++++++++++++-----
 src/sbus/server/sbus_server_interface.c |  2 +-
 15 files changed, 48 insertions(+), 36 deletions(-)

diff --git a/src/monitor/monitor.c b/src/monitor/monitor.c
index 136cf8f277..8d12f81339 100644
--- a/src/monitor/monitor.c
+++ b/src/monitor/monitor.c
@@ -2018,7 +2018,7 @@ static void monitor_sbus_connected(struct tevent_req *req)
         goto done;
     }
 
-    struct sbus_interface iface = SBUS_INTERFACE(
+    SBUS_INTERFACE(iface,
         sssd_monitor,
         SBUS_METHODS(
             SBUS_SYNC(METHOD, sssd_monitor, RegisterService, monitor_sbus_RegisterService, ctx)
diff --git a/src/providers/data_provider/dp.c b/src/providers/data_provider/dp.c
index bd003c8b3e..e79d6f294c 100644
--- a/src/providers/data_provider/dp.c
+++ b/src/providers/data_provider/dp.c
@@ -33,7 +33,7 @@ dp_init_interface(struct data_provider *provider)
 {
     errno_t ret;
 
-    struct sbus_interface iface_dp_client = SBUS_INTERFACE(
+    SBUS_INTERFACE(iface_dp_client,
         sssd_DataProvider_Client,
         SBUS_METHODS(
             SBUS_SYNC(METHOD, sssd_DataProvider_Client, Register, dp_client_register, provider)
@@ -42,7 +42,7 @@ dp_init_interface(struct data_provider *provider)
         SBUS_PROPERTIES(SBUS_NO_PROPERTIES)
     );
 
-    struct sbus_interface iface_dp_backend = SBUS_INTERFACE(
+    SBUS_INTERFACE(iface_dp_backend,
         sssd_DataProvider_Backend,
         SBUS_METHODS(
             SBUS_SYNC(METHOD, sssd_DataProvider_Backend, IsOnline, dp_backend_is_online, provider->be_ctx)
@@ -51,7 +51,7 @@ dp_init_interface(struct data_provider *provider)
         SBUS_PROPERTIES(SBUS_NO_PROPERTIES)
     );
 
-    struct sbus_interface iface_dp_failover = SBUS_INTERFACE(
+    SBUS_INTERFACE(iface_dp_failover,
         sssd_DataProvider_Failover,
         SBUS_METHODS(
             SBUS_SYNC(METHOD, sssd_DataProvider_Failover, ListServices, dp_failover_list_services, provider->be_ctx),
@@ -62,7 +62,7 @@ dp_init_interface(struct data_provider *provider)
         SBUS_PROPERTIES(SBUS_NO_PROPERTIES)
     );
 
-    struct sbus_interface iface_dp_access = SBUS_INTERFACE(
+    SBUS_INTERFACE(iface_dp_access,
         sssd_DataProvider_AccessControl,
         SBUS_METHODS(
             SBUS_ASYNC(METHOD, sssd_DataProvider_AccessControl, RefreshRules, dp_access_control_refresh_rules_send, dp_access_control_refresh_rules_recv, provider)
@@ -71,7 +71,7 @@ dp_init_interface(struct data_provider *provider)
         SBUS_PROPERTIES(SBUS_NO_PROPERTIES)
     );
 
-    struct sbus_interface iface_dp = SBUS_INTERFACE(
+    SBUS_INTERFACE(iface_dp,
         sssd_dataprovider,
         SBUS_METHODS(
             SBUS_ASYNC(METHOD, sssd_dataprovider, pamHandler, dp_pam_handler_send, dp_pam_handler_recv, provider),
diff --git a/src/providers/data_provider_be.c b/src/providers/data_provider_be.c
index 7043e7a5fd..942952b24e 100644
--- a/src/providers/data_provider_be.c
+++ b/src/providers/data_provider_be.c
@@ -382,7 +382,7 @@ static void signal_be_reset_offline(struct tevent_context *ev,
 static errno_t
 be_register_monitor_iface(struct sbus_connection *conn, struct be_ctx *be_ctx)
 {
-    struct sbus_interface iface_service = SBUS_INTERFACE(
+    SBUS_INTERFACE(iface_service,
         sssd_service,
         SBUS_METHODS(
             SBUS_SYNC(METHOD, sssd_service, resInit, data_provider_res_init, be_ctx),
diff --git a/src/providers/proxy/proxy_child.c b/src/providers/proxy/proxy_child.c
index 134f96f823..4f06d42aab 100644
--- a/src/providers/proxy/proxy_child.c
+++ b/src/providers/proxy/proxy_child.c
@@ -348,7 +348,7 @@ proxy_cli_init(struct pc_ctx *ctx)
         return ENOMEM;
     }
 
-    struct sbus_interface iface = SBUS_INTERFACE(
+    SBUS_INTERFACE(iface,
         sssd_ProxyChild_Auth,
         SBUS_METHODS(
             SBUS_SYNC(METHOD, sssd_ProxyChild_Auth, PAM, pc_pam_handler, ctx)
diff --git a/src/providers/proxy/proxy_client.c b/src/providers/proxy/proxy_client.c
index 1c325eee5d..09ebf3bda1 100644
--- a/src/providers/proxy/proxy_client.c
+++ b/src/providers/proxy/proxy_client.c
@@ -100,7 +100,7 @@ proxy_client_init(struct sbus_connection *conn,
 {
     errno_t ret;
 
-    struct sbus_interface iface = SBUS_INTERFACE(
+    SBUS_INTERFACE(iface,
         sssd_ProxyChild_Client,
         SBUS_METHODS(
             SBUS_SYNC(METHOD, sssd_ProxyChild_Client, Register, proxy_client_register, auth_ctx)
diff --git a/src/responder/autofs/autofssrv.c b/src/responder/autofs/autofssrv.c
index 614e901e73..230bd2aace 100644
--- a/src/responder/autofs/autofssrv.c
+++ b/src/responder/autofs/autofssrv.c
@@ -62,7 +62,7 @@ autofs_register_service_iface(struct autofs_ctx *autofs_ctx,
 {
     errno_t ret;
 
-    struct sbus_interface iface_svc = SBUS_INTERFACE(
+    SBUS_INTERFACE(iface_svc,
         sssd_service,
         SBUS_METHODS(
             SBUS_SYNC(METHOD, sssd_service, resInit, monitor_common_res_init, NULL),
diff --git a/src/responder/common/responder_iface.c b/src/responder/common/responder_iface.c
index 79b632c052..911cd6cc0a 100644
--- a/src/responder/common/responder_iface.c
+++ b/src/responder/common/responder_iface.c
@@ -99,7 +99,7 @@ sss_resp_register_sbus_iface(struct sbus_connection *conn,
 {
     errno_t ret;
 
-    struct sbus_interface iface_resp_domain = SBUS_INTERFACE(
+    SBUS_INTERFACE(iface_resp_domain,
         sssd_Responder_Domain,
         SBUS_METHODS(
             SBUS_SYNC(METHOD, sssd_Responder_Domain, SetActive, sss_resp_domain_active, rctx),
@@ -109,7 +109,7 @@ sss_resp_register_sbus_iface(struct sbus_connection *conn,
         SBUS_PROPERTIES(SBUS_NO_PROPERTIES)
     );
 
-    struct sbus_interface iface_resp_negcache = SBUS_INTERFACE(
+    SBUS_INTERFACE(iface_resp_negcache,
         sssd_Responder_NegativeCache,
         SBUS_METHODS(
             SBUS_SYNC(METHOD, sssd_Responder_NegativeCache, ResetUsers, sss_resp_reset_ncache_users, rctx),
@@ -139,7 +139,7 @@ sss_resp_register_service_iface(struct resp_ctx *rctx)
 {
     errno_t ret;
 
-    struct sbus_interface iface_svc = SBUS_INTERFACE(
+    SBUS_INTERFACE(iface_svc,
         sssd_service,
         SBUS_METHODS(
             SBUS_SYNC(METHOD, sssd_service, resInit, monitor_common_res_init, NULL),
diff --git a/src/responder/ifp/ifp_iface/ifp_iface.c b/src/responder/ifp/ifp_iface/ifp_iface.c
index fa9f9ba536..a3385091b6 100644
--- a/src/responder/ifp/ifp_iface/ifp_iface.c
+++ b/src/responder/ifp/ifp_iface/ifp_iface.c
@@ -77,7 +77,7 @@ ifp_register_sbus_interface(struct sbus_connection *conn,
 {
     errno_t ret;
 
-    struct sbus_interface iface_ifp = SBUS_INTERFACE(
+    SBUS_INTERFACE(iface_ifp,
         org_freedesktop_sssd_infopipe,
         SBUS_METHODS(
             SBUS_SYNC(METHOD,  org_freedesktop_sssd_infopipe, Ping, ifp_ping, ctx),
@@ -96,7 +96,7 @@ ifp_register_sbus_interface(struct sbus_connection *conn,
         SBUS_PROPERTIES(SBUS_NO_PROPERTIES)
     );
 
-    struct sbus_interface iface_ifp_components = SBUS_INTERFACE(
+    SBUS_INTERFACE(iface_ifp_components,
         org_freedesktop_sssd_infopipe_Components,
         SBUS_METHODS(SBUS_NO_METHODS),
         SBUS_SIGNALS(SBUS_NO_SIGNALS),
@@ -109,7 +109,7 @@ ifp_register_sbus_interface(struct sbus_connection *conn,
         )
     );
 
-    struct sbus_interface iface_ifp_domains = SBUS_INTERFACE(
+    SBUS_INTERFACE(iface_ifp_domains,
         org_freedesktop_sssd_infopipe_Domains,
         SBUS_METHODS(SBUS_NO_METHODS),
         SBUS_SIGNALS(SBUS_NO_SIGNALS),
@@ -131,7 +131,7 @@ ifp_register_sbus_interface(struct sbus_connection *conn,
         )
     );
 
-    struct sbus_interface iface_ifp_domains_domain = SBUS_INTERFACE(
+    SBUS_INTERFACE(iface_ifp_domains_domain,
         org_freedesktop_sssd_infopipe_Domains_Domain,
         SBUS_METHODS(
             SBUS_ASYNC(METHOD, org_freedesktop_sssd_infopipe_Domains_Domain, IsOnline, ifp_domains_domain_is_online_send, ifp_domains_domain_is_online_recv, ctx),
@@ -144,7 +144,7 @@ ifp_register_sbus_interface(struct sbus_connection *conn,
         SBUS_PROPERTIES(SBUS_NO_PROPERTIES)
     );
 
-    struct sbus_interface iface_ifp_users = SBUS_INTERFACE(
+    SBUS_INTERFACE(iface_ifp_users,
         org_freedesktop_sssd_infopipe_Users,
         SBUS_METHODS(
             SBUS_ASYNC(METHOD, org_freedesktop_sssd_infopipe_Users, FindByName, ifp_users_find_by_name_send, ifp_users_find_by_name_recv, ctx),
@@ -159,7 +159,7 @@ ifp_register_sbus_interface(struct sbus_connection *conn,
         SBUS_PROPERTIES(SBUS_NO_PROPERTIES)
     );
 
-    struct sbus_interface iface_ifp_users_user = SBUS_INTERFACE(
+    SBUS_INTERFACE(iface_ifp_users_user,
         org_freedesktop_sssd_infopipe_Users_User,
         SBUS_METHODS(SBUS_NO_METHODS),
         SBUS_SIGNALS(SBUS_NO_SIGNALS),
@@ -178,7 +178,7 @@ ifp_register_sbus_interface(struct sbus_connection *conn,
         )
     );
 
-    struct sbus_interface iface_ifp_cache_user = SBUS_INTERFACE(
+    SBUS_INTERFACE(iface_ifp_cache_user,
         org_freedesktop_sssd_infopipe_Cache,
         SBUS_METHODS(
             SBUS_SYNC(METHOD, org_freedesktop_sssd_infopipe_Cache, List, ifp_cache_list_user, ctx),
@@ -188,7 +188,7 @@ ifp_register_sbus_interface(struct sbus_connection *conn,
         SBUS_PROPERTIES(SBUS_NO_PROPERTIES)
     );
 
-    struct sbus_interface iface_ifp_cache_object_user = SBUS_INTERFACE(
+    SBUS_INTERFACE(iface_ifp_cache_object_user,
         org_freedesktop_sssd_infopipe_Cache_Object,
         SBUS_METHODS(
             SBUS_SYNC(METHOD, org_freedesktop_sssd_infopipe_Cache_Object, Store, ifp_cache_object_store_user, ctx),
@@ -198,7 +198,7 @@ ifp_register_sbus_interface(struct sbus_connection *conn,
         SBUS_PROPERTIES(SBUS_NO_PROPERTIES)
     );
 
-    struct sbus_interface iface_ifp_groups = SBUS_INTERFACE(
+    SBUS_INTERFACE(iface_ifp_groups,
         org_freedesktop_sssd_infopipe_Groups,
         SBUS_METHODS(
             SBUS_ASYNC(METHOD, org_freedesktop_sssd_infopipe_Groups, FindByName, ifp_groups_find_by_name_send, ifp_groups_find_by_name_recv, ctx),
@@ -210,7 +210,7 @@ ifp_register_sbus_interface(struct sbus_connection *conn,
         SBUS_PROPERTIES(SBUS_NO_PROPERTIES)
     );
 
-    struct sbus_interface iface_ifp_groups_group = SBUS_INTERFACE(
+    SBUS_INTERFACE(iface_ifp_groups_group,
         org_freedesktop_sssd_infopipe_Groups_Group,
         SBUS_METHODS(
             SBUS_ASYNC(METHOD, org_freedesktop_sssd_infopipe_Groups_Group, UpdateMemberList, ifp_groups_group_update_member_list_send, ifp_groups_group_update_member_list_recv, ctx)
@@ -225,7 +225,7 @@ ifp_register_sbus_interface(struct sbus_connection *conn,
         )
     );
 
-    struct sbus_interface iface_ifp_cache_group = SBUS_INTERFACE(
+    SBUS_INTERFACE(iface_ifp_cache_group,
         org_freedesktop_sssd_infopipe_Cache,
         SBUS_METHODS(
             SBUS_SYNC(METHOD, org_freedesktop_sssd_infopipe_Cache, List, ifp_cache_list_group, ctx),
@@ -235,7 +235,7 @@ ifp_register_sbus_interface(struct sbus_connection *conn,
         SBUS_PROPERTIES(SBUS_NO_PROPERTIES)
     );
 
-    struct sbus_interface iface_ifp_cache_object_group = SBUS_INTERFACE(
+    SBUS_INTERFACE(iface_ifp_cache_object_group,
         org_freedesktop_sssd_infopipe_Cache_Object,
         SBUS_METHODS(
             SBUS_SYNC(METHOD, org_freedesktop_sssd_infopipe_Cache_Object, Store, ifp_cache_object_store_group, ctx),
diff --git a/src/responder/ifp/ifpsrv.c b/src/responder/ifp/ifpsrv.c
index 61072aad17..0c53534e4b 100644
--- a/src/responder/ifp/ifpsrv.c
+++ b/src/responder/ifp/ifpsrv.c
@@ -135,7 +135,7 @@ ifp_register_service_iface(struct ifp_ctx *ifp_ctx,
 {
     errno_t ret;
 
-    struct sbus_interface iface_svc = SBUS_INTERFACE(
+    SBUS_INTERFACE(iface_svc,
         sssd_service,
         SBUS_METHODS(
             SBUS_SYNC(METHOD, sssd_service, resInit, monitor_common_res_init, NULL),
diff --git a/src/responder/nss/nss_iface.c b/src/responder/nss/nss_iface.c
index f39c3d370f..a47b35fca1 100644
--- a/src/responder/nss/nss_iface.c
+++ b/src/responder/nss/nss_iface.c
@@ -219,7 +219,7 @@ nss_register_backend_iface(struct sbus_connection *conn,
 {
     errno_t ret;
 
-    struct sbus_interface iface = SBUS_INTERFACE(
+    SBUS_INTERFACE(iface,
         sssd_nss_MemoryCache,
         SBUS_METHODS(
             SBUS_SYNC(METHOD, sssd_nss_MemoryCache, UpdateInitgroups, nss_memorycache_update_initgroups, nss_ctx),
diff --git a/src/responder/nss/nsssrv.c b/src/responder/nss/nsssrv.c
index daaf3c06c8..9cc9c5d359 100644
--- a/src/responder/nss/nsssrv.c
+++ b/src/responder/nss/nsssrv.c
@@ -276,7 +276,7 @@ nss_register_service_iface(struct nss_ctx *nss_ctx,
 {
     errno_t ret;
 
-    struct sbus_interface iface_svc = SBUS_INTERFACE(
+    SBUS_INTERFACE(iface_svc,
         sssd_service,
         SBUS_METHODS(
             SBUS_SYNC(METHOD, sssd_service, resInit, monitor_common_res_init, NULL),
diff --git a/src/sbus/interface/sbus_introspection.c b/src/sbus/interface/sbus_introspection.c
index b2de9a9acd..8633837190 100644
--- a/src/sbus/interface/sbus_introspection.c
+++ b/src/sbus/interface/sbus_introspection.c
@@ -658,7 +658,7 @@ errno_t
 sbus_register_introspection(struct sbus_router *router)
 {
 
-    struct sbus_interface iface = SBUS_INTERFACE(
+    SBUS_INTERFACE(iface,
         org_freedesktop_DBus_Introspectable,
         SBUS_METHODS(
             SBUS_ASYNC(METHOD, org_freedesktop_DBus_Introspectable, Introspect,
diff --git a/src/sbus/interface/sbus_properties.c b/src/sbus/interface/sbus_properties.c
index 9df4c6bd63..8be933caad 100644
--- a/src/sbus/interface/sbus_properties.c
+++ b/src/sbus/interface/sbus_properties.c
@@ -867,7 +867,7 @@ errno_t
 sbus_register_properties(struct sbus_router *router)
 {
 
-    struct sbus_interface iface = SBUS_INTERFACE(
+    SBUS_INTERFACE(iface,
         org_freedesktop_DBus_Properties,
         SBUS_METHODS(
             SBUS_ASYNC(METHOD, org_freedesktop_DBus_Properties, Get,
diff --git a/src/sbus/sbus_interface.h b/src/sbus/sbus_interface.h
index eb1462dd23..45ab4b5ad9 100644
--- a/src/sbus/sbus_interface.h
+++ b/src/sbus/sbus_interface.h
@@ -80,7 +80,7 @@ struct sbus_node;
  *     };
  */
 #define SBUS_METHODS(...)                                                     \
-    (const struct sbus_method[]) {                                            \
+    {                                                                         \
         __VA_ARGS__,                                                          \
         SBUS_INTERFACE_SENTINEL                                               \
     }
@@ -117,7 +117,7 @@ struct sbus_node;
  *     };
  */
 #define SBUS_SIGNALS(...)                                                     \
-    (const struct sbus_signal[]) {                                            \
+    {                                                                         \
         __VA_ARGS__,                                                          \
         SBUS_INTERFACE_SENTINEL                                               \
     }
@@ -159,7 +159,7 @@ struct sbus_node;
  *     };
  */
 #define SBUS_PROPERTIES(...)                                                  \
-    (const struct sbus_property[]) {                                          \
+    {                                                                         \
         __VA_ARGS__,                                                          \
         SBUS_INTERFACE_SENTINEL                                               \
     }
@@ -228,6 +228,11 @@ struct sbus_node;
 /**
  * Create and sbus interface.
  *
+ * @param varname      Name of the variable that will hold the interface
+ *                     description. It is created as:
+ *                       struct sbus_interface varname;
+ *                     You can refer to it later when creating 'sbus_path'
+ *                     structure as &varname.
  * @param iface        Name of the interface with dots replaced
  *                     with underscore. (token, not a string)
  * @param methods      Methods on the interface.
@@ -239,8 +244,15 @@ struct sbus_node;
  *
  * @see SBUS_METHODS, SBUS_SIGNALS, SBUS_PROPERTIES to create those arguments.
  */
-#define SBUS_INTERFACE(iface, methods, signals, properties)                   \
-    SBUS_IFACE_ ## iface((methods), (signals), (properties))
+#define SBUS_INTERFACE(varname, iface, methods, signals, properties)          \
+    const struct sbus_method __ ## varname ## _m[] = methods;                 \
+    const struct sbus_signal __ ## varname ## _s[] = signals;                 \
+    const struct sbus_property __ ## varname ## _p[] = properties;            \
+    struct sbus_interface varname = SBUS_IFACE_ ## iface(                     \
+        (__ ## varname ## _m),                                                \
+        (__ ## varname ## _s),                                                \
+        (__ ## varname ## _p)                                                 \
+    )
 
 /**
  * Create a new sbus synchronous handler.
diff --git a/src/sbus/server/sbus_server_interface.c b/src/sbus/server/sbus_server_interface.c
index 695d4d09ba..9c0ba0abbf 100644
--- a/src/sbus/server/sbus_server_interface.c
+++ b/src/sbus/server/sbus_server_interface.c
@@ -387,7 +387,7 @@ sbus_server_setup_interface(struct sbus_server *server)
 {
     errno_t ret;
 
-    struct sbus_interface bus = SBUS_INTERFACE(
+    SBUS_INTERFACE(bus,
         org_freedesktop_DBus,
         SBUS_METHODS(
             SBUS_SYNC(METHOD, org_freedesktop_DBus, Hello, sbus_server_bus_hello, server),

From e056dc94fcec4adaa56cea3226865774ed3797c8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <pbrez...@redhat.com>
Date: Tue, 5 Feb 2019 10:36:13 +0100
Subject: [PATCH 2/2] sbus: improve documentation of SBUS_INTERFACE

---
 src/sbus/sbus_interface.h | 195 +++++++++++++++++++++++++++-----------
 1 file changed, 138 insertions(+), 57 deletions(-)

diff --git a/src/sbus/sbus_interface.h b/src/sbus/sbus_interface.h
index 45ab4b5ad9..2312fde683 100644
--- a/src/sbus/sbus_interface.h
+++ b/src/sbus/sbus_interface.h
@@ -49,35 +49,47 @@ struct sbus_node;
  *
  * @see SBUS_SYNC, SBUS_ASYNC, SBUS_NO_METHODS, SBUS_WITHOUT_METHODS
  *
+ * The following examples demonstrate the intended usage of this macro.
+ * Do not use it in any other way.
+ *
  * @example Interface with two methods, one with synchronous handler,
  * one with asynchronous handler.
  *
- *     struct sbus_interface iface = {
- *         .name = SBUS_IFACE_ORG_FREEDESKTOP_SSSD,
- *          SBUS_METHODS(
- *              SBUS_SYNC (METHOD, org_freedekstop_sssd, UpdateMembers,
- *                         update_members_sync, pvt_data),
- *              SBUS_ASYNC(METHOD, org_freedekstop_sssd, UpdateMembersAsync,
- *                         update_members_send, update_members_recv,
- *                         pvt_data)
- *          )
- *     };
+ *     SBUS_INTERFACE(
+ *         iface_variable,
+ *         org_freedesktop_sssd,
+ *         SBUS_METHODS(
+ *             SBUS_SYNC (METHOD, org_freedekstop_sssd, UpdateMembers,
+ *                       update_members_sync, pvt_data),
+ *             SBUS_ASYNC(METHOD, org_freedekstop_sssd, UpdateMembersAsync,
+ *                        update_members_send, update_members_recv,
+ *                        pvt_data)
+ *         ),
+ *         @signals,
+ *         @properties
+ *     );
  *
  * @example Interface with no methods.
  *
- *     struct sbus_interface empty_iface = {
- *         .name = SBUS_IFACE_ORG_FREEDESKTOP_SSSD,
- *          SBUS_METHODS(
- *              SBUS_NO_METHODS
- *          )
- *     };
+ *     SBUS_INTERFACE(
+ *         iface_variable,
+ *         org_freedesktop_sssd,
+ *         SBUS_METHODS(
+ *             SBUS_NO_METHODS
+ *         ),
+ *         @signals,
+ *         @properties
+ *     );
  *
  *     or
  *
- *     struct sbus_interface empty_iface = {
- *         .name = SBUS_IFACE_ORG_FREEDESKTOP_SSSD,
- *          SBUS_WITHOUT_METHODS
- *     };
+ *     SBUS_INTERFACE(
+ *         iface_variable,
+ *         org_freedesktop_sssd,
+ *         SBUS_WITHOUT_METHODS,
+ *         @signals,
+ *         @properties
+ *     );
  */
 #define SBUS_METHODS(...)                                                     \
     {                                                                         \
@@ -91,30 +103,42 @@ struct sbus_node;
  *
  * @see SBUS_EMIT, SBUS_NO_SIGNALS, SBUS_WITHOUT_SIGNALS
  *
+ * The following examples demonstrate the intended usage of this macro.
+ * Do not use it in any other way.
+ *
  * @example Interface that can emit a PropertyChanged signal.
  *
- *     struct sbus_interface iface = {
- *         .name = SBUS_IFACE_ORG_FREEDESKTOP_SSSD,
- *          SBUS_SIGNALS(
- *              SBUS_EMIT(org_freedekstop_sssd, PropertyChanged)
- *          )
- *     };
+ *     SBUS_INTERFACE(
+ *         iface_variable,
+ *         org_freedesktop_sssd,
+ *         @methods,
+ *         SBUS_SIGNALS(
+ *             SBUS_EMIT(org_freedekstop_sssd, PropertyChanged)
+ *         ),
+ *         @properties
+ *     );
  *
  * @example Interface with no signals.
  *
- *     struct sbus_interface empty_iface = {
- *         .name = SBUS_IFACE_ORG_FREEDESKTOP_SSSD,
- *          SBUS_SIGNALS(
- *              SBUS_NO_SIGNALS
- *          )
- *     };
+ *     SBUS_INTERFACE(
+ *         iface_variable,
+ *         org_freedesktop_sssd,
+ *         @methods,
+ *         SBUS_SIGNALS(
+ *             SBUS_NO_SIGNALS
+ *         ),
+ *         @properties
+ *     );
  *
  *     or
  *
- *     struct sbus_interface empty_iface = {
- *         .name = SBUS_IFACE_ORG_FREEDESKTOP_SSSD,
- *          SBUS_WITHOUT_SIGNALS
- *     };
+ *     SBUS_INTERFACE(
+ *         iface_variable,
+ *         org_freedesktop_sssd,
+ *         @methods,
+ *         SBUS_WITHOUT_SIGNALS,
+ *         @properties
+ *     );
  */
 #define SBUS_SIGNALS(...)                                                     \
     {                                                                         \
@@ -128,35 +152,47 @@ struct sbus_node;
  *
  * @see SBUS_SYNC, SBUS_ASYNC, SBUS_NO_PROPERTIES, SBUS_WITHOUT_PROPERTIES
  *
+ * The following examples demonstrate the intended usage of this macro.
+ * Do not use it in any other way.
+ *
  * @example Interface with one property with asynchronous getter and
  * synchronous setter.
  *
- *     struct sbus_interface iface = {
- *         .name = SBUS_IFACE_ORG_FREEDESKTOP_SSSD,
- *          SBUS_PROPERTIES(
- *              SBUS_SYNC (GETTER, org_freedekstop_sssd, domain_name,
- *                         set_domain_name, pvt_data),
- *              SBUS_ASYNC(GETTER, org_freedekstop_sssd, domain_name,
- *                         get_domain_name_send, get_domain_name_recv,
- *                         pvt_data)
- *          )
- *     };
+ *     SBUS_INTERFACE(
+ *         iface_variable,
+ *         org_freedesktop_sssd,
+ *         @methods,
+ *         @signals,
+ *         SBUS_PROPERTIES(
+ *             SBUS_SYNC (GETTER, org_freedekstop_sssd, domain_name,
+ *                        set_domain_name, pvt_data),
+ *             SBUS_ASYNC(GETTER, org_freedekstop_sssd, domain_name,
+ *                        get_domain_name_send, get_domain_name_recv,
+ *                        pvt_data)
+ *         )
+ *     );
  *
  * @example Interface with no properties.
  *
- *     struct sbus_interface empty_iface = {
- *         .name = SBUS_IFACE_ORG_FREEDESKTOP_SSSD,
- *          SBUS_PROPERTIES(
- *              SBUS_NO_PROPERTIES
- *          )
- *     };
+ *     SBUS_INTERFACE(
+ *         iface_variable,
+ *         org_freedesktop_sssd,
+ *         @methods,
+ *         @signals,
+ *         SBUS_PROPERTIES(
+ *             SBUS_NO_PROPERTIES
+ *         )
+ *     );
  *
  *     or
  *
- *     struct sbus_interface empty_iface = {
- *         .name = SBUS_IFACE_ORG_FREEDESKTOP_SSSD,
- *          SBUS_WITHOUT_PROPERTIES
- *     };
+ *     SBUS_INTERFACE(
+ *         iface_variable,
+ *         org_freedesktop_sssd,
+ *         @methods,
+ *         @signals,
+ *         SBUS_WITHOUT_PROPERTIES
+ *     );
  */
 #define SBUS_PROPERTIES(...)                                                  \
     {                                                                         \
@@ -239,8 +275,53 @@ struct sbus_node;
  * @param signals      Signals on the interface.
  * @param properties   Properties on the interface.
  *
+ * Please note that the following macro introduced to the scope these variables:
+ *   - __varname_m
+ *   - __varname_s
+ *   - __varname_p
+ *
+ * These variables are intended for internal purpose only and should not be
+ * used outside this macro. They are allocated on stack and will be destroyed
+ * with it.
+ *
+ * Additionally, it creates 'struct sbus_interface varname'. This variable
+ * holds the information about the interfaces you created. The structure and
+ * all its data are allocated on stack and will be destroyed with it.
+ *
+ * The only intended usage of this variable is to assign it to an sbus path
+ * and then register this path inside the same function where the interface
+ * is defined. It should not be used in any other way.
+ *
+ * The following example demonstrates the intended usage of this macro.
+ * Do not use it in any other way.
+ *
  * @example
- *     SBUS_INTERFACE(org_freedesktop_sssd, @methods, @signals, @properties)
+ *     SBUS_INTERFACE(
+ *         iface_bus,
+ *         org_freedesktop_DBus,
+ *         SBUS_METHODS(
+ *             SBUS_SYNC(METHOD, org_freedesktop_DBus, Hello, sbus_server_bus_hello, server),
+ *             SBUS_SYNC(METHOD, org_freedesktop_DBus, RequestName, sbus_server_bus_request_name, server),
+ *         ),
+ *         SBUS_SIGNALS(
+ *             SBUS_EMITS(org_freedesktop_DBus, NameOwnerChanged),
+ *             SBUS_EMITS(org_freedesktop_DBus, NameAcquired),
+ *             SBUS_EMITS(org_freedesktop_DBus, NameLost)
+ *         ),
+ *         SBUS_WITHOUT_PROPERTIES
+ *     );
+ *
+ *     struct sbus_path paths[] = {
+ *          {"/org/freedesktop/dbus", &iface_bus},
+ *          {NULL, NULL}
+ *     };
+ *
+ *     ret = sbus_router_add_path_map(server->router, paths);
+ *     if (ret != EOK) {
+ *         DEBUG(SSSDBG_CRIT_FAILURE, "Unable to add paths [%d]: %s\n",
+ *               ret, sss_strerror(ret));
+ *         return ret;
+ *     }
  *
  * @see SBUS_METHODS, SBUS_SIGNALS, SBUS_PROPERTIES to create those arguments.
  */
_______________________________________________
sssd-devel mailing list -- sssd-devel@lists.fedorahosted.org
To unsubscribe send an email to sssd-devel-le...@lists.fedorahosted.org
Fedora Code of Conduct: https://getfedora.org/code-of-conduct.html
List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
List Archives: 
https://lists.fedorahosted.org/archives/list/sssd-devel@lists.fedorahosted.org

Reply via email to