|
Lines 16-21
Link Here
|
| 16 |
|
16 |
|
| 17 |
#include "log.h" |
17 |
#include "log.h" |
| 18 |
#include "uidswap.h" |
18 |
#include "uidswap.h" |
|
|
19 |
#include "xmalloc.h" |
| 19 |
|
20 |
|
| 20 |
/* |
21 |
/* |
| 21 |
* Note: all these functions must work in all of the following cases: |
22 |
* Note: all these functions must work in all of the following cases: |
|
Lines 38-44
Link Here
|
| 38 |
/* Saved effective uid. */ |
39 |
/* Saved effective uid. */ |
| 39 |
static int privileged = 0; |
40 |
static int privileged = 0; |
| 40 |
static int temporarily_use_uid_effective = 0; |
41 |
static int temporarily_use_uid_effective = 0; |
| 41 |
static gid_t saved_egroups[NGROUPS_MAX], user_groups[NGROUPS_MAX]; |
42 |
static gid_t *saved_egroups, *user_groups; |
| 42 |
static int saved_egroupslen = -1, user_groupslen = -1; |
43 |
static int saved_egroupslen = -1, user_groupslen = -1; |
| 43 |
|
44 |
|
| 44 |
/* |
45 |
/* |
|
Lines 68-84
Link Here
|
| 68 |
|
69 |
|
| 69 |
privileged = 1; |
70 |
privileged = 1; |
| 70 |
temporarily_use_uid_effective = 1; |
71 |
temporarily_use_uid_effective = 1; |
| 71 |
saved_egroupslen = getgroups(NGROUPS_MAX, saved_egroups); |
72 |
|
|
|
73 |
saved_egroupslen = getgroups(0, NULL); |
| 72 |
if (saved_egroupslen < 0) |
74 |
if (saved_egroupslen < 0) |
| 73 |
fatal("getgroups: %.100s", strerror(errno)); |
75 |
fatal("getgroups: %.100s", strerror(errno)); |
|
|
76 |
saved_egroups = xrealloc(saved_egroups, |
| 77 |
saved_egroupslen * sizeof(*saved_egroups)); |
| 78 |
if (getgroups(saved_egroupslen, saved_egroups) < 0) |
| 79 |
fatal("getgroups: %.100s", strerror(errno)); |
| 74 |
|
80 |
|
| 75 |
/* set and save the user's groups */ |
81 |
/* set and save the user's groups */ |
| 76 |
if (user_groupslen == -1) { |
82 |
if (user_groupslen == -1) { |
| 77 |
if (initgroups(pw->pw_name, pw->pw_gid) < 0) |
83 |
if (initgroups(pw->pw_name, pw->pw_gid) < 0) |
| 78 |
fatal("initgroups: %s: %.100s", pw->pw_name, |
84 |
fatal("initgroups: %s: %.100s", pw->pw_name, |
| 79 |
strerror(errno)); |
85 |
strerror(errno)); |
| 80 |
user_groupslen = getgroups(NGROUPS_MAX, user_groups); |
86 |
|
|
|
87 |
user_groupslen = getgroups(0, NULL); |
| 81 |
if (user_groupslen < 0) |
88 |
if (user_groupslen < 0) |
|
|
89 |
fatal("getgroups: %.100s", strerror(errno)); |
| 90 |
user_groups = xrealloc(user_groups, |
| 91 |
user_groupslen * sizeof(*user_groups)); |
| 92 |
if (getgroups(user_groupslen, user_groups) < 0) |
| 82 |
fatal("getgroups: %.100s", strerror(errno)); |
93 |
fatal("getgroups: %.100s", strerror(errno)); |
| 83 |
} |
94 |
} |
| 84 |
/* Set the effective uid to the given (unprivileged) uid. */ |
95 |
/* Set the effective uid to the given (unprivileged) uid. */ |