From bc3fb45db30741a60d4e8904cbd4d6118fb85741 Mon Sep 17 00:00:00 2001 From: Joseph Lansdowne 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; }