]> code.delx.au - pulseaudio/blobdiff - src/daemon/caps.c
instead of checking for directly use new function pa_in_valgrind()
[pulseaudio] / src / daemon / caps.c
index ae07119cdf45c060809c0a0dcb12665f4c98af92..25a09fdf598a4a78a4301fbafc4588f50faf0bfb 100644 (file)
 #include <errno.h>
 #include <string.h>
 #include <sys/types.h>
+
+#include <pulse/i18n.h>
+
 #include <pulsecore/macro.h>
+#include <pulsecore/core-error.h>
+#include <pulsecore/log.h>
 
 #ifdef HAVE_SYS_CAPABILITY_H
 #include <sys/capability.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 */
@@ -58,7 +59,7 @@ void pa_drop_root(void) {
     if (uid == 0 || geteuid() != 0)
         return;
 
-    pa_log_info("Dropping root priviliges.");
+    pa_log_info(_("Dropping root priviliges."));
 
 #if defined(HAVE_SETRESUID)
     pa_assert_se(setresuid(uid, uid, uid) >= 0);
@@ -98,7 +99,7 @@ void pa_limit_caps(void) {
          * that */
         pa_drop_caps();
     else
-        pa_log_info("Limited capabilities successfully to CAP_SYS_NICE.");
+        pa_log_info(_("Limited capabilities successfully to CAP_SYS_NICE."));
 
     pa_assert_se(cap_free(caps) == 0);
 
@@ -109,6 +110,14 @@ void pa_limit_caps(void) {
 void pa_drop_caps(void) {
     cap_t caps;
 
+#ifndef __OPTIMIZE__
+    /* Valgrind doesn't not know set_caps, so we bypass it here -- but
+     * only in development builds.*/
+
+    if (pa_in_valgrind() && !pa_have_caps())
+        return;
+#endif
+
     pa_assert_se(prctl(PR_SET_KEEPCAPS, 0, 0, 0, 0) == 0);
 
     pa_assert_se(caps = cap_init());
@@ -123,7 +132,12 @@ pa_bool_t pa_have_caps(void) {
     cap_t caps;
     cap_flag_value_t flag = CAP_CLEAR;
 
+#ifdef __OPTIMIZE__
     pa_assert_se(caps = cap_get_proc());
+#else
+    if (!(caps = cap_get_proc()))
+        return FALSE;
+#endif
     pa_assert_se(cap_get_flag(caps, CAP_SYS_NICE, CAP_EFFECTIVE, &flag) >= 0);
     pa_assert_se(cap_free(caps) == 0);