]> git.ipfire.org Git - thirdparty/shadow.git/commitdiff
lib/addgrps.c: add_groups(): Remove arbitrary limit
authorAlejandro Colomar <alx@kernel.org>
Fri, 15 Nov 2024 14:11:29 +0000 (15:11 +0100)
committerSerge Hallyn <serge@hallyn.com>
Fri, 24 Jan 2025 13:58:13 +0000 (07:58 -0600)
Reviewed-by: Serge Hallyn <serge@hallyn.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
lib/addgrps.c

index 2fb4a3166f597bf92d5a4786ff646fcad7a5802c..29cb1f232467841358a0ccaa02b5de0f3c7938cc 100644 (file)
@@ -34,18 +34,11 @@ int
 add_groups(const char *list)
 {
        GETGROUPS_T  *gids;
-       char *g, *p;
-       char buf[1024];
+       char    *g, *p, *dup;
        FILE *shadow_logfd = log_get_logfd();
        size_t  n;
        ssize_t n0;
 
-       if (strlen (list) >= sizeof (buf)) {
-               errno = EINVAL;
-               return -1;
-       }
-       strcpy (buf, list);
-
        n0 = getgroups(0, NULL);
        if (n0 == -1)
                return -1;
@@ -62,8 +55,11 @@ add_groups(const char *list)
        if (gids == NULL)
                return -1;
 
+       p = dup = strdup(list);
+       if (dup == NULL)
+               goto free_gids;
+
        n = n0;
-       p = buf;
        while (NULL != (g = strsep(&p, ",:"))) {
                struct group  *grp;
 
@@ -75,6 +71,7 @@ add_groups(const char *list)
 
                LSEARCH(&grp->gr_gid, gids, &n);
        }
+       free(dup);
 
        if (setgroups(n, gids) == -1) {
                fprintf(shadow_logfd, "setgroups: %s\n", strerror(errno));