]> git.ipfire.org Git - thirdparty/krb5.git/commitdiff
Make atomic ccache replacement work on Windows 1467/head
authorYUBI LEE <eubnara@gmail.com>
Fri, 31 Oct 2025 11:26:05 +0000 (20:26 +0900)
committerGreg Hudson <ghudson@mit.edu>
Wed, 12 Nov 2025 03:49:21 +0000 (22:49 -0500)
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@mit.edu: simplified code slightly; rewrote commit message]

ticket: 9190 (new)
tags: pullup
target_version: 1.22-next

src/lib/krb5/ccache/cc_file.c

index 198152a9ecd0fcc63672e976910eeeb4cdb3e029..f34c0f1064aa537928d57cbbc66f552dc157c17b 100644 (file)
@@ -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;