mirror of
https://git.freebsd.org/ports.git
synced 2025-05-17 17:43:11 -04:00
Add patch files from Gentoo[1] to escape un-encoded URLs passed to libcurl causing infinite wait as reported in this issue[2]. CurlFTPFS project seems unmaintained for the last 4 years, so we apply the fixes in the port itself just like ofther projects does. [1] https://gitweb.gentoo.org/repo/gentoo.git/plain/net-fs/curlftpfs/files/curlftpfs-0.9.2-fix-escaping.patch [2] https://sourceforge.net/p/curlftpfs/bugs/65/ PR: 260371 Obtained from: Gentoo Repo (https://gitweb.gentoo.org/repo/gentoo.git/tree/net-fs/curlftpfs/files/curlftpfs-0.9.2-fix-escaping.patch)
75 lines
1.8 KiB
C
75 lines
1.8 KiB
C
--- path_utils.c.orig 2007-11-20 19:27:58 UTC
|
|
+++ path_utils.c
|
|
@@ -92,3 +92,72 @@ char* get_dir_path(const char* path) {
|
|
|
|
return ret;
|
|
}
|
|
+
|
|
+/*
|
|
+ * the chars not needed to be escaped:
|
|
+ * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
|
|
+ */
|
|
+static inline int is_unreserved_rfc3986(char c)
|
|
+{
|
|
+ int is_locase_alpha = (c >= 'a' && c <= 'z');
|
|
+ int is_upcase_alpha = (c >= 'a' && c <= 'z');
|
|
+ int is_digit = (c >= '0' && c <= '9');
|
|
+ int is_special = c == '-'
|
|
+ || c == '.'
|
|
+ || c == '_'
|
|
+ || c == '~';
|
|
+ int is_unreserved = is_locase_alpha
|
|
+ || is_upcase_alpha
|
|
+ || is_digit
|
|
+ || is_special;
|
|
+
|
|
+ return is_unreserved;
|
|
+}
|
|
+
|
|
+static inline int is_unreserved(char c)
|
|
+{
|
|
+ return is_unreserved_rfc3986(c) || c == '/';
|
|
+}
|
|
+
|
|
+char* path_to_uri(const char* path)
|
|
+{
|
|
+ static const char hex[] = "0123456789ABCDEF";
|
|
+ size_t path_len = strlen(path);
|
|
+ size_t host_len = strlen(ftpfs.host);
|
|
+ /* at worst: c -> %XX */
|
|
+ char * encoded_path = malloc (3 * path_len + 1);
|
|
+ const char * s = path;
|
|
+ char * d = encoded_path;
|
|
+
|
|
+ /*
|
|
+ * 'path' is always prefixed with 'ftpfs.host'
|
|
+ */
|
|
+ memcpy (d, ftpfs.host, host_len);
|
|
+ s += host_len;
|
|
+ d += host_len;
|
|
+
|
|
+ for (; *s; ++s)
|
|
+ {
|
|
+ char c = *s;
|
|
+ if (is_unreserved (c))
|
|
+ {
|
|
+ *d++ = c;
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ unsigned int hi = ((unsigned)c >> 4) & 0xF;
|
|
+ unsigned int lo = ((unsigned)c >> 0) & 0xF;
|
|
+ *d++ = '%';
|
|
+ *d++ = hex[hi];
|
|
+ *d++ = hex[lo];
|
|
+ }
|
|
+ }
|
|
+ *d = '\0';
|
|
+
|
|
+ return encoded_path;
|
|
+}
|
|
+
|
|
+void free_uri(char* path)
|
|
+{
|
|
+ free(path);
|
|
+}
|