]> code.delx.au - pulseaudio/blobdiff - src/daemon/caps.c
Merge remote branch 'phish3/master'
[pulseaudio] / src / daemon / caps.c
index 44ee355e76292403290f6323df57fbaa58d1cf3b..76b62e03e80f217fefc12bf4d934430868167a96 100644 (file)
@@ -1,5 +1,3 @@
-/* $Id$ */
-
 /***
   This file is part of PulseAudio.
 
 /***
   This file is part of PulseAudio.
 
@@ -8,7 +6,7 @@
 
   PulseAudio is free software; you can redistribute it and/or modify
   it under the terms of the GNU Lesser General Public License as published
 
   PulseAudio is free software; you can redistribute it and/or modify
   it under the terms of the GNU Lesser General Public License as published
-  by the Free Software Foundation; either version 2 of the License,
+  by the Free Software Foundation; either version 2.1 of the License,
   or (at your option) any later version.
 
   PulseAudio is distributed in the hope that it will be useful, but
   or (at your option) any later version.
 
   PulseAudio is distributed in the hope that it will be useful, but
 #include <errno.h>
 #include <string.h>
 #include <sys/types.h>
 #include <errno.h>
 #include <string.h>
 #include <sys/types.h>
+
+#include <pulse/i18n.h>
+
 #include <pulsecore/macro.h>
 #include <pulsecore/macro.h>
+#include <pulsecore/core-error.h>
+#include <pulsecore/log.h>
+#include <pulsecore/core-util.h>
 
 #ifdef HAVE_SYS_CAPABILITY_H
 #include <sys/capability.h>
 #endif
 
 #ifdef HAVE_SYS_CAPABILITY_H
 #include <sys/capability.h>
 #endif
+
 #ifdef HAVE_SYS_PRCTL_H
 #include <sys/prctl.h>
 #endif
 
 #ifdef HAVE_SYS_PRCTL_H
 #include <sys/prctl.h>
 #endif
 
-#include <pulsecore/core-error.h>
-
-#include <pulsecore/log.h>
-
 #include "caps.h"
 
 /* Glibc <= 2.2 has broken unistd.h */
 #include "caps.h"
 
 /* Glibc <= 2.2 has broken unistd.h */
@@ -51,102 +52,47 @@ int setresgid(gid_t r, gid_t e, gid_t s);
 int setresuid(uid_t r, uid_t e, uid_t s);
 #endif
 
 int setresuid(uid_t r, uid_t e, uid_t s);
 #endif
 
-#ifdef HAVE_GETUID
-
 /* Drop root rights when called SUID root */
 void pa_drop_root(void) {
 /* Drop root rights when called SUID root */
 void pa_drop_root(void) {
-    uid_t uid = getuid();
 
 
-    if (uid == 0 || geteuid() != 0)
-        return;
+#ifdef HAVE_GETUID
+    uid_t uid;
+    gid_t gid;
 
 
-    pa_log_info("Dropping root priviliges.");
+    pa_log_debug(_("Cleaning up privileges."));
+    uid = getuid();
+    gid = getgid();
 
 #if defined(HAVE_SETRESUID)
     pa_assert_se(setresuid(uid, uid, uid) >= 0);
 
 #if defined(HAVE_SETRESUID)
     pa_assert_se(setresuid(uid, uid, uid) >= 0);
+    pa_assert_se(setresgid(gid, gid, gid) >= 0);
 #elif defined(HAVE_SETREUID)
     pa_assert_se(setreuid(uid, uid) >= 0);
 #elif defined(HAVE_SETREUID)
     pa_assert_se(setreuid(uid, uid) >= 0);
+    pa_assert_se(setregid(gid, gid) >= 0);
 #else
     pa_assert_se(setuid(uid) >= 0);
     pa_assert_se(seteuid(uid) >= 0);
 #else
     pa_assert_se(setuid(uid) >= 0);
     pa_assert_se(seteuid(uid) >= 0);
+    pa_assert_se(setgid(gid) >= 0);
+    pa_assert_se(setegid(gid) >= 0);
 #endif
 
     pa_assert_se(getuid() == uid);
     pa_assert_se(geteuid() == uid);
 #endif
 
     pa_assert_se(getuid() == uid);
     pa_assert_se(geteuid() == uid);
-}
-
-#else
-
-void pa_drop_root(void) {
-}
-
+    pa_assert_se(getgid() == gid);
+    pa_assert_se(getegid() == gid);
 #endif
 
 #endif
 
-#if defined(HAVE_SYS_CAPABILITY_H) && defined(HAVE_SYS_PRCTL_H)
-
-/* Limit permitted capabilities set to CAPSYS_NICE */
-int pa_limit_caps(void) {
-    int r = -1;
-    cap_t caps;
-    cap_value_t nice_cap = CAP_SYS_NICE;
-
-    caps = cap_init();
-    pa_assert(caps);
-    cap_clear(caps);
-    cap_set_flag(caps, CAP_EFFECTIVE, 1, &nice_cap, CAP_SET);
-    cap_set_flag(caps, CAP_PERMITTED, 1, &nice_cap, CAP_SET);
-
-    if (cap_set_proc(caps) < 0)
-        goto fail;
-
-    if (prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0) < 0)
-        goto fail;
-
-    pa_log_info("Dropped capabilities successfully.");
-
-    r = 1;
-
-fail:
-    cap_free(caps);
-
-    return r;
-}
-
-/* Drop all capabilities, effectively becoming a normal user */
-int pa_drop_caps(void) {
-    cap_t caps;
-    int r = -1;
-
-    caps = cap_init();
-    pa_assert(caps);
-
-    cap_clear(caps);
-
-    prctl(PR_SET_KEEPCAPS, 0, 0, 0, 0);
+#ifdef HAVE_SYS_PRCTL_H
+    pa_assert_se(prctl(PR_SET_KEEPCAPS, 0, 0, 0, 0) == 0);
+#endif
 
 
-    if (cap_set_proc(caps) < 0) {
-        pa_log("Failed to drop capabilities: %s", pa_cstrerror(errno));
-        goto fail;
+#ifdef HAVE_SYS_CAPABILITY_H
+    if (uid != 0) {
+        cap_t caps;
+        pa_assert_se(caps = cap_init());
+        pa_assert_se(cap_clear(caps) == 0);
+        pa_assert_se(cap_set_proc(caps) == 0);
+        pa_assert_se(cap_free(caps) == 0);
     }
     }
-
-    r = 0;
-
-fail:
-    cap_free(caps);
-
-    return r;
-}
-
-#else
-
-/* NOOPs in case capabilities are not available. */
-int pa_limit_caps(void) {
-    return 0;
-}
-
-int pa_drop_caps(void) {
-    pa_drop_root();
-    return 0;
-}
-
 #endif
 #endif
+}