Skip to content

Commit 57847b8

Browse files
committed
utils/sys: update set_user_and_group() - use setgroups() only to reset supplementary groups. Also on GID = 0 use only groups from /etc/group assosiated with UID.
1 parent 3edbec4 commit 57847b8

2 files changed

Lines changed: 22 additions & 18 deletions

File tree

include/utils/sys.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ void signal_install(sig_t func);
4242
void make_daemon(void);
4343
int std_syslog_redirector(const int prio_skip_mask);
4444
int write_pid(const char *file_name);
45-
int set_user_and_group(uid_t pw_uid, gid_t pw_gid);
45+
int set_user_and_group(const uid_t pw_uid, const gid_t pw_gid);
4646
int user_home_dir_get(char *buf, size_t buf_size, size_t *buf_size_ret);
4747

4848
int read_file(const char *file_name, size_t file_name_size,

src/utils/sys.c

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -278,48 +278,52 @@ write_pid(const char *file_name) {
278278
}
279279

280280
int
281-
set_user_and_group(uid_t pw_uid, gid_t pw_gid) {
281+
set_user_and_group(const uid_t pw_uid, const gid_t pw_gid) {
282282
int error;
283283
struct passwd *pwd, pwd_buf;
284-
char buffer[4096], err_descr[256];
284+
char buf[4096], err_descr[256];
285285

286-
if (0 == pw_uid || 0 == pw_gid)
286+
if (0 == pw_uid)
287287
return (EINVAL);
288288

289-
error = getpwuid_r(pw_uid, &pwd_buf, buffer, sizeof(buffer), &pwd);
289+
error = getpwuid_r(pw_uid, &pwd_buf, buf, sizeof(buf), &pwd);
290290
if (0 != error) {
291291
strerror_r(error, err_descr, sizeof(err_descr));
292-
fprintf(stderr, "set_user_and_group: getpwuid_r() error %i: %s\n",
293-
error, err_descr);
292+
fprintf(stderr, "%s: getpwuid_r() error %i: %s\n",
293+
__FUNCTION__, error, err_descr);
294294
return (error);
295295
}
296296

297-
if (0 != setgid(pw_gid)) {
297+
/* Drop all supplementary groups immediately. */
298+
if (0 != setgroups(0, NULL)) {
298299
error = errno;
299300
strerror_r(error, err_descr, sizeof(err_descr));
300-
fprintf(stderr, "set_user_and_group: setgid() error %i: %s\n",
301-
error, err_descr);
301+
fprintf(stderr, "%s: setgroups(0, NULL) error %i: %s\n",
302+
__FUNCTION__, error, err_descr);
302303
return (error);
303304
}
304-
if (0 != initgroups(pwd->pw_name, pw_gid)) {
305+
/* Set the Primary Group ID. */
306+
if (0 != setgid(((0 != pw_gid) ? pw_gid : pwd->pw_gid))) {
305307
error = errno;
306308
strerror_r(error, err_descr, sizeof(err_descr));
307-
fprintf(stderr, "set_user_and_group: initgroups() error %i: %s\n",
308-
error, err_descr);
309+
fprintf(stderr, "%s: setgid() error %i: %s\n",
310+
__FUNCTION__, error, err_descr);
309311
return (error);
310312
}
311-
if (0 != setgroups(1, &pwd->pw_gid)) {
313+
/* Initialize Supplementary Groups defined in /etc/group. */
314+
if (0 != initgroups(pwd->pw_name, pwd->pw_gid)) {
312315
error = errno;
313316
strerror_r(error, err_descr, sizeof(err_descr));
314-
fprintf(stderr, "set_user_and_group: setgroups() error %i: %s\n",
315-
error, err_descr);
317+
fprintf(stderr, "%s: initgroups() error %i: %s\n",
318+
__FUNCTION__, error, err_descr);
316319
return (error);
317320
}
321+
/* Drop User ID. */
318322
if (0 != setuid(pw_uid)) {
319323
error = errno;
320324
strerror_r(error, err_descr, sizeof(err_descr));
321-
fprintf(stderr, "set_user_and_group: setuid() error %i: %s\n",
322-
error, err_descr);
325+
fprintf(stderr, "%s: setuid() error %i: %s\n",
326+
__FUNCTION__, error, err_descr);
323327
return (error);
324328
}
325329

0 commit comments

Comments
 (0)