krb5 commit [krb5-1.22]: Make atomic ccache replacement work on Windows
ghudson at mit.edu
ghudson at mit.edu
Tue Jan 27 23:49:07 EST 2026
https://github.com/krb5/krb5/commit/de93bb35195d03c822afb3c8bad93ae9dde9055d
commit de93bb35195d03c822afb3c8bad93ae9dde9055d
Author: YUBI LEE <eubnara at gmail.com>
Date: Fri Oct 31 20:26:05 2025 +0900
Make atomic ccache replacement work on Windows
Commit 371f09d4bf4ca0c7ba15c5ef909bc35307ed9cc3 relies on POSIX
rename() semantics for atomic ccache replacement. Windows rename()
fails if the destination file exists. Add a fallback to ReplaceFile()
when this happens. We may be able to do better using
FILE_RENAME_FLAG_POSIX_SEMANTICS (added in Windows 10 update 1067) but
this should generally suffice.
[ghudson at mit.edu: simplified code slightly; rewrote commit message]
(cherry picked from commit 04816024aadbfd64b5306942e2dfbd757cb05f93)
ticket: 9190
version_fixed: 1.22.2
src/lib/krb5/ccache/cc_file.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/src/lib/krb5/ccache/cc_file.c b/src/lib/krb5/ccache/cc_file.c
index 198152a9e..f34c0f106 100644
--- a/src/lib/krb5/ccache/cc_file.c
+++ b/src/lib/krb5/ccache/cc_file.c
@@ -1311,6 +1311,14 @@ fcc_replace(krb5_context context, krb5_ccache id, krb5_principal princ,
goto errno_cleanup;
st = rename(tmpname, data->filename);
+#ifdef _WIN32
+ /* Windows cannot rename over an existing file under most circumstances.
+ * Try ReplaceFile() (which only works if the destination file exists). */
+ if (st != 0) {
+ if (ReplaceFile(data->filename, tmpname, NULL, 0, NULL, NULL))
+ st = 0;
+ }
+#endif
if (st != 0)
goto errno_cleanup;
tmpfile_exists = FALSE;
More information about the cvs-krb5
mailing list