wok view xscreensaver/stuff/xscreensaver.setuid.diff @ rev 25629

Fix xscreensaver and up to 5.45 (thanks Pat)
author Stanislas Leduc <shann@slitaz.org>
date Tue Dec 19 20:23:40 2023 +0100 (7 months ago)
parents
children
line source
1 --- ./driver/setuid.c.orig 2006-02-08 20:28:38.000000000 -0600
2 +++ ./driver/setuid.c 2006-04-04 16:48:08.000000000 -0500
3 @@ -1,5 +1,5 @@
4 /* setuid.c --- management of runtime privileges.
5 - * xscreensaver, Copyright (c) 1993-1998, 2005 Jamie Zawinski <jwz@jwz.org>
6 + * xscreensaver, Copyright (c) 1993-1998 Jamie Zawinski <jwz@jwz.org>
7 *
8 * Permission to use, copy, modify, distribute, and sell this software and its
9 * documentation for any purpose is hereby granted without fee, provided that
10 @@ -41,7 +41,7 @@
11 struct group *g = 0;
12 p = getpwuid (uid);
13 g = getgrgid (gid);
14 - sprintf (buf, "%.100s/%.100s (%ld/%ld)",
15 + sprintf (buf, "%s/%s (%ld/%ld)",
16 (p && p->pw_name ? p->pw_name : "???"),
17 (g && g->gr_name ? g->gr_name : "???"),
18 (long) uid, (long) gid);
19 @@ -74,50 +74,11 @@
20 }
23 -/* Returns true if we need to call setgroups().
24 -
25 - Without calling setgroups(), the process will retain any supplementary
26 - gids associated with the uid, e.g.:
27 -
28 - % groups root
29 - root : root bin daemon sys adm disk wheel
30 -
31 - However, setgroups() can only be called by root, and returns EPERM
32 - for other users even if the call would be a no-op (e.g., setting the
33 - group list to the current list.) So, to avoid that spurious error,
34 - before calling setgroups() we first check whether the current list
35 - of groups contains only one element, our target group. If so, we
36 - don't need to call setgroups().
37 - */
38 -static int
39 -setgroups_needed_p (uid_t target_group)
40 -{
41 - gid_t groups[1024];
42 - int n, size;
43 - size = sizeof(groups) / sizeof(gid_t);
44 - n = getgroups (size - 1, groups);
45 - if (n < 0)
46 - {
47 - char buf [1024];
48 - sprintf (buf, "%s: getgroups(%ld, ...)", blurb(), (long int)(size - 1));
49 - perror (buf);
50 - return 1;
51 - }
52 - else if (n == 0) /* an empty list means only egid is in effect. */
53 - return 0;
54 - else if (n == 1 && groups[0] == target_group) /* one element, the target */
55 - return 0;
56 - else /* more than one, or the wrong one. */
57 - return 1;
58 -}
59 -
60 -
61 static int
62 set_ids_by_number (uid_t uid, gid_t gid, char **message_ret)
63 {
64 int uid_errno = 0;
65 int gid_errno = 0;
66 - int sgs_errno = 0;
67 struct passwd *p = getpwuid (uid);
68 struct group *g = getgrgid (gid);
70 @@ -136,11 +97,6 @@
71 if (uid == (uid_t) -1) uid = (uid_t) -2;
73 errno = 0;
74 - if (setgroups_needed_p (gid) &&
75 - setgroups (1, &gid) < 0)
76 - sgs_errno = errno ? errno : -1;
77 -
78 - errno = 0;
79 if (setgid (gid) != 0)
80 gid_errno = errno ? errno : -1;
82 @@ -148,10 +104,10 @@
83 if (setuid (uid) != 0)
84 uid_errno = errno ? errno : -1;
86 - if (uid_errno == 0 && gid_errno == 0 && sgs_errno == 0)
87 + if (uid_errno == 0 && gid_errno == 0)
88 {
89 static char buf [1024];
90 - sprintf (buf, "changed uid/gid to %.100s/%.100s (%ld/%ld).",
91 + sprintf (buf, "changed uid/gid to %s/%s (%ld/%ld).",
92 (p && p->pw_name ? p->pw_name : "???"),
93 (g && g->gr_name ? g->gr_name : "???"),
94 (long) uid, (long) gid);
95 @@ -162,71 +118,28 @@
96 else
97 {
98 char buf [1024];
99 - gid_t groups[1024];
100 - int n, size;
101 -
102 - if (sgs_errno)
103 - {
104 - sprintf (buf, "%s: couldn't setgroups to %.100s (%ld)",
105 - blurb(),
106 - (g && g->gr_name ? g->gr_name : "???"),
107 - (long) gid);
108 - if (sgs_errno == -1)
109 - fprintf(stderr, "%s: unknown error\n", buf);
110 - else
111 - {
112 - errno = sgs_errno;
113 - perror(buf);
114 - }
115 -
116 - fprintf (stderr, "%s: effective group list: ", blurb());
117 - size = sizeof(groups) / sizeof(gid_t);
118 - n = getgroups (size - 1, groups);
119 - if (n < 0)
120 - fprintf (stderr, "unknown!\n");
121 - else
122 - {
123 - int i;
124 - fprintf (stderr, "[");
125 - for (i = 0; i < n; i++)
126 - {
127 - g = getgrgid (groups[i]);
128 - if (i > 0) fprintf (stderr, ", ");
129 - if (g && g->gr_name) fprintf (stderr, "%s", g->gr_name);
130 - else fprintf (stderr, "%ld", (long) groups[i]);
131 - }
132 - fprintf (stderr, "]\n");
133 - }
134 - }
135 -
136 if (gid_errno)
137 {
138 - sprintf (buf, "%s: couldn't set gid to %.100s (%ld)",
139 + sprintf (buf, "%s: couldn't set gid to %s (%ld)",
140 blurb(),
141 (g && g->gr_name ? g->gr_name : "???"),
142 (long) gid);
143 if (gid_errno == -1)
144 fprintf(stderr, "%s: unknown error\n", buf);
145 else
146 - {
147 - errno = gid_errno;
148 - perror(buf);
149 - }
150 + perror(buf);
151 }
153 if (uid_errno)
154 {
155 - sprintf (buf, "%s: couldn't set uid to %.100s (%ld)",
156 + sprintf (buf, "%s: couldn't set uid to %s (%ld)",
157 blurb(),
158 (p && p->pw_name ? p->pw_name : "???"),
159 (long) uid);
160 if (uid_errno == -1)
161 fprintf(stderr, "%s: unknown error\n", buf);
162 else
163 - {
164 - errno = uid_errno;
165 - perror(buf);
166 - }
167 + perror(buf);
168 }
170 return -1;
171 @@ -350,7 +263,7 @@
172 !strcmp (p->pw_name, "games"))
173 {
174 static char buf [1024];
175 - sprintf (buf, "running as %.100s",
176 + sprintf (buf, "running as %s",
177 (p && p->pw_name && *p->pw_name
178 ? p->pw_name : "<unknown>"));
179 si->nolock_reason = buf;