store the kvno % 256 as the byte and the complete 32 bit kvno after
the end of the current keytab entry git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@10871 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997 - 2001 Kungliga Tekniska H<>gskolan
|
* Copyright (c) 1997 - 2002 Kungliga Tekniska H<>gskolan
|
||||||
* (Royal Institute of Technology, Stockholm, Sweden).
|
* (Royal Institute of Technology, Stockholm, Sweden).
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -262,6 +262,7 @@ krb5_kt_compare(krb5_context context,
|
|||||||
/*
|
/*
|
||||||
* Retrieve the keytab entry for `principal, kvno, enctype' into `entry'
|
* Retrieve the keytab entry for `principal, kvno, enctype' into `entry'
|
||||||
* from the keytab `id'.
|
* from the keytab `id'.
|
||||||
|
* kvno == 0 is a wildcard and gives the keytab with the highest vno.
|
||||||
* Return 0 or an error.
|
* Return 0 or an error.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -287,7 +288,10 @@ krb5_kt_get_entry(krb5_context context,
|
|||||||
entry->vno = 0;
|
entry->vno = 0;
|
||||||
while (krb5_kt_next_entry(context, id, &tmp, &cursor) == 0) {
|
while (krb5_kt_next_entry(context, id, &tmp, &cursor) == 0) {
|
||||||
if (krb5_kt_compare(context, &tmp, principal, 0, enctype)) {
|
if (krb5_kt_compare(context, &tmp, principal, 0, enctype)) {
|
||||||
if (kvno == tmp.vno) {
|
/* the file keytab might only store the lower 8 bits of
|
||||||
|
the kvno, so only compare those bits */
|
||||||
|
if (kvno == tmp.vno
|
||||||
|
|| (tmp.vno < 256 && kvno % 256 == tmp.vno)) {
|
||||||
krb5_kt_copy_entry_contents (context, &tmp, entry);
|
krb5_kt_copy_entry_contents (context, &tmp, entry);
|
||||||
krb5_kt_free_entry (context, &tmp);
|
krb5_kt_free_entry (context, &tmp);
|
||||||
krb5_kt_end_seq_get(context, id, &cursor);
|
krb5_kt_end_seq_get(context, id, &cursor);
|
||||||
@@ -310,16 +314,19 @@ krb5_kt_get_entry(krb5_context context,
|
|||||||
krb5_kt_get_name (context, id, kt_name, sizeof(kt_name));
|
krb5_kt_get_name (context, id, kt_name, sizeof(kt_name));
|
||||||
|
|
||||||
krb5_set_error_string (context,
|
krb5_set_error_string (context,
|
||||||
"failed to find %s in keytab %s",
|
"failed to find %s%s%d%s in keytab %s",
|
||||||
princ, kt_name);
|
princ,
|
||||||
|
kvno ? "(" : "",
|
||||||
|
kvno,
|
||||||
|
kvno ? ")" : "",
|
||||||
|
kt_name);
|
||||||
return KRB5_KT_NOTFOUND;
|
return KRB5_KT_NOTFOUND;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copy the contents of `in' into `out'.
|
* Copy the contents of `in' into `out'.
|
||||||
* Return 0 or an error.
|
* Return 0 or an error. */
|
||||||
*/
|
|
||||||
|
|
||||||
krb5_error_code
|
krb5_error_code
|
||||||
krb5_kt_copy_entry_contents(krb5_context context,
|
krb5_kt_copy_entry_contents(krb5_context context,
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997 - 2001 Kungliga Tekniska H<>gskolan
|
* Copyright (c) 1997 - 2002 Kungliga Tekniska H<>gskolan
|
||||||
* (Royal Institute of Technology, Stockholm, Sweden).
|
* (Royal Institute of Technology, Stockholm, Sweden).
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -376,6 +376,13 @@ loop:
|
|||||||
ret = krb5_kt_ret_keyblock (context, cursor->sp, &entry->keyblock);
|
ret = krb5_kt_ret_keyblock (context, cursor->sp, &entry->keyblock);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out;
|
goto out;
|
||||||
|
/* there might be a 32 bit kvno here
|
||||||
|
* if it's zero, assume that the 8bit one was right,
|
||||||
|
* otherwise trust the new value */
|
||||||
|
ret = krb5_ret_int32(cursor->sp, &tmp32);
|
||||||
|
if (ret == 0 && tmp32 != 0) {
|
||||||
|
entry->vno = tmp32;
|
||||||
|
}
|
||||||
if(start) *start = pos;
|
if(start) *start = pos;
|
||||||
if(end) *end = *start + 4 + len;
|
if(end) *end = *start + 4 + len;
|
||||||
out:
|
out:
|
||||||
@@ -482,7 +489,7 @@ fkt_add_entry(krb5_context context,
|
|||||||
krb5_storage_free(emem);
|
krb5_storage_free(emem);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
ret = krb5_store_int8 (emem, entry->vno);
|
ret = krb5_store_int8 (emem, entry->vno % 256);
|
||||||
if(ret) {
|
if(ret) {
|
||||||
krb5_storage_free(emem);
|
krb5_storage_free(emem);
|
||||||
goto out;
|
goto out;
|
||||||
@@ -492,6 +499,12 @@ fkt_add_entry(krb5_context context,
|
|||||||
krb5_storage_free(emem);
|
krb5_storage_free(emem);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
ret = krb5_store_int32 (emem, entry->vno);
|
||||||
|
if (ret) {
|
||||||
|
krb5_storage_free(emem);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
ret = krb5_storage_to_data(emem, &keytab);
|
ret = krb5_storage_to_data(emem, &keytab);
|
||||||
krb5_storage_free(emem);
|
krb5_storage_free(emem);
|
||||||
if(ret)
|
if(ret)
|
||||||
|
Reference in New Issue
Block a user