diff options
author | Werner Koch <[email protected]> | 2020-10-20 11:38:11 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2020-10-20 11:38:11 +0000 |
commit | b47c355b18d9537ccc3dd3e80cc1825b018ecff7 (patch) | |
tree | 2ca24c9657c4897b67c812a5b6b0249f9d0b6046 /common/dotlock.c | |
parent | Replace most of the remaining stdio calls by estream calls. (diff) | |
download | gnupg-b47c355b18d9537ccc3dd3e80cc1825b018ecff7.tar.gz gnupg-b47c355b18d9537ccc3dd3e80cc1825b018ecff7.zip |
w32: Allow Unicode filenames for dotlock
* common/dotlock.c (any8bitchar) [W32]: New.
(dotlock_create_w32): Use strconcat and CreateFileW.
* common/t-dotlock.c: Source include dotlock.c and modify to allow
manual testing on Windows.
--
GnuPG-bug-id: 5098
Signed-off-by: Werner Koch <[email protected]>
Diffstat (limited to 'common/dotlock.c')
-rw-r--r-- | common/dotlock.c | 55 |
1 files changed, 34 insertions, 21 deletions
diff --git a/common/dotlock.c b/common/dotlock.c index 8d9ee5139..f3e4bac28 100644 --- a/common/dotlock.c +++ b/common/dotlock.c @@ -471,6 +471,21 @@ map_w32_to_errno (DWORD w32_err) } #endif /*HAVE_DOSISH_SYSTEM*/ + +#ifdef HAVE_W32_SYSTEM +static int +any8bitchar (const char *string) +{ + if (string) + for ( ; *string; string++) + if ((*string & 0x80)) + return 1; + return 0; +} +#endif /*HAVE_W32_SYSTEM*/ + + + /* Entirely disable all locking. This function should be called before any locking is done. It may be called right at startup of @@ -794,7 +809,7 @@ dotlock_create_w32 (dotlock_t h, const char *file_to_lock) h->next = all_lockfiles; all_lockfiles = h; - h->lockname = xtrymalloc ( strlen (file_to_lock) + 6 ); + h->lockname = strconcat (file_to_lock, EXTSEP_S "lock", NULL); if (!h->lockname) { all_lockfiles = h->next; @@ -802,7 +817,6 @@ dotlock_create_w32 (dotlock_t h, const char *file_to_lock) xfree (h); return NULL; } - strcpy (stpcpy(h->lockname, file_to_lock), EXTSEP_S "lock"); /* If would be nice if we would use the FILE_FLAG_DELETE_ON_CLOSE along with FILE_SHARE_DELETE but that does not work due to a race @@ -812,25 +826,24 @@ dotlock_create_w32 (dotlock_t h, const char *file_to_lock) reasons why a lock file can't be created and thus the process would not stop as expected but spin until Windows crashes. Our solution is to keep the lock file open; that does not harm. */ - { -#ifdef HAVE_W32CE_SYSTEM - wchar_t *wname = utf8_to_wchar (h->lockname); - - if (wname) - h->lockhd = CreateFile (wname, - GENERIC_READ|GENERIC_WRITE, - FILE_SHARE_READ|FILE_SHARE_WRITE, - NULL, OPEN_ALWAYS, 0, NULL); - else - h->lockhd = INVALID_HANDLE_VALUE; - xfree (wname); -#else - h->lockhd = CreateFile (h->lockname, - GENERIC_READ|GENERIC_WRITE, - FILE_SHARE_READ|FILE_SHARE_WRITE, - NULL, OPEN_ALWAYS, 0, NULL); -#endif - } + if (any8bitchar (h->lockname)) + { + wchar_t *wname = utf8_to_wchar (h->lockname); + + if (wname) + h->lockhd = CreateFileW (wname, + GENERIC_READ|GENERIC_WRITE, + FILE_SHARE_READ|FILE_SHARE_WRITE, + NULL, OPEN_ALWAYS, 0, NULL); + else + h->lockhd = INVALID_HANDLE_VALUE; + xfree (wname); + } + else + h->lockhd = CreateFileA (h->lockname, + GENERIC_READ|GENERIC_WRITE, + FILE_SHARE_READ|FILE_SHARE_WRITE, + NULL, OPEN_ALWAYS, 0, NULL); if (h->lockhd == INVALID_HANDLE_VALUE) { int saveerrno = map_w32_to_errno (GetLastError ()); |