aboutsummaryrefslogtreecommitdiff
path: root/src/kadmin/ktutil/ktutil_funcs.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/kadmin/ktutil/ktutil_funcs.c')
-rw-r--r--src/kadmin/ktutil/ktutil_funcs.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/src/kadmin/ktutil/ktutil_funcs.c b/src/kadmin/ktutil/ktutil_funcs.c
index d4c0ce9..74531fc 100644
--- a/src/kadmin/ktutil/ktutil_funcs.c
+++ b/src/kadmin/ktutil/ktutil_funcs.c
@@ -317,7 +317,9 @@ krb5_error_code ktutil_write_keytab(context, list, name)
krb5_error_code retval = 0;
strcpy(ktname, "WRFILE:");
- strncat(ktname, name, MAXPATHLEN);
+ if (strlen (name) >= MAXPATHLEN)
+ return ENAMETOOLONG;
+ strncat (ktname, name, MAXPATHLEN);
retval = krb5_kt_resolve(context, ktname, &kt);
if (retval)
return retval;
@@ -500,9 +502,18 @@ krb5_error_code ktutil_write_srvtab(context, list, name)
lp1 = prev->next;
}
lp1->entry = lp->entry;
- } else if (lp1->entry->vno < lp->entry->vno)
- /* Check if lp->entry is newer kvno; if so, update */
- lp1->entry = lp->entry;
+ } else {
+ /* This heuristic should be roughly the same as in the
+ keytab-reading code in libkrb5. */
+ int offset = 0;
+ if (lp1->entry->vno > 240 || lp->entry->vno > 240) {
+ offset = 128;
+ }
+#define M(X) (((X) + offset) % 256)
+ if (M(lp1->entry->vno) < M(lp->entry->vno))
+ /* Check if lp->entry is newer kvno; if so, update */
+ lp1->entry = lp->entry;
+ }
}
fp = fopen(name, "w");
if (!fp) {