fixes for the following report from "Jeremy Stribling" <jstribl@us.ibm.com>
- In the GetPrincipalLockStatus function, an attempt is made to set the
lockedUntil variable to the minimum locked value for that principal among
all servers. However, lockedUntil is set to 0 immediately before this, and
so all attempts to find a locked value less than it fails, and so
lockedUntil always comes out of that function as 0.
- Also in the GetPrincipalLockStatus function, if the principal is
locked out according to all servers, then the main loop will exit when
ubik_CallIter returns the UNOSERVERS error code. But, since the return
code for GetPrincipalLockStatus is set to 1 if and only if ubik_CallIter
returns an error code of 0, this results in an return code of 0 being
returned for GetPrincipalLockStatus when in reality no error occured.
- A similar problem occurs in the kas_PrincipalUnlock function. If the
principal is not currently locked out of any server, ubik_CallIter will
iterate through all servers and return a UNOSERVERS error code. Again, in
this case the return code of kas_PrincipalUnlock will not be set to 1 and
an error will be indicated even though no error occured.
- In kas_PrincipalKeySet, the return code is never set to 1, even when
it completes successfully, so it seems that an error always occurs when
calling this function.
afs_status_t tst = 0;
unsigned int locked;
int count=0;
+ int once = 0;
/*
* Validate input arguments and make rpc.
&locked, 0, 0, 0, 0);
if (tst == 0) {
if (locked) {
- if (locked < *lockedUntil) {
+ if ((locked < *lockedUntil) || !once) {
*lockedUntil = locked;
+ once++;
}
}
}
if ((tst == 0) && (locked == 0)) {
*lockedUntil = 0;
}
- if (tst == 0) {
+ if ((tst == 0) || (tst == UNOSERVERS)) {
rc = 1;
}
if (tst) {
goto fail_kas_PrincipalKeySet;
}
+
+ /* If we failed to fail we must have succeeded */
+ rc = 1;
fail_kas_PrincipalKeySet:
}
} while (tst != UNOSERVERS);
- if (tst == 0) {
+ if ((tst == 0) || (tst == UNOSERVERS)){
rc = 1;
}