diff -Naur a/init.c b/init.c
--- a/init.c    2010-11-05 04:29:02.000000000 +0900
+++ b/init.c    2011-04-12 05:11:43.540370471 +0900
@@ -41,6 +41,10 @@

 #include "occ-inline.h"

+#ifdef TARGET_LINUX
+#include <sys/prctl.h>
+#endif
+
 static struct context *static_context; /* GLOBAL */

 /*
@@ -904,6 +908,10 @@
       if (no_delay)
        {
          set_group (&c0->group_state);
+#ifdef TARGET_LINUX
+         if(prctl(PR_SET_KEEPCAPS, 1) < 0)
+           msg (M_ERR, "prctl(PR_SET_KEEPCAPS, 1) failed");
+#endif
          set_user (&c0->user_state);
          c0->uid_gid_set = true;
        }

The patch is above.
I had been investigating why OpenVPN refused to use CAP_IPC_LOCK capability.
I found out that it was because OpenVPN invoked setuid and setuid
erased POSIX capabilities.
prctl(PR_SET_KEEPCAPS, 1) lets OpenVPN keep capabilities after setuid
invocation.

Thanks in advance for considering this patch.

Reply via email to