If the user is in group 0, we'd exit the loop early with a failure. Make sure
we run through all groups.

https://gitlab.freedesktop.org/wayland/weston/issues/86

Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net>
---
 libweston/weston-launch.c | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/libweston/weston-launch.c b/libweston/weston-launch.c
index 1adcf21a..c076577e 100644
--- a/libweston/weston-launch.c
+++ b/libweston/weston-launch.c
@@ -121,7 +121,7 @@ struct weston_launch {
 union cmsg_data { unsigned char b[4]; int fd; };
 
 static gid_t *
-read_groups(void)
+read_groups(int *ngroups)
 {
        int n;
        gid_t *groups;
@@ -142,6 +142,8 @@ read_groups(void)
                free(groups);
                return NULL;
        }
+
+       *ngroups = n;
        return groups;
 }
 
@@ -150,7 +152,7 @@ weston_launch_allowed(struct weston_launch *wl)
 {
        struct group *gr;
        gid_t *groups;
-       int i;
+       int ngroups;
 #ifdef HAVE_SYSTEMD_LOGIN
        char *session, *seat;
        int err;
@@ -161,10 +163,10 @@ weston_launch_allowed(struct weston_launch *wl)
 
        gr = getgrnam("weston-launch");
        if (gr) {
-               groups = read_groups();
-               if (groups) {
-                       for (i = 0; groups[i]; ++i) {
-                               if (groups[i] == gr->gr_gid) {
+               groups = read_groups(&ngroups);
+               if (groups && ngroups > 0) {
+                       while(ngroups--) {
+                               if (groups[ngroups] == gr->gr_gid) {
                                        free(groups);
                                        return true;
                                }
-- 
2.14.4

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to