X-Git-Url: https://ruderich.org/simon/gitweb/?p=ptyas%2Fptyas.git;a=blobdiff_plain;f=ptyas.c;h=e8e1ba7de1eb9f7a296d14683b061ba306b7d771;hp=25f49aa2fc81ebb3d935ec87403857d8606a25a2;hb=2bd62914a0887c368ddba71f0fbcd0a01084b4b6;hpb=192cbf9dfffa832434bf81a5ff7ee43190a3ce22 diff --git a/ptyas.c b/ptyas.c index 25f49aa..e8e1ba7 100644 --- a/ptyas.c +++ b/ptyas.c @@ -117,12 +117,29 @@ static int snprintf_or_assert(char *str, size_t size, const char *format, ...) { static void drop_privileges_or_die(uid_t uid, gid_t gid) { /* Drop all supplementary group IDs. */ +#ifdef __FreeBSD__ + { + /* FreeBSD uses the first gid to set the egid of the process. */ + gid_t egid = gid; + if (setgroups(1, &egid) != 0) { + die("setgroups"); + } + if (getgroups(1, &egid) != 1) { + die_fmt("failed to drop all supplementary groups\n"); + } + if (egid != gid) { + die_fmt("failed to drop all supplementary groups (egid): %d %d\n", + egid, gid); + } + } +#else if (setgroups(0, NULL) != 0) { die("setgroups"); } if (getgroups(0, NULL) != 0) { - die_fmt("failed to drop all supplementary groups"); + die_fmt("failed to drop all supplementary groups\n"); } +#endif /* Dropping groups may require privileges, do that first. */ if (setresgid(gid, gid, gid) != 0) { @@ -145,12 +162,12 @@ static void drop_privileges_or_die(uid_t uid, gid_t gid) { } if ( uid != ruid || uid != euid || uid != suid || gid != rgid || gid != egid || gid != sgid) { - die_fmt("failed to drop privileges"); + die_fmt("failed to drop privileges\n"); } } /* Just to be safe. */ if (setuid(0) != -1) { - die_fmt("failed to drop privileges (setuid)"); + die_fmt("failed to drop privileges (setuid)\n"); } }