diff options
| author | Eli Zaretskii | 2022-09-07 15:18:54 +0300 |
|---|---|---|
| committer | Eli Zaretskii | 2022-09-07 15:18:54 +0300 |
| commit | 579eefda36b9a8cd71c9aeff0f32e32d468727a3 (patch) | |
| tree | 7b5cdc52f3f8858691ec05925351c8302caeae27 /src/w32notify.c | |
| parent | c6c9dfc8670f5698634a8d5853853056ff928974 (diff) | |
| download | emacs-579eefda36b9a8cd71c9aeff0f32e32d468727a3.tar.gz emacs-579eefda36b9a8cd71c9aeff0f32e32d468727a3.zip | |
Don't follow symlinks in w32notify file watches
* src/w32notify.c (add_watch): On filesystems that support
symlinks, don't follow symlinks. (Bug#57536)
* src/w32.c (symlinks_supported): New function.
* src/w32.h (symlinks_supported): Add prototype.
Diffstat (limited to 'src/w32notify.c')
| -rw-r--r-- | src/w32notify.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/src/w32notify.c b/src/w32notify.c index 72e634f77c7..6b5fce9f927 100644 --- a/src/w32notify.c +++ b/src/w32notify.c | |||
| @@ -367,6 +367,12 @@ add_watch (const char *parent_dir, const char *file, BOOL subdirs, DWORD flags) | |||
| 367 | if (!file) | 367 | if (!file) |
| 368 | return NULL; | 368 | return NULL; |
| 369 | 369 | ||
| 370 | /* Do not follow symlinks, so that the caller could watch symlink | ||
| 371 | files. */ | ||
| 372 | DWORD crflags = FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED; | ||
| 373 | if (symlinks_supported (parent_dir)) | ||
| 374 | crflags |= FILE_FLAG_OPEN_REPARSE_POINT; | ||
| 375 | |||
| 370 | if (w32_unicode_filenames) | 376 | if (w32_unicode_filenames) |
| 371 | { | 377 | { |
| 372 | wchar_t dir_w[MAX_PATH], file_w[MAX_PATH]; | 378 | wchar_t dir_w[MAX_PATH], file_w[MAX_PATH]; |
| @@ -383,8 +389,7 @@ add_watch (const char *parent_dir, const char *file, BOOL subdirs, DWORD flags) | |||
| 383 | processes from deleting files inside | 389 | processes from deleting files inside |
| 384 | parent_dir. */ | 390 | parent_dir. */ |
| 385 | FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, | 391 | FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, |
| 386 | NULL, OPEN_EXISTING, | 392 | NULL, OPEN_EXISTING, crflags, |
| 387 | FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, | ||
| 388 | NULL); | 393 | NULL); |
| 389 | } | 394 | } |
| 390 | else | 395 | else |
| @@ -400,8 +405,7 @@ add_watch (const char *parent_dir, const char *file, BOOL subdirs, DWORD flags) | |||
| 400 | hdir = CreateFileA (dir_a, | 405 | hdir = CreateFileA (dir_a, |
| 401 | FILE_LIST_DIRECTORY, | 406 | FILE_LIST_DIRECTORY, |
| 402 | FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, | 407 | FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, |
| 403 | NULL, OPEN_EXISTING, | 408 | NULL, OPEN_EXISTING, crflags, |
| 404 | FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, | ||
| 405 | NULL); | 409 | NULL); |
| 406 | } | 410 | } |
| 407 | if (hdir == INVALID_HANDLE_VALUE) | 411 | if (hdir == INVALID_HANDLE_VALUE) |