]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
tools: virt-login-shell: Fix group list bounds checking
authorPeter Krempa <pkrempa@redhat.com>
Fri, 17 Jun 2016 12:50:44 +0000 (14:50 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 20 Jun 2016 14:48:55 +0000 (16:48 +0200)
The list certainly isn't zero terminated and it would disallow usage of
group 'root'. Pass in the array size and match against it.

tools/virt-login-shell.c

index 38fcb9e38fc66d430cfa5560a245def3c76db05d..96ca410b5403ff7dc141fe84c1043867b8577b63 100644 (file)
@@ -47,7 +47,8 @@ static const char *conf_file = SYSCONFDIR "/libvirt/virt-login-shell.conf";
 
 static int virLoginShellAllowedUser(virConfPtr conf,
                                     const char *name,
-                                    gid_t *groups)
+                                    gid_t *groups,
+                                    size_t ngroups)
 {
     virConfValuePtr p;
     int ret = -1;
@@ -74,7 +75,7 @@ static int virLoginShellAllowedUser(virConfPtr conf,
                     ptr = &pp->str[1];
                     if (!*ptr)
                         continue;
-                    for (i = 0; groups[i]; i++) {
+                    for (i = 0; i < ngroups; i++) {
                         if (!(gname = virGetGroupName(groups[i])))
                             continue;
                         if (fnmatch(ptr, gname, 0) == 0) {
@@ -306,7 +307,7 @@ main(int argc, char **argv)
     if ((ngroups = virGetGroupList(uid, gid, &groups)) < 0)
         goto cleanup;
 
-    if (virLoginShellAllowedUser(conf, name, groups) < 0)
+    if (virLoginShellAllowedUser(conf, name, groups, ngroups) < 0)
         goto cleanup;
 
     if (virLoginShellGetShellArgv(conf, &shargv, &shargvlen) < 0)