Add support for FreeBSD
authorSimon Ruderich <simon@ruderich.org>
Tue, 5 Oct 2021 08:50:40 +0000 (10:50 +0200)
committerSimon Ruderich <simon@ruderich.org>
Tue, 5 Oct 2021 08:50:40 +0000 (10:50 +0200)
Tested on FreeBSD 13.0-RELEASE-p4 but should work on all relevant
versions.

ptyas.c

diff --git a/ptyas.c b/ptyas.c
index dc5f3de85e5ba2646652d2440c1504f8c5a956a4..e8e1ba7de1eb9f7a296d14683b061ba306b7d771 100644 (file)
--- 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\n");
     }
+#endif
 
     /* Dropping groups may require privileges, do that first. */
     if (setresgid(gid, gid, gid) != 0) {