efbd8d5
Ensure that we don't accidentally attempt to use or fclose() a file which we
efbd8d5
have already fclose()d.
efbd8d5
efbd8d5
--- krb5-1.5/src/lib/krb5/keytab/kt_file.c	2006-06-13 10:14:27.000000000 -0400
efbd8d5
+++ krb5-1.5/src/lib/krb5/keytab/kt_file.c	2006-07-05 14:55:11.000000000 -0400
efbd8d5
@@ -1083,29 +1083,32 @@
efbd8d5
     if (writevno) {
efbd8d5
 	kt_vno = htons(krb5_kt_default_vno);
efbd8d5
 	KTVERSION(id) = krb5_kt_default_vno;
efbd8d5
 	if (!xfwrite(&kt_vno, sizeof(kt_vno), 1, KTFILEP(id))) {
efbd8d5
-	    kerror = errno;
efbd8d5
+	    kerror = errno ? errno : EIO;
efbd8d5
 	    (void) krb5_unlock_file(context, fileno(KTFILEP(id)));
efbd8d5
 	    (void) fclose(KTFILEP(id));
efbd8d5
+	    KTFILEP(id) = 0;
efbd8d5
 	    return kerror;
efbd8d5
 	}
efbd8d5
     } else {
efbd8d5
 	/* gotta verify it instead... */
efbd8d5
 	if (!xfread(&kt_vno, sizeof(kt_vno), 1, KTFILEP(id))) {
efbd8d5
 	    if (feof(KTFILEP(id)))
efbd8d5
 		kerror = KRB5_KEYTAB_BADVNO;
efbd8d5
 	    else
efbd8d5
-		kerror = errno;
efbd8d5
+		kerror = errno ? errno : EIO;
efbd8d5
 	    (void) krb5_unlock_file(context, fileno(KTFILEP(id)));
efbd8d5
 	    (void) fclose(KTFILEP(id));
efbd8d5
+	    KTFILEP(id) = 0;
efbd8d5
 	    return kerror;
efbd8d5
 	}
efbd8d5
 	kt_vno = KTVERSION(id) = ntohs(kt_vno);
efbd8d5
 	if ((kt_vno != KRB5_KT_VNO) &&
efbd8d5
 	    (kt_vno != KRB5_KT_VNO_1)) {
efbd8d5
 	    (void) krb5_unlock_file(context, fileno(KTFILEP(id)));
efbd8d5
 	    (void) fclose(KTFILEP(id));
efbd8d5
+	    KTFILEP(id) = 0;
efbd8d5
 	    return KRB5_KEYTAB_BADVNO;
efbd8d5
 	}
efbd8d5
     }
efbd8d5
     return 0;