From 8529a79da18ae1112932adcfb68a2203332ebdea Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Wed, 7 Dec 2022 02:39:02 -0600 Subject: [PATCH] Add just enough cgi plumbing to get the "unused variable" warning to stop. --- lib/lib.h | 2 +- lib/net.c | 10 ++++++---- toys/net/httpd.c | 3 ++- toys/net/wget.c | 2 +- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/lib.h b/lib/lib.h index f27ed204..2be31469 100644 --- a/lib/lib.h +++ b/lib/lib.h @@ -352,7 +352,7 @@ char *ntop(struct sockaddr *sa); void xsendto(int sockfd, void *buf, size_t len, struct sockaddr *dest); int xrecvwait(int fd, char *buf, int len, union socksaddr *sa, int timeout); char *escape_url(char *str, char *and); -char *unescape_url(char *str); +char *unescape_url(char *str, int do_cut); // password.c int get_salt(char *salt, char * algo); diff --git a/lib/net.c b/lib/net.c index 533df286..16a110e3 100644 --- a/lib/net.c +++ b/lib/net.c @@ -197,16 +197,18 @@ char *escape_url(char *str, char *and) } // Convert %XX escapes to character (in place) -char *unescape_url(char *str) +char *unescape_url(char *str, int do_cut) { - char *to, *cut = strchr(str, '?'); + char *to, *cut = do_cut ? strchr(str, '?') : 0; int i; for (to = str;;) { if (*str!='%' || !isxdigit(str[1]) || !isxdigit(str[2])) { if (str==cut) { - *to++ = 0; - str++; + *to = 0; + cut++; + + break; } else if (!(*to++ = *str++)) break; } else { sscanf(++str, "%2x", &i); diff --git a/toys/net/httpd.c b/toys/net/httpd.c index 2460deae..3cb78421 100644 --- a/toys/net/httpd.c +++ b/toys/net/httpd.c @@ -142,9 +142,10 @@ void handle(int infd, int outfd) if (*(ss = word[1])!='/') error_time(400, "Bad Request"); while (*ss=='/') ss++; if (!*ss) ss = "./"; - else cut = unescape_url(ss); + else if ((cut = unescape_url(ss, 1))) setenv("QUERY_STRING", cut, 1); // TODO domain.com:/path/to/blah domain2.com:/path/to/that + // TODO cgi PATH_INFO /path/to/filename.cgi/and/more/stuff?path&info if (!isunder(ss, ".") || stat(ss, &st)) error_time(404, "Not Found"); else if (-1 == (fd = open(ss, O_RDONLY))) error_time(403, "Forbidden"); else if (!S_ISDIR(st.st_mode)) { diff --git a/toys/net/wget.c b/toys/net/wget.c index 2b0eacf4..1fbeaad9 100644 --- a/toys/net/wget.c +++ b/toys/net/wget.c @@ -280,7 +280,7 @@ void wget_main(void) else if (!TT.O) { ss = wget_find_header(toybuf, "Content-Disposition: attachment; filename="); if (ss) { - unescape_url(ss); + unescape_url(ss, 1); for (ii = strlen(ss); ii; ii--) { if (ss[ii]=='/') memmove(ss, ss+ii, strlen(ss+ii)); break; -- 2.39.2