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.