summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--krb5-1.5-fclose.patch40
1 files changed, 40 insertions, 0 deletions
diff --git a/krb5-1.5-fclose.patch b/krb5-1.5-fclose.patch
new file mode 100644
index 0000000..743b24a
--- /dev/null
+++ b/krb5-1.5-fclose.patch
@@ -0,0 +1,40 @@
+Ensure that we don't accidentally attempt to use or fclose() a file which we
+have already fclose()d.
+
+--- krb5-1.5/src/lib/krb5/keytab/kt_file.c 2006-06-13 10:14:27.000000000 -0400
++++ krb5-1.5/src/lib/krb5/keytab/kt_file.c 2006-07-05 14:55:11.000000000 -0400
+@@ -1083,29 +1083,32 @@
+ if (writevno) {
+ kt_vno = htons(krb5_kt_default_vno);
+ KTVERSION(id) = krb5_kt_default_vno;
+ if (!xfwrite(&kt_vno, sizeof(kt_vno), 1, KTFILEP(id))) {
+- kerror = errno;
++ kerror = errno ? errno : EIO;
+ (void) krb5_unlock_file(context, fileno(KTFILEP(id)));
+ (void) fclose(KTFILEP(id));
++ KTFILEP(id) = 0;
+ return kerror;
+ }
+ } else {
+ /* gotta verify it instead... */
+ if (!xfread(&kt_vno, sizeof(kt_vno), 1, KTFILEP(id))) {
+ if (feof(KTFILEP(id)))
+ kerror = KRB5_KEYTAB_BADVNO;
+ else
+- kerror = errno;
++ kerror = errno ? errno : EIO;
+ (void) krb5_unlock_file(context, fileno(KTFILEP(id)));
+ (void) fclose(KTFILEP(id));
++ KTFILEP(id) = 0;
+ return kerror;
+ }
+ kt_vno = KTVERSION(id) = ntohs(kt_vno);
+ if ((kt_vno != KRB5_KT_VNO) &&
+ (kt_vno != KRB5_KT_VNO_1)) {
+ (void) krb5_unlock_file(context, fileno(KTFILEP(id)));
+ (void) fclose(KTFILEP(id));
++ KTFILEP(id) = 0;
+ return KRB5_KEYTAB_BADVNO;
+ }
+ }
+ return 0;