diff options
| author | Robin Haberkorn <rhaberkorn@fmsbw.de> | 2025-12-09 01:12:57 +0100 |
|---|---|---|
| committer | Robin Haberkorn <rhaberkorn@fmsbw.de> | 2025-12-09 01:12:57 +0100 |
| commit | a886813f86f88b4b1cc874a81229b7b59d0d463a (patch) | |
| tree | b8eec4c0f1363e0aecf06651bcb9b9230e1e677c /src/file-utils.c | |
| parent | 4aaff7294131552be8c731e2f4d230106a1149f7 (diff) | |
fixed rub out of file writes to non-existing symlinks
* teco_file_get_absolute_path() does not currently guarantee to resolve
non-existent parts of the path.
When opening a symbolic link to a non-existing file, it would only
be created when writing out the file.
The undo token to remove it, however would remove the original
unresolved path.
When rubbing out the EW, the symlink would get removed instead
of the newly written file.
* We now resolve/canonicalize the path again immediately after
opening the new file, which should ensure that it resolves.
* As an alternative, we might have also tried to reliably canonicalize
non-existent symlinks. This however is tricky and there would have
to be a break condition to guard against cyclic symlinke.
In the end there is no guarantee to be able to resolve a path
exactly like the OS does.
Therefore, teco_file_get_absolute_path() was not touched,
not even on UNIX.
* A test case was not added since it would rely on creating real symlinks.
It wouldn't work on MSYS when `ln -s` falls back to hardlinks.
Perhaps other non-UNIX platforms would have similar restrictions.
Diffstat (limited to 'src/file-utils.c')
| -rw-r--r-- | src/file-utils.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/src/file-utils.c b/src/file-utils.c index 75bcb48..db06ff3 100644 --- a/src/file-utils.c +++ b/src/file-utils.c @@ -109,6 +109,14 @@ teco_file_set_attributes(const gchar *filename, teco_file_attributes_t attrs) #ifdef G_OS_UNIX +/* + * NOTE: This version does not resolve symlinks to non-existing paths. + * It could be improved by repeating readlink() and g_canonicalize_filename(), + * but it would require glib v2.58.0. + * Alternatively we could also iteratively resolve all path components. + * Currently, we simply do not rely on successful canonicalization of + * yet non-existing paths. + */ gchar * teco_file_get_absolute_path(const gchar *path) { @@ -137,13 +145,12 @@ teco_file_is_visible(const gchar *path) #if GLIB_CHECK_VERSION(2,58,0) /* - * FIXME: This should perhaps be preferred on any platform. - * But it will complicate preprocessing. + * NOTE: Does not resolve symlinks. */ gchar * teco_file_get_absolute_path(const gchar *path) { - return g_canonicalize_filename(path, NULL); + return path ? g_canonicalize_filename(path, NULL) : NULL; } #else /* !GLIB_CHECK_VERSION(2,58,0) */ |
