From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from localhost (fantadrom.bsd.lv [local]) by fantadrom.bsd.lv (OpenSMTPD) with ESMTPA id b6c03ff3 for ; Mon, 1 Oct 2018 03:07:23 -0500 (EST) Date: Mon, 1 Oct 2018 03:07:23 -0500 (EST) X-Mailinglist: mandoc-source Reply-To: source@mandoc.bsd.lv MIME-Version: 1.0 From: schwarze@mandoc.bsd.lv To: source@mandoc.bsd.lv Subject: mandoc: Add missing URI encoding when writing HTTP redirects, fixing a X-Mailer: activitymail 1.26, http://search.cpan.org/dist/activitymail/ Content-Type: text/plain; charset=utf-8 Message-Id: <381bbdc5129987ad@fantadrom.bsd.lv> Log Message: ----------- Add missing URI encoding when writing HTTP redirects, fixing a bug reported by on bugs@. While here, fully validate the arch name such that we do not have to URI encode that one. Modified Files: -------------- mandoc: cgi.c Revision Data ------------- Index: cgi.c =================================================================== RCS file: /home/cvs/mandoc/mandoc/cgi.c,v retrieving revision 1.158 retrieving revision 1.159 diff -Lcgi.c -Lcgi.c -u -p -r1.158 -r1.159 --- cgi.c +++ cgi.c @@ -69,6 +69,7 @@ enum focus { static void html_print(const char *); static void html_putchar(char); static int http_decode(char *); +static void http_encode(const char *p); static void parse_manpath_conf(struct req *); static void parse_path_info(struct req *req, const char *path); static void parse_query_string(struct req *, const char *); @@ -90,6 +91,7 @@ static void resp_format(const struct r static void resp_searchform(const struct req *, enum focus); static void resp_show(const struct req *, const char *); static void set_query_attr(char **, char **); +static int validate_arch(const char *); static int validate_filename(const char *); static int validate_manpath(const struct req *, const char *); static int validate_urifrag(const char *); @@ -316,6 +318,18 @@ http_decode(char *p) } static void +http_encode(const char *p) +{ + for (; *p != '\0'; p++) { + if (isalnum((unsigned char)*p) == 0 && + strchr("-._~", *p) == NULL) + printf("%%%02.2X", (unsigned char)*p); + else + putchar(*p); + } +} + +static void resp_begin_http(int code, const char *msg) { @@ -490,6 +504,18 @@ validate_manpath(const struct req *req, } static int +validate_arch(const char *arch) +{ + int i; + + for (i = 0; i < arch_MAX; i++) + if (strcmp(arch, arch_names[i]) == 0) + return 1; + + return 0; +} + +static int validate_filename(const char *file) { @@ -562,9 +588,11 @@ pg_redirect(const struct req *req, const printf("%s/", req->q.manpath); if (req->q.arch != NULL) printf("%s/", req->q.arch); - printf("%s", name); - if (req->q.sec != NULL) - printf(".%s", req->q.sec); + http_encode(name); + if (req->q.sec != NULL) { + putchar('.'); + http_encode(req->q.sec); + } printf("\r\nContent-Type: text/html; charset=utf-8\r\n\r\n"); } @@ -1089,7 +1117,7 @@ main(void) return EXIT_FAILURE; } - if ( ! (NULL == req.q.arch || validate_urifrag(req.q.arch))) { + if (req.q.arch != NULL && validate_arch(req.q.arch) == 0) { pg_error_badrequest( "You specified an invalid architecture."); return EXIT_FAILURE; -- To unsubscribe send an email to source+unsubscribe@mandoc.bsd.lv