aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexandra Ellwood <lxs@mit.edu>2007-10-10 21:22:14 +0000
committerAlexandra Ellwood <lxs@mit.edu>2007-10-10 21:22:14 +0000
commitc0b3626ce1cbcc482f3379d64923552b1eed89e1 (patch)
tree7ae00bc86ea5e631ada8db1120702cadcd5a6a56
parenta2367c956c6c9d56c309930f5a70c8017f67727c (diff)
downloadkrb5-c0b3626ce1cbcc482f3379d64923552b1eed89e1.zip
krb5-c0b3626ce1cbcc482f3379d64923552b1eed89e1.tar.gz
krb5-c0b3626ce1cbcc482f3379d64923552b1eed89e1.tar.bz2
ccs_lock_status_grant_lock granting wrong lock
ccs_lock_status_grant_lock sometimes tries to grant the wrong lock because it is not keeping track of where it got moved to. Reorganized code so it is easier to read and doesn't look up the lock twice. ticket: new git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@20116 dc483132-0cff-0310-8789-dd5450dbe970
-rw-r--r--src/ccapi/server/ccs_lock_state.c35
1 files changed, 17 insertions, 18 deletions
diff --git a/src/ccapi/server/ccs_lock_state.c b/src/ccapi/server/ccs_lock_state.c
index 78c7c6e..3893fc9 100644
--- a/src/ccapi/server/ccs_lock_state.c
+++ b/src/ccapi/server/ccs_lock_state.c
@@ -154,30 +154,30 @@ static cc_int32 ccs_lock_status_grant_lock (ccs_lock_state_t io_lock_state,
cc_uint64 in_pending_lock_index)
{
cc_int32 err = ccNoError;
-
+ ccs_lock_t pending_lock = NULL;
+ cc_uint32 type = 0;
+
if (!io_lock_state) { err = cci_check_error (ccErrBadParam); }
if (!err) {
- if (in_pending_lock_index < io_lock_state->first_pending_lock_index ||
- in_pending_lock_index >= ccs_lock_array_count (io_lock_state->locks)) {
+ pending_lock = ccs_lock_array_object_at_index (io_lock_state->locks,
+ in_pending_lock_index);
+ if (!pending_lock || in_pending_lock_index < io_lock_state->first_pending_lock_index) {
err = cci_check_error (ccErrBadParam);
}
}
if (!err) {
- ccs_lock_t pending_lock = ccs_lock_array_object_at_index (io_lock_state->locks,
- in_pending_lock_index);
- cc_uint32 type = 0;
- ccs_pipe_t pending_client_pipe = CCS_PIPE_NULL;
-
err = ccs_lock_type (pending_lock, &type);
+ }
+
+ if (!err && (type == cc_lock_upgrade || type == cc_lock_downgrade)) {
+ /* lock upgrades or downgrades. Find the old lock and remove it. */
+ ccs_pipe_t pending_client_pipe = CCS_PIPE_NULL;
- if (!err) {
- err = ccs_lock_client_pipe (pending_lock, &pending_client_pipe);
- }
+ err = ccs_lock_client_pipe (pending_lock, &pending_client_pipe);
- if (!err && (type == cc_lock_upgrade || type == cc_lock_downgrade)) {
- /* lock upgrades or downgrades. Find the old lock and remove it. */
+ if (!err) {
cc_uint64 i;
for (i = 0; !err && i < io_lock_state->first_pending_lock_index; i++) {
@@ -197,9 +197,9 @@ static cc_int32 ccs_lock_status_grant_lock (ccs_lock_state_t io_lock_state,
}
}
- if (!err) {
+ if (!err) {
cc_uint64 new_lock_index = 0;
-
+
err = ccs_lock_array_move (io_lock_state->locks,
in_pending_lock_index,
io_lock_state->first_pending_lock_index,
@@ -208,8 +208,7 @@ static cc_int32 ccs_lock_status_grant_lock (ccs_lock_state_t io_lock_state,
}
if (!err) {
- ccs_lock_t lock = ccs_lock_array_object_at_index (io_lock_state->locks, 0);
- err = ccs_lock_grant_lock (lock);
+ err = ccs_lock_grant_lock (pending_lock);
}
return cci_check_error (err);
@@ -411,7 +410,7 @@ cc_int32 ccs_lock_state_add (ccs_lock_state_t io_lock_state,
}
if (!err) {
- if (!can_grant_lock_now && !in_block) {
+ if (!can_grant_lock_now && (in_block == cc_lock_noblock)) {
err = cci_check_error (io_lock_state->pending_lock_err);
} else {