summaryrefslogtreecommitdiffstats
path: root/usr.bin/mandoc/cgi.c
diff options
context:
space:
mode:
authorschwarze <schwarze@openbsd.org>2018-10-01 08:05:25 +0000
committerschwarze <schwarze@openbsd.org>2018-10-01 08:05:25 +0000
commitf7a1236584d501fbdb45ae4b6006317127caa2ed (patch)
treedb3a8a7d9d26e6a4078a94a0e9131d9722d8dda6 /usr.bin/mandoc/cgi.c
parentAs per POSIX, when str{,r}chr is comparing it should convert c to a char. (diff)
downloadwireguard-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.c38
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;