diff options
author | paulo <paul@bayleaf.org.uk> | 2009-12-01 09:30:45 +0000 |
---|---|---|
committer | paulo <paul@bayleaf.org.uk> | 2009-12-01 09:30:45 +0000 |
commit | a763262ad09c2c9d45f22f9bad9b77eab7c5ba96 (patch) | |
tree | f746c875ce164894fab4ddb122bb676894e65f44 /lib/privs.c | |
parent | 4924597ce30ea81e264a4602e03347a2942a4254 (diff) | |
download | quagga-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.c | 27 |
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)) |