Author: mturk
Date: Fri Feb 12 12:21:15 2010
New Revision: 909380
URL: http://svn.apache.org/viewvc?rev=909380&view=rev
Log:
Fix DAEMON-93 by calling set_caps only if running as root
Modified:
commons/proper/daemon/trunk/src/native/unix/native/jsvc-unix.c
Modified: commons/proper/daemon/trunk/src/native/unix/native/jsvc-unix.c
URL:
http://svn.apache.org/viewvc/commons/proper/daemon/trunk/src/native/unix/native/jsvc-unix.c?rev=909380&r1=909379&r2=909380&view=diff
==============================================================================
--- commons/proper/daemon/trunk/src/native/unix/native/jsvc-unix.c (original)
+++ commons/proper/daemon/trunk/src/native/unix/native/jsvc-unix.c Fri Feb 12
12:21:15 2010
@@ -133,10 +133,10 @@
} else
log_debug("Cannot set supplement group list for user
'%s'",user);
}
- if (getuid() == uid) {
+ if (getuid() == uid) {
log_debug("No need to change user to '%s'!",user);
- return(0);
- }
+ return(0);
+ }
if (setuid(uid)!=0) {
log_error("Cannot set user id for user '%s'",user);
return(-1);
@@ -185,19 +185,22 @@
}
static int linuxset_user_group(char *user, int uid, int gid)
{
+ int caps_set = 0;
/* set capabilities enough for binding port 80 setuid/getuid */
- if (set_caps(CAPS)!=0) {
- if (getuid()!= uid) {
- log_error("set_caps(CAPS) failed");
+ if (getuid() == 0) {
+ if (set_caps(CAPS)!=0) {
+ if (getuid()!= uid) {
+ log_error("set_caps(CAPS) failed");
+ return(-1);
+ }
+ log_debug("set_caps(CAPS) failed");
+ }
+ /* make sure they are kept after setuid */
+ if (prctl(PR_SET_KEEPCAPS,1,0,0,0) < 0) {
+ log_error("prctl failed in linuxset_user_group");
return(-1);
}
- log_debug("set_caps(CAPS) failed");
- }
-
- /* make sure they are kept after setuid */
- if (prctl(PR_SET_KEEPCAPS,1,0,0,0) < 0) {
- log_error("prctl failed in linuxset_user_group");
- return(-1);
+ caps_set = 1;
}
/* set setuid/getuid */
@@ -206,13 +209,15 @@
return(-1);
}
- /* set capability to binding port 80 read conf */
- if (set_caps(CAPSMIN)!=0) {
- if (getuid()!= uid) {
- log_error("set_caps(CAPSMIN) failed");
- return(-1);
+ if (caps_set) {
+ /* set capability to binding port 80 read conf */
+ if (set_caps(CAPSMIN)!=0) {
+ if (getuid()!= uid) {
+ log_error("set_caps(CAPSMIN) failed");
+ return(-1);
+ }
+ log_debug("set_caps(CAPSMIN) failed");
}
- log_debug("set_caps(CAPSMIN) failed");
}
return(0);