summaryrefslogtreecommitdiffstats
path: root/src/lib
diff options
context:
space:
mode:
authorTheodore Tso <tytso@mit.edu>1994-09-29 18:40:00 +0000
committerTheodore Tso <tytso@mit.edu>1994-09-29 18:40:00 +0000
commitb2caf4b17818398c789a51032d0f90704c182ebf (patch)
tree2d7c0e0e660411158f085c3fdeb10a34348ee37e /src/lib
parent35d701a1e0d20fcb008182d7e0c2861f102cd279 (diff)
Return the most recent key (with the greatest kvno) instead of the
first key found in the keytab file. git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@4375 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/krb5/keytab/file/ChangeLog6
-rw-r--r--src/lib/krb5/keytab/file/ktf_get_en.c26
2 files changed, 25 insertions, 7 deletions
diff --git a/src/lib/krb5/keytab/file/ChangeLog b/src/lib/krb5/keytab/file/ChangeLog
index d4e6a7b2a..4c345eaa2 100644
--- a/src/lib/krb5/keytab/file/ChangeLog
+++ b/src/lib/krb5/keytab/file/ChangeLog
@@ -1,3 +1,9 @@
+Wed Sep 28 21:14:49 1994 Theodore Y. Ts'o (tytso@dcl)
+
+ * ktf_get_en.c (krb5_ktfile_get_entry): Modified to return the
+ most recent key (with the greatest kvno), instead of the
+ first.
+
Thu Sep 22 21:51:53 1994 Theodore Y. Ts'o (tytso@dcl)
* ktf_get_en.c (krb5_ktfile_get_entry):
diff --git a/src/lib/krb5/keytab/file/ktf_get_en.c b/src/lib/krb5/keytab/file/ktf_get_en.c
index 59e20aed0..2660a455f 100644
--- a/src/lib/krb5/keytab/file/ktf_get_en.c
+++ b/src/lib/krb5/keytab/file/ktf_get_en.c
@@ -42,7 +42,7 @@ OLDDECLARG(krb5_principal, principal)
OLDDECLARG(krb5_kvno, kvno)
OLDDECLARG(krb5_keytab_entry *, entry)
{
- krb5_keytab_entry cur_entry;
+ krb5_keytab_entry cur_entry, new_entry;
krb5_error_code kerror = 0;
/* Open the keyfile for reading */
@@ -53,25 +53,37 @@ OLDDECLARG(krb5_keytab_entry *, entry)
* For efficiency and simplicity, we'll use a while true that
* is exited with a break statement.
*/
+ cur_entry.principal = 0;
while (TRUE) {
- if (kerror = krb5_ktfileint_read_entry(id, &cur_entry))
+ if (kerror = krb5_ktfileint_read_entry(id, &new_entry))
break;
- if (((kvno == IGNORE_VNO) || (kvno == cur_entry.vno)) &&
- krb5_principal_compare(principal, cur_entry.principal)) {
- /* found a match */
- break;
+ if (krb5_principal_compare(principal, cur_entry.principal)) {
+ if (kvno == IGNORE_VNO) {
+ if (cur_entry.vno < new_entry.vno) {
+ krb5_kt_free_entry(&cur_entry);
+ cur_entry = new_entry;
+ }
+ } else {
+ cur_entry = new_entry;
+ break;
+ }
+ } else {
+ krb5_kt_free_entry(&new_entry);
}
- krb5_kt_free_entry(&cur_entry);
}
if (kerror) {
if (kerror == KRB5_KT_END)
kerror = KRB5_KT_NOTFOUND;
(void) krb5_ktfileint_close(id);
+ if (cur_entry.principal)
+ krb5_kt_free_entry(&cur_entry);
return kerror;
}
if ((kerror = krb5_ktfileint_close(id)) != 0) {
krb5_kt_free_entry(&cur_entry);
+ if (cur_entry.principal)
+ krb5_kt_free_entry(&cur_entry);
return kerror;
}
*entry = cur_entry;