lib: get_user_list: Numerous fixes 47/277747/5
authorKarol Lewandowski <k.lewandowsk@samsung.com>
Tue, 12 Jul 2022 20:15:31 +0000 (22:15 +0200)
committerArkadiusz Nowak <a.nowak3@samsung.com>
Wed, 13 Jul 2022 12:27:09 +0000 (14:27 +0200)
- use SUBSESSION_* errors only (instead of 0/TIZEN_* domain errors)
- use exact types where possible (subsession_user_t instead of void)
- fix off-by one when copying gvariant string whose lenght >= USER_MAXLEN
- minor style fixes

Change-Id: I47821432306f48caac719e2a09c3af8c1b8b452b

libsessiond/src/lib.c

index 8a11a9e..381dd34 100644 (file)
@@ -1112,40 +1112,36 @@ EXPORT_API int subsession_event_wait_done(subsession_event_info info) {
 }
 
 EXPORT_API int subsession_get_user_list(int session_uid, subsession_user_t **user_list, int *user_count) {
-       return_if(
-               session_uid_is_not_valid(session_uid,
-               user_count_ptr_is_null(user_count))
-       )
+
+       return_if(session_uid_is_not_valid(session_uid, user_count_ptr_is_null(user_count)))
 
        g_autoptr(GVariant) out = NULL;
        int ret = method_call_no_signal_return(dbus_method_call.GetUserList,
-               g_variant_new("(i)", session_uid),
-               G_VARIANT_TYPE("(as)"),
-               &out);
+                                              g_variant_new("(i)", session_uid),
+                                              G_VARIANT_TYPE("(as)"),
+                                              &out);
 
-       if (ret != 0)
+       if (ret != SUBSESSION_ERROR_NONE)
                return ret;
 
        g_autoptr(GVariant) array = g_variant_get_child_value(out, 0);
-
        gsize elem_no = 0;
        g_autofree const char** data = g_variant_get_strv(array, &elem_no);
 
-       if(user_list != NULL) {
-
-               void * raw_data = calloc(elem_no, SUBSESSION_USER_MAXLEN);
-               if (raw_data == NULL) {
+       if (user_list != NULL && elem_no > 0) {
+               subsession_user_t *list = calloc(elem_no, sizeof(subsession_user_t));
+               if (list == NULL) {
                        return SUBSESSION_ERROR_OUT_OF_MEMORY;
                }
-               *user_list = (subsession_user_t *)raw_data;
-
+               *user_list = list;
 
                for (gsize i = 0; i < elem_no; ++i) {
-                       memcpy((*user_list)[i], data[i], strnlen(data[i], SUBSESSION_USER_MAXLEN)+1);
+                       memcpy((*user_list)[i], data[i], strnlen(data[i], sizeof(subsession_user_t)-1) + 1);
                }
        }
+
        *user_count = elem_no;
-       return TIZEN_ERROR_NONE;
+       return SUBSESSION_ERROR_NONE;
 }
 
 EXPORT_API int subsession_get_current_user(int session_uid, subsession_user_t user) {