From 78c8c4dabb62a6669cfd4eca231e39fd7fd4567a Mon Sep 17 00:00:00 2001 From: Xavier Del Campo Romero Date: Mon, 19 Feb 2024 23:09:58 +0100 Subject: [PATCH] page.c: URL-encode href Otherwise, files with special characters, such as '%', could not be downloaded or previewed. --- page.c | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/page.c b/page.c index 02049a3..80a9675 100644 --- a/page.c +++ b/page.c @@ -108,6 +108,7 @@ static int prepare_name(struct html_node *const n, struct stat *const sb, struct html_node *a; struct dynstr d, dname; const char *const sep = S_ISDIR(sb->st_mode) ? "/" : ""; + char *encurl = NULL; dynstr_init(&d); dynstr_init(&dname); @@ -122,7 +123,12 @@ static int prepare_name(struct html_node *const n, struct stat *const sb, fprintf(stderr, "%s: html_node_add_child failed\n", __func__); goto end; } - else if (html_node_add_attr(a, "href", d.str)) + else if (!(encurl = http_encode_url(d.str))) + { + fprintf(stderr, "%s: http_encode_url failed\n", __func__); + goto end; + } + else if (html_node_add_attr(a, "href", encurl)) { fprintf(stderr, "%s: html_node_add_attr href failed\n", __func__); goto end; @@ -143,6 +149,7 @@ static int prepare_name(struct html_node *const n, struct stat *const sb, end: dynstr_free(&d); dynstr_free(&dname); + free(encurl); return ret; } @@ -303,6 +310,7 @@ static int prepare_preview(struct html_node *const n, const struct stat *const sb, const char *const dir, const char *const name) { int ret = -1; + char *encurl = NULL; struct html_node *a; struct dynstr d; @@ -315,9 +323,22 @@ static int prepare_preview(struct html_node *const n, fprintf(stderr, "%s: html_node_add_child form failed\n", __func__); goto end; } - else if (dynstr_append(&d, "%s%s?preview=1", dir, name)) + else if (dynstr_append(&d, "%s%s", dir, name)) { - fprintf(stderr, "%s: dynstr_append failed\n", __func__); + fprintf(stderr, "%s: dynstr_append d failed\n", __func__); + goto end; + } + else if (!(encurl = http_encode_url(d.str))) + { + fprintf(stderr, "%s: http_encode_url failed\n", __func__); + goto end; + } + + dynstr_free(&d); + + if (dynstr_append(&d, "%s?preview=1", encurl)) + { + fprintf(stderr, "%s: dynstr_append encd failed\n", __func__); goto end; } else if (html_node_add_attr(a, "href", d.str)) @@ -335,6 +356,7 @@ static int prepare_preview(struct html_node *const n, end: dynstr_free(&d); + free(encurl); return ret; }