summaryrefslogtreecommitdiffstats
path: root/lib/privs.c
diff options
context:
space:
mode:
authorpaulo <paul@bayleaf.org.uk>2009-12-01 09:30:45 +0000
committerpaulo <paul@bayleaf.org.uk>2009-12-01 09:30:45 +0000
commita763262ad09c2c9d45f22f9bad9b77eab7c5ba96 (patch)
treef746c875ce164894fab4ddb122bb676894e65f44 /lib/privs.c
parent4924597ce30ea81e264a4602e03347a2942a4254 (diff)
downloadquagga-a763262ad09c2c9d45f22f9bad9b77eab7c5ba96.tar.bz2
quagga-a763262ad09c2c9d45f22f9bad9b77eab7c5ba96.tar.xz
Fix raise_count in zprivs_change_caps HAVE_LCAPS case
Diffstat (limited to 'lib/privs.c')
-rw-r--r--lib/privs.c27
1 files changed, 18 insertions, 9 deletions
diff --git a/lib/privs.c b/lib/privs.c
index fbf6b651..faf201e3 100644
--- a/lib/privs.c
+++ b/lib/privs.c
@@ -199,14 +199,8 @@ int
zprivs_change_caps (zebra_privs_ops_t op)
{
cap_flag_value_t cflag;
- int result = -1;
-
- if (op == ZPRIVS_RAISE)
- cflag = CAP_SET;
- else if (op == ZPRIVS_LOWER)
- cflag = CAP_CLEAR;
- else
- return result;
+ int result = 0;
+ int change = 0;
LOCK
@@ -218,7 +212,22 @@ zprivs_change_caps (zebra_privs_ops_t op)
exit (1);
}
- if ( !cap_set_flag (zprivs_state.caps, CAP_EFFECTIVE,
+ if (op == ZPRIVS_RAISE)
+ {
+ cflag = CAP_SET;
+ change = (raise_count++ == 0);
+ }
+ else if (op == ZPRIVS_LOWER)
+ {
+ cflag = CAP_CLEAR;
+ change = (--raise_count == 0);
+ }
+ else
+ {
+ result = -1;
+ }
+
+ if ( change && !cap_set_flag (zprivs_state.caps, CAP_EFFECTIVE,
zprivs_state.syscaps_p->num,
zprivs_state.syscaps_p->caps,
cflag))