summaryrefslogtreecommitdiffstats
path: root/src/util/become_user.c
diff options
context:
space:
mode:
authorJakub Hrozek <jhrozek@redhat.com>2014-07-27 16:16:22 +0200
committerJakub Hrozek <jhrozek@redhat.com>2014-10-07 19:51:12 +0200
commiteadfbd97c9fbf9beb7c6b358e44e0e1e4a5628ae (patch)
tree365ba40b3e5b6fc3bcc8cb8c47a968a3318009cf /src/util/become_user.c
parent4a2259de5f7366e911a42bebfe8e8582cadf2de9 (diff)
downloadsssd-eadfbd97c9fbf9beb7c6b358e44e0e1e4a5628ae.tar.gz
sssd-eadfbd97c9fbf9beb7c6b358e44e0e1e4a5628ae.tar.xz
sssd-eadfbd97c9fbf9beb7c6b358e44e0e1e4a5628ae.zip
UTIL: Prefer libcap-ng for privilege drop operations
Diffstat (limited to 'src/util/become_user.c')
-rw-r--r--src/util/become_user.c32
1 files changed, 30 insertions, 2 deletions
diff --git a/src/util/become_user.c b/src/util/become_user.c
index b5f94f993..c8a0c77ee 100644
--- a/src/util/become_user.c
+++ b/src/util/become_user.c
@@ -25,7 +25,11 @@
#include "util/util.h"
#include <grp.h>
-errno_t become_user(uid_t uid, gid_t gid)
+#ifdef HAVE_LIBCAPNG
+#include <cap-ng.h>
+#endif
+
+static errno_t become_user_int(uid_t uid, gid_t gid)
{
uid_t cuid;
int ret;
@@ -40,7 +44,7 @@ errno_t become_user(uid_t uid, gid_t gid)
return EOK;
}
- /* drop supplmentary groups first */
+ /* drop supplementary groups first */
ret = setgroups(0, NULL);
if (ret == -1) {
ret = errno;
@@ -71,6 +75,30 @@ errno_t become_user(uid_t uid, gid_t gid)
return EOK;
}
+#ifdef HAVE_LIBCAPNG
+static errno_t become_user_libcap(uid_t uid, gid_t gid)
+{
+ int ret;
+
+ capng_clear(0);
+ ret = capng_change_id(uid, gid, CAPNG_DROP_SUPP_GRP);
+ if (ret != 0) {
+ DEBUG(SSSDBG_FATAL_FAILURE, "Cannot change UID: %d errno: %d\n", ret, errno);
+ }
+
+ return ret;
+}
+#endif
+
+errno_t become_user(uid_t uid, gid_t gid)
+{
+#ifdef HAVE_LIBCAPNG
+ return become_user_libcap(uid, gid);
+#endif
+
+ return become_user_int(uid, gid);
+}
+
struct sss_creds {
uid_t uid;
gid_t gid;