Changed init_callbacks_list to int type 74/275874/5
authorArkadiusz Nowak <a.nowak3@samsung.com>
Fri, 3 Jun 2022 09:38:31 +0000 (11:38 +0200)
committerArkadiusz Nowak <a.nowak3@samsung.com>
Fri, 3 Jun 2022 12:35:26 +0000 (14:35 +0200)
Internal append_to_callbacks_list internal function
that contains g_mutex management

Change-Id: I4d8380431bef46941cc23e5bfc61bc0a8e968698

libsessiond/src/lib.c
libsessiond/src/lib.h

index e48dc0c..c17c1c1 100644 (file)
@@ -152,7 +152,7 @@ typedef struct {
        int signal_subscribed;
 } signal_client_data_t;
 
-int get_dbus_error_mapping_to_subsession_error(const char *dbus_error)
+static int get_dbus_error_mapping_to_subsession_error(const char *dbus_error)
 {
        size_t arr_size = sizeof(error_mappings) / sizeof(error_mappings[0]);
 
@@ -164,7 +164,7 @@ int get_dbus_error_mapping_to_subsession_error(const char *dbus_error)
        return SUBSESSION_ERROR_IO_ERROR;
 }
 
-int map_dbus_call_error_to_return_value(const GError *error) {
+static int map_dbus_call_error_to_return_value(const GError *error) {
 
        g_assert(error);
 
@@ -184,7 +184,11 @@ int map_dbus_call_error_to_return_value(const GError *error) {
        return SUBSESSION_ERROR_IO_ERROR;
 }
 
-signal_client_data_t *make_new_signal_callback_client_data(void *client_callback, void *client_callback_data, GVariant *params) {
+static signal_client_data_t *make_new_signal_callback_client_data(void *client_callback, void *client_callback_data, GVariant *params) {
+
+       if(params == NULL) {
+               return NULL;
+       }
 
        signal_client_data_t *signal_data = (signal_client_data_t *)malloc(sizeof(signal_client_data_t));
 
@@ -193,14 +197,13 @@ signal_client_data_t *make_new_signal_callback_client_data(void *client_callback
                signal_data->client_callback_data = client_callback_data;
                signal_data->params = params;
                g_variant_ref(signal_data->params);
-               g_assert(params != NULL);
                return signal_data;
        }
        return NULL;
 }
 
 
-gint g_compare_user_params (  gconstpointer client_data,   gconstpointer parameters) {
+static gint g_compare_user_params (  gconstpointer client_data,   gconstpointer parameters) {
 
        signal_client_data_t *signal_client_data = (signal_client_data_t*)client_data;
 
@@ -233,7 +236,7 @@ gint g_compare_user_params (  gconstpointer client_data,   gconstpointer paramet
        return COMPARATOR_RESULT_DIFFERENT_;
 }
 
-gint g_compare_session_uid_params (  gconstpointer client_data,   gconstpointer parameters) {
+static gint g_compare_session_uid_params (  gconstpointer client_data,   gconstpointer parameters) {
 
        maybe_not_comparable_if(
                client_data_are_null(client_data,
@@ -268,7 +271,7 @@ gint g_compare_session_uid_params (  gconstpointer client_data,   gconstpointer
        return COMPARATOR_RESULT_DIFFERENT_;
 }
 
-gint g_compare_session_uid_params_switch_wait (  gconstpointer client_data,   gconstpointer parameters) {
+static gint g_compare_session_uid_params_switch_wait (  gconstpointer client_data,   gconstpointer parameters) {
 
        maybe_not_comparable_if(
                client_data_are_null(client_data,
@@ -310,7 +313,7 @@ gint g_compare_session_uid_params_switch_wait (  gconstpointer client_data,   gc
        return COMPARATOR_RESULT_DIFFERENT_;
 }
 
-gint g_compare_session_uid_params_wait (gconstpointer client_data, gconstpointer parameters) {
+static gint g_compare_session_uid_params_wait (gconstpointer client_data, gconstpointer parameters) {
 
        maybe_not_comparable_if(
                client_data_are_null(client_data,
@@ -342,7 +345,7 @@ gint g_compare_session_uid_params_wait (gconstpointer client_data, gconstpointer
        return COMPARATOR_RESULT_DIFFERENT_;
 }
 
-signal_client_data_t *take_from_callbacks_data_and_remove_from_list( client_callbacks_data_t *client_callbacks_data, gconstpointer parameters, GCompareFunc compare_user_params) {
+static signal_client_data_t *take_from_callbacks_data_and_remove_from_list( client_callbacks_data_t *client_callbacks_data, gconstpointer parameters, GCompareFunc compare_user_params) {
 
        signal_client_data_t *signal_data = NULL;
 
@@ -360,7 +363,7 @@ signal_client_data_t *take_from_callbacks_data_and_remove_from_list( client_call
        return signal_data;
 }
 
-signal_client_data_t *find_in_callbacks_data( client_callbacks_data_t *client_callbacks_data, gconstpointer parameters, GCompareFunc compare_user_params) {
+static signal_client_data_t *find_in_callbacks_data( client_callbacks_data_t *client_callbacks_data, gconstpointer parameters, GCompareFunc compare_user_params) {
 
        signal_client_data_t *signal_data = NULL;
 
@@ -375,7 +378,7 @@ signal_client_data_t *find_in_callbacks_data( client_callbacks_data_t *client_ca
 
 const int cb_result_ok = 0;
 
-void call_reply_callback(signal_client_data_t *signal_data, int ret_status) {
+static void call_reply_callback(signal_client_data_t *signal_data, int ret_status) {
 
        subsession_reply_callback reply_cb = signal_data->client_callback;
        void *client_callback_data = signal_data->client_callback_data;
@@ -417,7 +420,7 @@ static void signal_user_ops_complete_handler(
 #define signal_add_user_complete_handler signal_user_ops_complete_handler
 #define signal_remove_user_complete_handler signal_user_ops_complete_handler
 
-gint g_compare_switch_user_params (  gconstpointer client_data,   gconstpointer parameters) {
+static gint g_compare_switch_user_params (  gconstpointer client_data,   gconstpointer parameters) {
 
        maybe_not_comparable_if(
                client_data_are_null(client_data,
@@ -638,7 +641,7 @@ static void  signal_switch_user_completion_handler( GDBusConnection *connection,
                        _signal_name, \
                        session_connection_data.objpath
 
-int subscribe_and_call_method(gchar *method, GVariant *params, gchar *signal_name, guint *signal_subscribed_id, GDBusSignalCallback signal_callback, gpointer client_callbacks) {
+static int subscribe_and_call_method(gchar *method, GVariant *params, gchar *signal_name, guint *signal_subscribed_id, GDBusSignalCallback signal_callback, gpointer client_callbacks) {
 
        GError *error = NULL;
 
@@ -683,7 +686,7 @@ int subscribe_and_call_method(gchar *method, GVariant *params, gchar *signal_nam
        return SUBSESSION_ERROR_NONE;
 }
 
-int method_call_no_signal(gchar *method, GVariant *params) {
+static int method_call_no_signal(gchar *method, GVariant *params) {
 
        GError *error = NULL;
 
@@ -695,7 +698,7 @@ int method_call_no_signal(gchar *method, GVariant *params) {
                }
        }
        if(params == NULL) {
-               return  SUBSESSION_ERROR_INVALID_PARAMETER;
+               return  SUBSESSION_ERROR_OUT_OF_MEMORY;
        }
 
        GVariant *retgv = NULL;
@@ -721,7 +724,7 @@ int method_call_no_signal(gchar *method, GVariant *params) {
        return SUBSESSION_ERROR_NONE;
 }
 
-int method_call_no_signal_return(gchar *method, GVariant *params, const GVariantType *out_type, GVariant **out) {
+static int method_call_no_signal_return(gchar *method, GVariant *params, const GVariantType *out_type, GVariant **out) {
 
        GError *error;
        error = NULL;
@@ -757,7 +760,7 @@ int method_call_no_signal_return(gchar *method, GVariant *params, const GVariant
        return SUBSESSION_ERROR_NONE;
 }
 
-void client_data_cleansweep_mt( signal_client_data_t *signal_client_data, client_callbacks_data_t *callbacks_data) {
+static void client_data_cleansweep_mt( signal_client_data_t *signal_client_data, client_callbacks_data_t *callbacks_data) {
 
        g_mutex_lock(&callbacks_data->mutex);
                callbacks_data->list = g_list_remove(callbacks_data->list, (gconstpointer) signal_client_data);
@@ -767,17 +770,40 @@ void client_data_cleansweep_mt( signal_client_data_t *signal_client_data, client
        free(signal_client_data);
 }
 
-void init_callbacks_list(client_callbacks_data_t *callbacks_data, GVariant *params) {
+static int init_callbacks_list(client_callbacks_data_t *callbacks_data, GVariant *params) {
 
        if(callbacks_data->list == NULL) {
                signal_client_data_t *signal_client_empty_data = make_new_signal_callback_client_data(NULL, NULL, params);
+               if(signal_client_empty_data == NULL) {
+                       return SUBSESSION_ERROR_OUT_OF_MEMORY;
+               }
                callbacks_data->list = g_list_append(callbacks_data->list, (gpointer) signal_client_empty_data);
        }
+       return SUBSESSION_ERROR_NONE;
 }
 
 #define callbacks_data_append_to_list(callback_data, data) \
        callback_data.list = g_list_append(callback_data.list, data)
 
+static int append_to_callbacks_list(client_callbacks_data_t *callbacks_data_mt, GVariant *init_params, signal_client_data_t *signal_client_data, subsession_reply_callback cb, void *cb_data) {
+
+       if(init_params == NULL || signal_client_data == NULL ) {
+               return SUBSESSION_ERROR_OUT_OF_MEMORY;
+       }
+
+       g_mutex_lock(&callbacks_data_mt->mutex);
+       int init_callbacks_list_res = init_callbacks_list(callbacks_data_mt, init_params);
+
+       if(init_callbacks_list_res != SUBSESSION_ERROR_NONE) {
+               g_mutex_unlock(&callbacks_data_mt->mutex);
+               return init_callbacks_list_res;
+       }
+       callbacks_data_mt->list = g_list_append(callbacks_data_mt->list, signal_client_data);
+
+       g_mutex_unlock(&callbacks_data_mt->mutex);
+
+       return SUBSESSION_ERROR_NONE;
+}
 
 EXPORT_API int subsession_add_user(int session_uid, int user, subsession_reply_callback cb, void *cb_data) {
 
@@ -788,19 +814,16 @@ EXPORT_API int subsession_add_user(int session_uid, int user, subsession_reply_c
                callbacks_data_are_null(cb_data))))
        )
 
-       g_mutex_lock (&add_user_callbacks_data_mt.mutex);
-
-       init_callbacks_list(&add_user_callbacks_data_mt,  g_variant_new("(ii)", -1, -1));
-
-       GVariant * params = g_variant_new("(ii)", session_uid, user);
+       signal_client_data_t *signal_client_data = make_new_signal_callback_client_data(cb, cb_data,  g_variant_new("(ii)", session_uid, user));
 
-       signal_client_data_t *signal_client_data = make_new_signal_callback_client_data(cb, cb_data, params);
-       callbacks_data_append_to_list(add_user_callbacks_data_mt, signal_client_data);
+       ret_if_err_( append_to_callbacks_list(&add_user_callbacks_data_mt,
+               g_variant_new("(ii)", -1, -1),
+               signal_client_data,
+               cb, cb_data))
 
-       g_mutex_unlock(&add_user_callbacks_data_mt.mutex);
 
        int method_call_result = subscribe_and_call_method(
-               dbus_method_call.AddUser, params,
+               dbus_method_call.AddUser, signal_client_data->params,
                dbus_signal_name.AddUserCompleted,
                &dbus_signal_subscribed.AddUserCompleted,
                signal_add_user_complete_handler,
@@ -822,19 +845,15 @@ EXPORT_API int subsession_remove_user(int session_uid, int user, subsession_repl
                callbacks_data_are_null(cb_data))))
        )
 
-       g_mutex_lock (&remove_user_callbacks_data_mt.mutex);
+       signal_client_data_t *signal_client_data = make_new_signal_callback_client_data(cb, cb_data, g_variant_new("(ii)", session_uid, user));
 
-       init_callbacks_list(&remove_user_callbacks_data_mt, g_variant_new("(ii)", -1, -1));
-
-       GVariant * params = g_variant_new("(ii)", session_uid, user);
-
-       signal_client_data_t *signal_client_data = make_new_signal_callback_client_data(cb, cb_data, params);
-       callbacks_data_append_to_list(remove_user_callbacks_data_mt, signal_client_data);
-
-       g_mutex_unlock(&remove_user_callbacks_data_mt.mutex);
+       ret_if_err_( append_to_callbacks_list(&remove_user_callbacks_data_mt,
+               g_variant_new("(ii)", -1, -1),
+               signal_client_data,
+               cb, cb_data))
 
        int method_call_result = subscribe_and_call_method(
-               dbus_method_call.RemoveUser, params,
+               dbus_method_call.RemoveUser, signal_client_data->params,
                dbus_signal_name.RemoveUserCompleted,
                &dbus_signal_subscribed.RemoveUserCompleted,
                signal_remove_user_complete_handler,
@@ -858,20 +877,15 @@ EXPORT_API int subsession_switch_user(int session_uid, int next_user, subsession
                callbacks_data_are_null(cb_data))))
        )
 
-       g_mutex_lock (&switch_user_callbacks_data_mt.mutex);
-
-       init_callbacks_list(&switch_user_callbacks_data_mt,  g_variant_new("(ii)", -1, -1));
-
-       GVariant * params;
-       params = g_variant_new("(ii)", session_uid, next_user);
+       signal_client_data_t *signal_client_data = make_new_signal_callback_client_data(cb, cb_data, g_variant_new("(ii)", session_uid, next_user));
 
-       signal_client_data_t *signal_client_data = make_new_signal_callback_client_data(cb, cb_data, params);
-       callbacks_data_append_to_list(switch_user_callbacks_data_mt, signal_client_data);
-
-       g_mutex_unlock(&switch_user_callbacks_data_mt.mutex);
+       ret_if_err_( append_to_callbacks_list(&switch_user_callbacks_data_mt,
+               g_variant_new("(ii)", -1, -1),
+               signal_client_data,
+               cb, cb_data))
 
        int method_call_result = subscribe_and_call_method (
-               dbus_method_call.SwitchUser, params,
+               dbus_method_call.SwitchUser, signal_client_data->params,
                dbus_signal_name.SwitchUserCompleted,
                &dbus_signal_subscribed.SwitchUserCompleted,
                signal_switch_user_complete_handler,
@@ -891,23 +905,37 @@ EXPORT_API int subsession_switch_user(int session_uid, int next_user, subsession
 typedef struct {
        signal_client_data_t *signal_client_data;
        int is_registered;
+       int error;
 } registered_signal_t;
 
 
 registered_signal_t subsession_register_event_in_list(client_callbacks_data_t *callbacks_data, GVariant *init_params, GVariant *params, subsession_event_callback cb, void *cb_data) {
 
+       registered_signal_t registered_signal = {0};
 
        g_mutex_lock(&callbacks_data->mutex);
 
-       init_callbacks_list(callbacks_data, init_params);
+       int init_callbacks_res = init_callbacks_list(callbacks_data, init_params);
+
+       if(init_callbacks_res != SUBSESSION_ERROR_NONE) {
+               g_mutex_unlock(&callbacks_data->mutex);
+               registered_signal.error = SUBSESSION_ERROR_OUT_OF_MEMORY;
+               return registered_signal;
+       }
+
        signal_client_data_t *signal_client_data = NULL;
-       registered_signal_t registered_signal;
 
        GList *found_data = g_list_find_custom( callbacks_data->list , (gconstpointer) params, g_compare_session_uid_params );
 
        if(found_data == NULL) {
                registered_signal.is_registered = 0;
                signal_client_data = make_new_signal_callback_client_data(cb, cb_data, params);
+
+               if (signal_client_data == NULL) {
+                       g_mutex_unlock(&callbacks_data->mutex);
+                       registered_signal.error = SUBSESSION_ERROR_OUT_OF_MEMORY;
+                       return registered_signal;
+               }
                callbacks_data->list = g_list_append(callbacks_data->list, signal_client_data);
        } else {
                //This will change callback function and data.
@@ -921,6 +949,7 @@ registered_signal_t subsession_register_event_in_list(client_callbacks_data_t *c
                signal_client_data->client_callback_data = cb_data;
        }
        registered_signal.signal_client_data = signal_client_data;
+       registered_signal.error = SUBSESSION_ERROR_NONE;
 
        g_mutex_unlock(&callbacks_data->mutex);
        return registered_signal;
@@ -942,10 +971,26 @@ registered_signal_t subsession_register_event_in_list(client_callbacks_data_t *c
 
 int register_event_callback(client_callbacks_data_t *callbacks_data, GDBusSignalCallback signal_callback, int session_uid, subsession_event_callback cb, void * cb_data) {
 
+       return_if(
+               callbacks_data_are_null(callbacks_data,
+               signal_callback_is_null(signal_callback,
+               session_uid_is_not_valid(session_uid,
+               callback_is_null(cb,
+               callbacks_data_are_null(cb)))))
+       )
+
        GVariant * params = g_variant_new("(i)", session_uid);
 
+       if(params == NULL) {
+               return SUBSESSION_ERROR_OUT_OF_MEMORY;
+       }
+
        registered_signal_t registered_signal = subsession_register_event_in_list(callbacks_data, default_wait_params_, cb_data_ );
 
+       if(registered_signal.error != SUBSESSION_ERROR_NONE) {
+               return  registered_signal.error;
+       }
+
        if(registered_signal.is_registered) {
                return SUBSESSION_ERROR_NONE;
        }
@@ -968,8 +1013,17 @@ int subscribe_only_callback(client_callbacks_data_t *callbacks_data, GDBusSignal
 
        GVariant * params = g_variant_new("(i)", session_uid);
 
+       if(params == NULL) {
+               return SUBSESSION_ERROR_OUT_OF_MEMORY;
+       }
+
        registered_signal_t registered_signal = subsession_register_event_in_list(callbacks_data, default_wait_params_, cb_data_ );
 
+
+       if(registered_signal.error != SUBSESSION_ERROR_NONE) {
+               return  registered_signal.error;
+       }
+
        if(registered_signal.is_registered) {
                return SUBSESSION_ERROR_NONE;
        }
@@ -997,10 +1051,6 @@ int subscribe_only_callback(client_callbacks_data_t *callbacks_data, GDBusSignal
        return SUBSESSION_ERROR_NONE;
 }
 
-#define ret_if_err_(func_) \
-       int err_ = func_; \
-       if(err_) {return err_ ;}
-
 EXPORT_API int subsession_register_event_callback(int session_uid, subsession_event_type_e event_bits, subsession_event_callback cb, void *cb_data) {
 
        if (event_bits & SUBSESSION_ADD_USER_WAIT) {
index d269e79..8d17193 100644 (file)
@@ -65,8 +65,15 @@ typedef struct {
 #define parameters_are_null(a, ...) || (a == NULL) __VA_ARGS__
 #define callback_is_null(a, ...) || (a == NULL) __VA_ARGS__
 #define callbacks_data_are_null(a, ...) || (a == NULL) __VA_ARGS__
+#define signal_data_is_null(a, ...) || (a == NULL) __VA_ARGS__
+#define signal_callback_is_null(a, ...) || (a == NULL) __VA_ARGS__
 
- #define error_if(a, error) if ( (0) a ) { return error; }
+#define ret_if_err_(func_) \
+       int err_ = func_; \
+       if(err_) {return err_ ;}
+
+
+#define error_if(a, error) if ( (0) a ) { return error; }
 
 #define maybe_not_comparable_if(a) error_if(a, COMPARATOR_RESULT_DIFFERENT_)
 #define return_if(a) error_if(a, SUBSESSION_ERROR_INVALID_PARAMETER)