X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=driver%2Ftest-uid.c;h=6a1f9cc14024ec7e51ebb316fad9eb582794afd2;hb=49f5b54f312fe4ac2e9bc47581a72451bd0e8439;hp=d0448f950b56c14559d06b2cd54764477a351170;hpb=ce3185de9d9705e259f2b60dd4b5509007fa17d4;p=xscreensaver diff --git a/driver/test-uid.c b/driver/test-uid.c index d0448f95..6a1f9cc1 100644 --- a/driver/test-uid.c +++ b/driver/test-uid.c @@ -1,5 +1,5 @@ -/* uid-test.c --- playing with setuid. - * xscreensaver, Copyright (c) 1998 Jamie Zawinski +/* test-uid.c --- playing with setuid. + * xscreensaver, Copyright (c) 1998, 2005 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -14,6 +14,11 @@ # include "config.h" #endif +#include +#ifdef HAVE_UNISTD_H +# include +#endif + #include #include #include @@ -31,18 +36,38 @@ print(void) int egid = getegid(); struct passwd *p = 0; struct group *g = 0; + gid_t groups[1024]; + int n, size; p = getpwuid (uid); g = getgrgid (gid); - fprintf(stderr, "real user/group: %ld/%ld (%s/%s)\n", uid, gid, + fprintf(stderr, "real user/group: %ld/%ld (%s/%s)\n", (long) uid, (long) gid, (p && p->pw_name ? p->pw_name : "???"), (g && g->gr_name ? g->gr_name : "???")); p = getpwuid (euid); g = getgrgid (egid); - fprintf(stderr, "eff. user/group: %ld/%ld (%s/%s)\n", euid, egid, + fprintf(stderr, "eff. user/group: %ld/%ld (%s/%s)\n", (long)euid, (long)egid, (p && p->pw_name ? p->pw_name : "???"), (g && g->gr_name ? g->gr_name : "???")); + + size = sizeof(groups) / sizeof(gid_t); + n = getgroups(size - 1, groups); + if (n < 0) + perror("getgroups failed"); + else + { + int i; + fprintf (stderr, "eff. group list: ["); + for (i = 0; i < n; i++) + { + g = getgrgid (groups[i]); + fprintf(stderr, "%s%s=%ld", (i == 0 ? "" : ", "), + (g->gr_name ? g->gr_name : "???"), + (long) groups[i]); + } + fprintf (stderr, "]\n"); + } } int @@ -69,6 +94,8 @@ main (int argc, char **argv) { char *user = argv[i]; char *group = strchr(user, '/'); + if (!group) + group = strchr(user, '.'); if (group) *group++ = 0; @@ -107,6 +134,15 @@ main (int argc, char **argv) } } + fprintf(stderr, "setgroups(1, [%ld]) \"%s\"", gid, group); + { + gid_t g2 = gid; + if (setgroups(1, &g2) == 0) + fprintf(stderr, " succeeded.\n"); + else + perror(" failed"); + } + fprintf(stderr, "setgid(%ld) \"%s\"", gid, group); if (setgid(gid) == 0) fprintf(stderr, " succeeded.\n");