]> git.saurik.com Git - apt.git/commitdiff
Use setresuid() and setresgid() where available
authorJulian Andres Klode <jak@debian.org>
Wed, 24 Sep 2014 20:18:16 +0000 (22:18 +0200)
committerJulian Andres Klode <jak@debian.org>
Thu, 13 Aug 2015 13:19:30 +0000 (15:19 +0200)
apt-pkg/contrib/fileutl.cc
buildlib/config.h.in
configure.ac

index a6af27b0092f8a19a3d5c9f1f4206faf84b315ef..1be782bac8c4629dd7fc81e1f276189db107d701 100644 (file)
@@ -2252,22 +2252,32 @@ bool DropPrivileges()                                                   /*{{{*/
       return _error->Error("No user %s, can not drop rights", toUser.c_str());
 
    // Do not change the order here, it might break things
       return _error->Error("No user %s, can not drop rights", toUser.c_str());
 
    // Do not change the order here, it might break things
+   // Get rid of all our supplementary groups first
    if (setgroups(1, &pw->pw_gid))
       return _error->Errno("setgroups", "Failed to setgroups");
 
    if (setgroups(1, &pw->pw_gid))
       return _error->Errno("setgroups", "Failed to setgroups");
 
+   // Now change the group ids to the new user
+#ifdef HAVE_SETRESGID
+   if (setresgid(pw->pw_gid, pw->pw_gid, pw->pw_gid) != 0)
+      return _error->Errno("setresgid", "Failed to set new group ids");
+#else
    if (setegid(pw->pw_gid) != 0)
       return _error->Errno("setegid", "Failed to setegid");
 
    if (setgid(pw->pw_gid) != 0)
       return _error->Errno("setgid", "Failed to setgid");
    if (setegid(pw->pw_gid) != 0)
       return _error->Errno("setegid", "Failed to setegid");
 
    if (setgid(pw->pw_gid) != 0)
       return _error->Errno("setgid", "Failed to setgid");
+#endif
 
 
+   // Change the user ids to the new user
+#ifdef HAVE_SETRESUID
+   if (setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid) != 0)
+      return _error->Errno("setresuid", "Failed to set new user ids");
+#else
    if (setuid(pw->pw_uid) != 0)
       return _error->Errno("setuid", "Failed to setuid");
    if (setuid(pw->pw_uid) != 0)
       return _error->Errno("setuid", "Failed to setuid");
-
-   // the seteuid() is probably uneeded (at least thats what the linux
-   // man-page says about setuid(2)) but we cargo culted it anyway
    if (seteuid(pw->pw_uid) != 0)
       return _error->Errno("seteuid", "Failed to seteuid");
    if (seteuid(pw->pw_uid) != 0)
       return _error->Errno("seteuid", "Failed to seteuid");
+#endif
 
    // Verify that the user has only a single group, and the correct one
    gid_t groups[1];
 
    // Verify that the user has only a single group, and the correct one
    gid_t groups[1];
index 66ab33c2ba8704327ee83a1cf949a560c93128ca..c6b1ee6698ce81477c1b222ed18bb343649a0296 100644 (file)
 /* If there is no socklen_t, define this for the netdb shim */
 #undef NEED_SOCKLEN_T_DEFINE
 
 /* If there is no socklen_t, define this for the netdb shim */
 #undef NEED_SOCKLEN_T_DEFINE
 
-/* We need the getresuid() function */
+/* Check for getresuid() function and similar ones */
 #undef HAVE_GETRESUID
 #undef HAVE_GETRESGID
 #undef HAVE_GETRESUID
 #undef HAVE_GETRESGID
+#undef HAVE_SETRESUID
+#undef HAVE_SETRESGID
 
 /* Define to the size of the filesize containing structures */
 #undef _FILE_OFFSET_BITS
 
 /* Define to the size of the filesize containing structures */
 #undef _FILE_OFFSET_BITS
index 2221833a183ac32791ba7a2dc1e372064f6bb9b1..feba7be61a34d3ae3f41958dd3d4a1abc43865ef 100644 (file)
@@ -174,9 +174,11 @@ AC_EGREP_HEADER(h_errno, netdb.h, [AC_MSG_RESULT(normal)],
 
 
 dnl check for setuid checking function
 
 
 dnl check for setuid checking function
-AC_CHECK_FUNCS(getresuid getresgid)
+AC_CHECK_FUNCS(getresuid getresgid setresuid setresgid)
 AC_SUBST(HAVE_GETRESUID)
 AC_SUBST(HAVE_GETRESGID)
 AC_SUBST(HAVE_GETRESUID)
 AC_SUBST(HAVE_GETRESGID)
+AC_SUBST(HAVE_SETRESUID)
+AC_SUBST(HAVE_SETRESGID)
 
 dnl Check for doxygen
 AC_PATH_PROG(DOXYGEN, doxygen)
 
 dnl Check for doxygen
 AC_PATH_PROG(DOXYGEN, doxygen)