diff options
author | 2018-10-01 08:05:25 +0000 | |
---|---|---|
committer | 2018-10-01 08:05:25 +0000 | |
commit | f7a1236584d501fbdb45ae4b6006317127caa2ed (patch) | |
tree | db3a8a7d9d26e6a4078a94a0e9131d9722d8dda6 /usr.bin/mandoc/cgi.c | |
parent | As per POSIX, when str{,r}chr is comparing it should convert c to a char. (diff) | |
download | wireguard-openbsd-f7a1236584d501fbdb45ae4b6006317127caa2ed.tar.xz wireguard-openbsd-f7a1236584d501fbdb45ae4b6006317127caa2ed.zip |
Add missing URI encoding when writing HTTP redirects,
fixing a bug reported by <jungleboogie0 at gmail dot com> on bugs@.
While here, fully validate the arch name
such that we do not have to URI encode that one.
Diffstat (limited to 'usr.bin/mandoc/cgi.c')
-rw-r--r-- | usr.bin/mandoc/cgi.c | 38 |
1 files changed, 33 insertions, 5 deletions
diff --git a/usr.bin/mandoc/cgi.c b/usr.bin/mandoc/cgi.c index f730c0e17e7..d967c6d6c96 100644 --- a/usr.bin/mandoc/cgi.c +++ b/usr.bin/mandoc/cgi.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cgi.c,v 1.96 2018/05/29 20:32:41 schwarze Exp $ */ +/* $OpenBSD: cgi.c,v 1.97 2018/10/01 08:05:25 schwarze Exp $ */ /* * Copyright (c) 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv> * Copyright (c) 2014, 2015, 2016, 2017 Ingo Schwarze <schwarze@usta.de> @@ -65,6 +65,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 *); @@ -86,6 +87,7 @@ static void resp_format(const struct req *, const char *); 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 *); @@ -312,6 +314,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) { @@ -486,6 +500,18 @@ validate_manpath(const struct req *req, const char* manpath) } 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) { @@ -558,9 +584,11 @@ pg_redirect(const struct req *req, const char *name) 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"); } @@ -1083,7 +1111,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; |