1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
| | From bc3fb45db30741a60d4e8904cbd4d6118fb85741 Mon Sep 17 00:00:00 2001
From: Joseph Lansdowne <j49137@gmail.com>
Date: Sun, 31 Mar 2019 19:25:26 +0100
Subject: [PATCH] fix filenames with url-reserved characters
---
ChangeLog | 2 +-
path_utils.c | 28 +++++++++++++++++-----------
2 files changed, 18 insertions(+), 12 deletions(-)
diff --git a/path_utils.c b/path_utils.c
index db3d7e4..4f747bb 100644
--- a/path_utils.c
+++ b/path_utils.c
@@ -39,9 +39,11 @@ char* get_full_path(const char* path) {
path = converted_path;
}
- ret = g_strdup_printf("%s%s", ftpfs.host, path);
+ const char *const escaped_path = g_uri_escape_string(path, "/", FALSE);
+ ret = g_strdup_printf("%s%s", ftpfs.host, escaped_path);
free(converted_path);
+ free((char *) escaped_path);
return ret;
}
@@ -58,9 +60,12 @@ char* get_fulldir_path(const char* path) {
path = converted_path;
}
- ret = g_strdup_printf("%s%s%s", ftpfs.host, path, strlen(path) ? "/" : "");
+ const char *const escaped_path = g_uri_escape_string(path, "/", FALSE);
+ ret = g_strdup_printf(
+ "%s%s%s", ftpfs.host, escaped_path, strlen(escaped_path) ? "/" : "");
free(converted_path);
+ free((char *) escaped_path);
return ret;
}
@@ -71,24 +76,25 @@ char* get_dir_path(const char* path) {
const char *lastdir;
++path;
-
- lastdir = strrchr(path, '/');
- if (lastdir == NULL) lastdir = path;
- if (ftpfs.codepage && (lastdir - path > 0)) {
- converted_path = g_strndup(path, lastdir - path);
+ if (ftpfs.codepage) {
+ converted_path = g_strdup(path);
convert_charsets(ftpfs.iocharset, ftpfs.codepage, &converted_path);
path = converted_path;
- lastdir = path + strlen(path);
}
+ const char *const escaped_path = g_uri_escape_string(path, "/", FALSE);
+ lastdir = strrchr(escaped_path, '/');
+ if (lastdir == NULL) lastdir = escaped_path;
+
ret = g_strdup_printf("%s%.*s%s",
ftpfs.host,
- lastdir - path,
- path,
- lastdir - path ? "/" : "");
+ lastdir - escaped_path,
+ escaped_path,
+ lastdir - escaped_path ? "/" : "");
free(converted_path);
+ free((char *) escaped_path);
return ret;
}
|