summaryrefslogtreecommitdiff
path: root/daemon
diff options
context:
space:
mode:
authorCorey Berla <corey@berla.me>2023-04-11 16:14:15 -0700
committerCorey Berla <corey@berla.me>2023-04-11 16:14:15 -0700
commitf99b812d16d29f9fa6dd090f4ccb6058c004e012 (patch)
tree038ff5e35e56f04383a1a597b2cb4e3145e6c327 /daemon
parent746962c5e8c73756422ecb2895bdec4878a3326d (diff)
downloadgvfs-f99b812d16d29f9fa6dd090f4ccb6058c004e012.tar.gz
smb: Allow renaming a file to the same name with a different case
We check to see if the desired file name already exists before doing a renaming by stat'ing the file (to prevent smb from destroying an existing file). Since smb is not case sensitive, the check for an existing file mistakenly returns true if we are only changing the filename's case. Add a second check to see whether we are simply changing the case of the filename. Fixes: https://gitlab.gnome.org/GNOME/gvfs/-/issues/672
Diffstat (limited to 'daemon')
-rw-r--r--daemon/gvfsbackendsmb.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/daemon/gvfsbackendsmb.c b/daemon/gvfsbackendsmb.c
index d999a2a6..64882c16 100644
--- a/daemon/gvfsbackendsmb.c
+++ b/daemon/gvfsbackendsmb.c
@@ -1892,6 +1892,8 @@ do_set_display_name (GVfsBackend *backend,
{
GVfsBackendSmb *op_backend = G_VFS_BACKEND_SMB (backend);
char *from_uri, *to_uri;
+ g_autofree char *from_uri_case = NULL;
+ g_autofree char *to_uri_case = NULL;
char *dirname, *new_path;
int res, errsv;
struct stat st;
@@ -1916,7 +1918,12 @@ do_set_display_name (GVfsBackend *backend,
*/
smbc_stat = smbc_getFunctionStat (op_backend->smb_context);
res = smbc_stat (op_backend->smb_context, to_uri, &st);
- if (res == 0)
+ /* But still allow renaming if the existing file is the original file.
+ * In other words if the case is changing.
+ */
+ from_uri_case = g_utf8_casefold (from_uri, -1);
+ to_uri_case = g_utf8_casefold (to_uri, -1);
+ if (res == 0 && g_strcmp0 (from_uri_case, to_uri_case) != 0)
{
g_vfs_job_failed (G_VFS_JOB (job),
G_IO_ERROR, G_IO_ERROR_EXISTS,