iFix traversal handling, add selector and traversal to CGI environment. - geomyidae - A small C-based gopherd. Err bitreich.org 70
hgit clone git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/geomyidae/ URL:git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/geomyidae/ bitreich.org 70
1Log /scm/geomyidae/log.gph bitreich.org 70
1Files /scm/geomyidae/files.gph bitreich.org 70
1Refs /scm/geomyidae/refs.gph bitreich.org 70
1Tags /scm/geomyidae/tag bitreich.org 70
1README /scm/geomyidae/file/README.gph bitreich.org 70
1LICENSE /scm/geomyidae/file/LICENSE.gph bitreich.org 70
i--- Err bitreich.org 70
1commit a291bc8c99309fcbfd1a7688988ba60a2e5bf042 /scm/geomyidae/commit/a291bc8c99309fcbfd1a7688988ba60a2e5bf042.gph bitreich.org 70
1parent b12a77acd24fc170b1ad047986ffaf13592fb326 /scm/geomyidae/commit/b12a77acd24fc170b1ad047986ffaf13592fb326.gph bitreich.org 70
hAuthor: Christoph Lohmann <20h@r-36.net> URL:mailto:20h@r-36.net bitreich.org 70
iDate: Sat, 22 Jul 2023 15:28:45 +0200 Err bitreich.org 70
i Err bitreich.org 70
iFix traversal handling, add selector and traversal to CGI environment. Err bitreich.org 70
i Err bitreich.org 70
i* Add raw selector to CGI scripts. Err bitreich.org 70
i* Add traversal to CGI scripts. Err bitreich.org 70
i* Add both to manpages. Err bitreich.org 70
i Err bitreich.org 70
iDiffstat: Err bitreich.org 70
i M geomyidae.8 | 9 ++++++--- Err bitreich.org 70
i M handlr.c | 56 ++++++++++++++++---------------- Err bitreich.org 70
i M handlr.h | 18 +++++++++++------- Err bitreich.org 70
i M ind.c | 21 +++++---------------- Err bitreich.org 70
i M ind.h | 4 ++-- Err bitreich.org 70
i M main.c | 102 +++++++++++++++---------------- Err bitreich.org 70
i Err bitreich.org 70
i6 files changed, 102 insertions(+), 108 deletions(-) Err bitreich.org 70
i--- Err bitreich.org 70
1diff --git a/geomyidae.8 b/geomyidae.8 /scm/geomyidae/file/geomyidae.8.gph bitreich.org 70
i@@ -352,9 +352,11 @@ executable.[d]cgi $search $arguments $host $port Err bitreich.org 70
i where Err bitreich.org 70
i .Bd -literal -offset indent Err bitreich.org 70
i search = query string (type 7) or "" (type 0) Err bitreich.org 70
i-arguments = string after "?" in the path, the remaining path or "" Err bitreich.org 70
i+arguments = string behind "?" in selector or "" Err bitreich.org 70
i host = server's hostname ("localhost" by default) Err bitreich.org 70
i port = server's port ("70" by default) Err bitreich.org 70
i+traversal = remaining path from path traversal Err bitreich.org 70
i+selector = raw selector Err bitreich.org 70
i .Ed Err bitreich.org 70
i .Pp Err bitreich.org 70
i All terms are tab-separated (per gopher protocol) which can cause some Err bitreich.org 70
i@@ -377,8 +379,9 @@ GATEWAY_INTERFACE = `CGI/1.1' Err bitreich.org 70
i PATH_INFO = script which is executed Err bitreich.org 70
i PATH_TRANSLATED = absolute path with script which is executed Err bitreich.org 70
i QUERY_STRING = arguments (See above.) Err bitreich.org 70
i-SELECTOR = arguments (For backwards compatibility.) Err bitreich.org 70
i-REQUEST = arguments (For backwards compatibility.) Err bitreich.org 70
i+SELECTOR = raw selector Err bitreich.org 70
i+REQUEST = raw selector Err bitreich.org 70
i+TRAVERSAL = traversel (See above.) Err bitreich.org 70
i REMOTE_ADDR = IP of the client Err bitreich.org 70
i REMOTE_HOST = REMOTE_ADDR Err bitreich.org 70
i REQUEST_METHOD = `GET' Err bitreich.org 70
1diff --git a/handlr.c b/handlr.c /scm/geomyidae/file/handlr.c.gph bitreich.org 70
i@@ -24,7 +24,8 @@ Err bitreich.org 70
i Err bitreich.org 70
i void Err bitreich.org 70
i handledir(int sock, char *path, char *port, char *base, char *args, Err bitreich.org 70
i- char *sear, char *ohost, char *chost, char *bhost, int istls) Err bitreich.org 70
i+ char *sear, char *ohost, char *chost, char *bhost, int istls, Err bitreich.org 70
i+ char *sel, char *traverse) Err bitreich.org 70
i { Err bitreich.org 70
i char *pa, *file, *e, *par; Err bitreich.org 70
i struct dirent **dirent; Err bitreich.org 70
i@@ -35,12 +36,8 @@ handledir(int sock, char *path, char *port, char *base, char *args, Err bitreich.org 70
i USED(args); Err bitreich.org 70
i USED(sear); Err bitreich.org 70
i USED(bhost); Err bitreich.org 70
i- Err bitreich.org 70
i- printf("handledir:\n"); Err bitreich.org 70
i- printf("sock = %d; path = %s; port = %s; base = %s; args = %s;\n", Err bitreich.org 70
i- sock, path, port, base, args); Err bitreich.org 70
i- printf("sear = %s; ohost = %s; chost = %s; bhost = %s; istls = %d;\n", Err bitreich.org 70
i- sear, ohost, chost, bhost, istls); Err bitreich.org 70
i+ USED(sel); Err bitreich.org 70
i+ USED(traverse); Err bitreich.org 70
i Err bitreich.org 70
i pa = xstrdup(path); Err bitreich.org 70
i Err bitreich.org 70
i@@ -70,7 +67,6 @@ handledir(int sock, char *path, char *port, char *base, char *args, Err bitreich.org 70
i pa, Err bitreich.org 70
i pa[strlen(pa)-1] == '/'? "" : "/", Err bitreich.org 70
i dirent[i]->d_name); Err bitreich.org 70
i- printf("handledir: smprintf file = %s\n", file); Err bitreich.org 70
i if (stat(file, &st) >= 0 && S_ISDIR(st.st_mode)) Err bitreich.org 70
i type = gettype("index.gph"); Err bitreich.org 70
i ret = dprintf(sock, Err bitreich.org 70
i@@ -93,7 +89,8 @@ handledir(int sock, char *path, char *port, char *base, char *args, Err bitreich.org 70
i Err bitreich.org 70
i void Err bitreich.org 70
i handlegph(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70
i- char *sear, char *ohost, char *chost, char *bhost, int istls) Err bitreich.org 70
i+ char *sear, char *ohost, char *chost, char *bhost, int istls, Err bitreich.org 70
i+ char *sel, char *traverse) Err bitreich.org 70
i { Err bitreich.org 70
i gphindex *act; Err bitreich.org 70
i int i, ret = 0; Err bitreich.org 70
i@@ -101,12 +98,8 @@ handlegph(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70
i USED(args); Err bitreich.org 70
i USED(sear); Err bitreich.org 70
i USED(bhost); Err bitreich.org 70
i- Err bitreich.org 70
i- printf("handlegph:\n"); Err bitreich.org 70
i- printf("sock = %d; file = %s; port = %s; base = %s; args = %s;\n", Err bitreich.org 70
i- sock, file, port, base, args); Err bitreich.org 70
i- printf("sear = %s; ohost = %s; chost = %s; bhost = %s; istls = %d;\n", Err bitreich.org 70
i- sear, ohost, chost, bhost, istls); Err bitreich.org 70
i+ USED(sel); Err bitreich.org 70
i+ USED(traverse); Err bitreich.org 70
i Err bitreich.org 70
i act = gph_scanfile(file); Err bitreich.org 70
i if (act != NULL) { Err bitreich.org 70
i@@ -124,7 +117,8 @@ handlegph(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70
i Err bitreich.org 70
i void Err bitreich.org 70
i handlebin(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70
i- char *sear, char *ohost, char *chost, char *bhost, int istls) Err bitreich.org 70
i+ char *sear, char *ohost, char *chost, char *bhost, int istls, Err bitreich.org 70
i+ char *sel, char *traverse) Err bitreich.org 70
i { Err bitreich.org 70
i int fd; Err bitreich.org 70
i Err bitreich.org 70
i@@ -134,6 +128,8 @@ handlebin(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70
i USED(sear); Err bitreich.org 70
i USED(ohost); Err bitreich.org 70
i USED(bhost); Err bitreich.org 70
i+ USED(sel); Err bitreich.org 70
i+ USED(traverse); Err bitreich.org 70
i Err bitreich.org 70
i fd = open(file, O_RDONLY); Err bitreich.org 70
i if (fd >= 0) { Err bitreich.org 70
i@@ -145,9 +141,10 @@ handlebin(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70
i Err bitreich.org 70
i void Err bitreich.org 70
i handlecgi(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70
i- char *sear, char *ohost, char *chost, char *bhost, int istls) Err bitreich.org 70
i+ char *sear, char *ohost, char *chost, char *bhost, int istls, Err bitreich.org 70
i+ char *sel, char *traverse) Err bitreich.org 70
i { Err bitreich.org 70
i- char *script, *path; Err bitreich.org 70
i+ char *script, *path, *filec; Err bitreich.org 70
i Err bitreich.org 70
i USED(base); Err bitreich.org 70
i USED(port); Err bitreich.org 70
i@@ -157,9 +154,10 @@ handlecgi(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70
i sock, file, port, base, args); Err bitreich.org 70
i printf("sear = %s; ohost = %s; chost = %s; bhost = %s; istls = %d;\n", Err bitreich.org 70
i sear, ohost, chost, bhost, istls); Err bitreich.org 70
i+ printf("sel = %s; traverse = %s;\n", sel, traverse); Err bitreich.org 70
i Err bitreich.org 70
i- path = xstrdup(file); Err bitreich.org 70
i- path = dirname(path); Err bitreich.org 70
i+ filec = xstrdup(file); Err bitreich.org 70
i+ path = dirname(filec); Err bitreich.org 70
i script = path + strlen(path) + 1; Err bitreich.org 70
i printf("path = %s\n", path); Err bitreich.org 70
i printf("script = %s\n", script); Err bitreich.org 70
i@@ -180,7 +178,7 @@ handlecgi(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i setcgienviron(script, file, port, base, args, sear, ohost, chost, Err bitreich.org 70
i- bhost, istls); Err bitreich.org 70
i+ bhost, istls, sel, traverse); Err bitreich.org 70
i Err bitreich.org 70
i if (execl(file, script, sear, args, ohost, port, Err bitreich.org 70
i (char *)NULL) == -1) { Err bitreich.org 70
i@@ -192,17 +190,18 @@ handlecgi(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70
i break; Err bitreich.org 70
i default: Err bitreich.org 70
i wait(NULL); Err bitreich.org 70
i- free(path); Err bitreich.org 70
i+ free(filec); Err bitreich.org 70
i break; Err bitreich.org 70
i } Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i void Err bitreich.org 70
i handledcgi(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70
i- char *sear, char *ohost, char *chost, char *bhost, int istls) Err bitreich.org 70
i+ char *sear, char *ohost, char *chost, char *bhost, int istls, Err bitreich.org 70
i+ char *sel, char *traverse) Err bitreich.org 70
i { Err bitreich.org 70
i FILE *fp; Err bitreich.org 70
i- char *script, *path, *ln = NULL; Err bitreich.org 70
i+ char *script, *path, *filec, *ln = NULL; Err bitreich.org 70
i size_t linesiz = 0; Err bitreich.org 70
i ssize_t n; Err bitreich.org 70
i int outsocks[2], ret = 0; Err bitreich.org 70
i@@ -213,12 +212,13 @@ handledcgi(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70
i sock, file, port, base, args); Err bitreich.org 70
i printf("sear = %s; ohost = %s; chost = %s; bhost = %s; istls = %d;\n", Err bitreich.org 70
i sear, ohost, chost, bhost, istls); Err bitreich.org 70
i+ printf("sel = %s; traverse = %s;\n", sel, traverse); Err bitreich.org 70
i Err bitreich.org 70
i if (socketpair(AF_LOCAL, SOCK_STREAM, 0, outsocks) < 0) Err bitreich.org 70
i return; Err bitreich.org 70
i Err bitreich.org 70
i- path = xstrdup(file); Err bitreich.org 70
i- path = dirname(path); Err bitreich.org 70
i+ filec = xstrdup(file); Err bitreich.org 70
i+ path = dirname(filec); Err bitreich.org 70
i script = path + strlen(path) + 1; Err bitreich.org 70
i Err bitreich.org 70
i if (sear == NULL) Err bitreich.org 70
i@@ -238,7 +238,7 @@ handledcgi(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i setcgienviron(script, file, port, base, args, sear, ohost, chost, Err bitreich.org 70
i- bhost, istls); Err bitreich.org 70
i+ bhost, istls, sel, traverse); Err bitreich.org 70
i Err bitreich.org 70
i if (execl(file, script, sear, args, ohost, port, Err bitreich.org 70
i (char *)NULL) == -1) { Err bitreich.org 70
i@@ -277,7 +277,7 @@ handledcgi(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70
i free(ln); Err bitreich.org 70
i fclose(fp); Err bitreich.org 70
i wait(NULL); Err bitreich.org 70
i- free(path); Err bitreich.org 70
i+ free(filec); Err bitreich.org 70
i break; Err bitreich.org 70
i } Err bitreich.org 70
i } Err bitreich.org 70
1diff --git a/handlr.h b/handlr.h /scm/geomyidae/file/handlr.h.gph bitreich.org 70
i@@ -23,7 +23,7 @@ Err bitreich.org 70
i * base .... base path of geomyidae, never ends in '/', so chroot is '' Err bitreich.org 70
i * Sample: /var/gopher Err bitreich.org 70
i * args .... Gives all variable input from the selector in some way. Err bitreich.org 70
i- * Sample: /with/dirs////?key=value Err bitreich.org 70
i+ * Sample: key=value Err bitreich.org 70
i * sear .... search part of request Err bitreich.org 70
i * Sample: search what? Err bitreich.org 70
i * ohost ... host of geomyidae (See -h in geomyidae(8)) Err bitreich.org 70
i@@ -34,25 +34,29 @@ Err bitreich.org 70
i * Sample: 78.46.175.99 Err bitreich.org 70
i * istls ... set to 1, if TLS was used for thr request Err bitreich.org 70
i * Sample: 1 Err bitreich.org 70
i+ * sel ..... Gives the raw selector after processing. Err bitreich.org 70
i+ * Sample: /get/some/script/with/dirs////?key=value Err bitreich.org 70
i+ * traversal ..... Gives the raw selector after processing. Err bitreich.org 70
i+ * Sample: /with/dirs//// Err bitreich.org 70
i */ Err bitreich.org 70
i Err bitreich.org 70
i void handledir(int sock, char *path, char *port, char *base, char *args, Err bitreich.org 70
i char *sear, char *ohost, char *chost, char *bhost, Err bitreich.org 70
i- int istls); Err bitreich.org 70
i+ int istls, char *sel, char *traverse); Err bitreich.org 70
i void handlegph(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70
i char *sear, char *ohost, char *chost, char *bhost, Err bitreich.org 70
i- int istls); Err bitreich.org 70
i+ int istls, char *sel, char *traverse); Err bitreich.org 70
i void handlebin(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70
i char *sear, char *ohost, char *chost, char *bhost, Err bitreich.org 70
i- int istls); Err bitreich.org 70
i+ int istls, char *sel, char *traverse); Err bitreich.org 70
i void handletxt(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70
i char *sear, char *ohost, char *chost, char *bhost, Err bitreich.org 70
i- int istls); Err bitreich.org 70
i+ int istls, char *sel, char *traverse); Err bitreich.org 70
i void handlecgi(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70
i char *sear, char *ohost, char *chost, char *bhost, Err bitreich.org 70
i- int istls); Err bitreich.org 70
i+ int istls, char *sel, char *traverse); Err bitreich.org 70
i void handledcgi(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70
i char *sear, char *ohost, char *chost, char *bhost, Err bitreich.org 70
i- int istls); Err bitreich.org 70
i+ int istls, char *sel, char *traverse); Err bitreich.org 70
i Err bitreich.org 70
i #endif Err bitreich.org 70
1diff --git a/ind.c b/ind.c /scm/geomyidae/file/ind.c.gph bitreich.org 70
i@@ -535,7 +535,8 @@ reverselookup(char *host) Err bitreich.org 70
i Err bitreich.org 70
i void Err bitreich.org 70
i setcgienviron(char *file, char *path, char *port, char *base, char *args, Err bitreich.org 70
i- char *sear, char *ohost, char *chost, char *bhost, int istls) Err bitreich.org 70
i+ char *sear, char *ohost, char *chost, char *bhost, int istls, Err bitreich.org 70
i+ char *sel, char *traverse) Err bitreich.org 70
i { Err bitreich.org 70
i /* Err bitreich.org 70
i * TODO: Clean environment from possible unsafe environment variables. Err bitreich.org 70
i@@ -547,26 +548,19 @@ setcgienviron(char *file, char *path, char *port, char *base, char *args, Err bitreich.org 70
i setenv("GATEWAY_INTERFACE", "CGI/1.1", 1); Err bitreich.org 70
i /* TODO: Separate, if run like rest.dcgi. */ Err bitreich.org 70
i setenv("PATH_INFO", file, 1); Err bitreich.org 70
i- printf("PATH_INFO = %s\n", file); Err bitreich.org 70
i setenv("PATH_TRANSLATED", path, 1); Err bitreich.org 70
i- printf("PATH_TRANSLATED = %s\n", path); Err bitreich.org 70
i Err bitreich.org 70
i setenv("QUERY_STRING", args, 1); Err bitreich.org 70
i- printf("QUERY_STRING = %s\n", args); Err bitreich.org 70
i- /* legacy compatibility */ Err bitreich.org 70
i- setenv("SELECTOR", args, 1); Err bitreich.org 70
i- printf("SELECTOR = %s\n", args); Err bitreich.org 70
i- setenv("REQUEST", args, 1); Err bitreich.org 70
i- printf("REQUEST = %s\n", args); Err bitreich.org 70
i+ setenv("SELECTOR", sel, 1); Err bitreich.org 70
i+ setenv("REQUEST", sel, 1); Err bitreich.org 70
i+ setenv("TRAVERSAL", traverse, 1); Err bitreich.org 70
i Err bitreich.org 70
i setenv("REMOTE_ADDR", chost, 1); Err bitreich.org 70
i- printf("REMOTE_ADDR = %s\n", chost); Err bitreich.org 70
i /* Err bitreich.org 70
i * Don't do a reverse lookup on every call. Only do when needed, in Err bitreich.org 70
i * the script. The RFC allows us to set the IP to the value. Err bitreich.org 70
i */ Err bitreich.org 70
i setenv("REMOTE_HOST", chost, 1); Err bitreich.org 70
i- printf("REMOTE_HOST = %s\n", chost); Err bitreich.org 70
i /* Please do not implement identd here. */ Err bitreich.org 70
i unsetenv("REMOTE_IDENT"); Err bitreich.org 70
i unsetenv("REMOTE_USER"); Err bitreich.org 70
i@@ -578,12 +572,9 @@ setcgienviron(char *file, char *path, char *port, char *base, char *args, Err bitreich.org 70
i */ Err bitreich.org 70
i setenv("REQUEST_METHOD", "GET", 1); Err bitreich.org 70
i setenv("SCRIPT_NAME", file, 1); Err bitreich.org 70
i- printf("SCRIPT_NAME = %s\n", file); Err bitreich.org 70
i setenv("SERVER_NAME", ohost, 1); Err bitreich.org 70
i- printf("SERVER_PORT = %s\n", port); Err bitreich.org 70
i setenv("SERVER_PORT", port, 1); Err bitreich.org 70
i setenv("SERVER_LISTEN_NAME", bhost, 1); Err bitreich.org 70
i- printf("SERVER_LISTEN_NAME = %s\n", bhost); Err bitreich.org 70
i if (istls) { Err bitreich.org 70
i setenv("SERVER_PROTOCOL", "gophers/1.0", 1); Err bitreich.org 70
i } else { Err bitreich.org 70
i@@ -592,10 +583,8 @@ setcgienviron(char *file, char *path, char *port, char *base, char *args, Err bitreich.org 70
i setenv("SERVER_SOFTWARE", "geomyidae", 1); Err bitreich.org 70
i Err bitreich.org 70
i setenv("X_GOPHER_SEARCH", sear, 1); Err bitreich.org 70
i- printf("X_GOPHER_SEARCH = %s\n", sear); Err bitreich.org 70
i /* legacy compatibility */ Err bitreich.org 70
i setenv("SEARCHREQUEST", sear, 1); Err bitreich.org 70
i- printf("SEARCHREQUEST = %s\n", sear); Err bitreich.org 70
i Err bitreich.org 70
i if (istls) { Err bitreich.org 70
i setenv("GOPHERS", "on", 1); Err bitreich.org 70
1diff --git a/ind.h b/ind.h /scm/geomyidae/file/ind.h.gph bitreich.org 70
i@@ -15,7 +15,7 @@ struct filetype { Err bitreich.org 70
i char *end; Err bitreich.org 70
i char *type; Err bitreich.org 70
i void (* f)(int, char *, char *, char *, char *, char *, char *, Err bitreich.org 70
i- char *, char *, int); Err bitreich.org 70
i+ char *, char *, int, char *, char *); Err bitreich.org 70
i }; Err bitreich.org 70
i Err bitreich.org 70
i filetype *gettype(char *filename); Err bitreich.org 70
i@@ -51,7 +51,7 @@ char *smprintf(char *fmt, ...); Err bitreich.org 70
i char *reverselookup(char *host); Err bitreich.org 70
i void setcgienviron(char *file, char *path, char *port, char *base, Err bitreich.org 70
i char *args, char *sear, char *ohost, char *chost, Err bitreich.org 70
i- char *bhost, int istls); Err bitreich.org 70
i+ char *bhost, int istls, char *sel, char *traverse); Err bitreich.org 70
i char *humansize(off_t n); Err bitreich.org 70
i char *humantime(const time_t *clock); Err bitreich.org 70
i Err bitreich.org 70
1diff --git a/main.c b/main.c /scm/geomyidae/file/main.c.gph bitreich.org 70
i@@ -137,8 +137,9 @@ handlerequest(int sock, char *req, int rlen, char *base, char *ohost, Err bitreich.org 70
i char *serverp, int nocgi, int istls) Err bitreich.org 70
i { Err bitreich.org 70
i struct stat dir; Err bitreich.org 70
i- char recvc[1025], recvb[1025], path[1025], args[1025], argsc[1025], Err bitreich.org 70
i- *sear, *c, *sep, *recvbp; Err bitreich.org 70
i+ char recvc[1025], recvb[1025], path[PATH_MAX+1], rpath[PATH_MAX+1], args[1025], Err bitreich.org 70
i+ argsc[1025], traverse[1025], traversec[1025], Err bitreich.org 70
i+ *sear, *sep, *recvbp, *c; Err bitreich.org 70
i int len = 0, fd, i, maxrecv, pathfallthrough = 0; Err bitreich.org 70
i filetype *type; Err bitreich.org 70
i Err bitreich.org 70
i@@ -172,6 +173,7 @@ handlerequest(int sock, char *req, int rlen, char *base, char *ohost, Err bitreich.org 70
i memset(recvc, 0, sizeof(recvc)); Err bitreich.org 70
i memset(args, 0, sizeof(args)); Err bitreich.org 70
i memset(argsc, 0, sizeof(argsc)); Err bitreich.org 70
i+ memset(traverse, 0, sizeof(argsc)); Err bitreich.org 70
i Err bitreich.org 70
i maxrecv = sizeof(recvb) - 1; Err bitreich.org 70
i if (rlen > maxrecv || rlen < 0) Err bitreich.org 70
i@@ -241,18 +243,19 @@ handlerequest(int sock, char *req, int rlen, char *base, char *ohost, Err bitreich.org 70
i c = strchr(recvb, '?'); Err bitreich.org 70
i if (c != NULL) { Err bitreich.org 70
i *c++ = '\0'; Err bitreich.org 70
i- snprintf(args, sizeof(args), "?%s", c); Err bitreich.org 70
i+ snprintf(args, sizeof(args), "%s", c); Err bitreich.org 70
i } Err bitreich.org 70
i printf("args = %s\n", args); Err bitreich.org 70
i printf("recvb = %s\n", recvb); Err bitreich.org 70
i Err bitreich.org 70
i /* Strip '/' at the end of the request. */ Err bitreich.org 70
i for (c = recvb + strlen(recvb) - 1; c >= recvb && c[0] == '/'; c--) { Err bitreich.org 70
i- /* Prepend to args. */ Err bitreich.org 70
i- snprintf(args, sizeof(args), "/%s", args); Err bitreich.org 70
i+ memmove(traversec, traverse, strlen(traverse)); Err bitreich.org 70
i+ /* Prepend to traverse. */ Err bitreich.org 70
i+ snprintf(traverse, sizeof(traverse), "/%s", traversec); Err bitreich.org 70
i c[0] = '\0'; Err bitreich.org 70
i } Err bitreich.org 70
i- printf("args = %s\n", args); Err bitreich.org 70
i+ printf("traverse = %s\n", traverse); Err bitreich.org 70
i Err bitreich.org 70
i /* Do not allow requests including "..". */ Err bitreich.org 70
i if (strstr(recvb, "..")) { Err bitreich.org 70
i@@ -284,8 +287,7 @@ handlerequest(int sock, char *req, int rlen, char *base, char *ohost, Err bitreich.org 70
i * $args = $rest_of_path + "?" + $args Err bitreich.org 70
i */ Err bitreich.org 70
i if (stat(path, &dir) == -1) { Err bitreich.org 70
i- printf("Not found. Try backtraversal.\n"); Err bitreich.org 70
i- memmove(argsc, args, strlen(args)); Err bitreich.org 70
i+ memmove(traversec, traverse, strlen(traverse)); Err bitreich.org 70
i snprintf(path, sizeof(path), "%s", base); Err bitreich.org 70
i recvbp = recvb; Err bitreich.org 70
i Err bitreich.org 70
i@@ -295,44 +297,42 @@ handlerequest(int sock, char *req, int rlen, char *base, char *ohost, Err bitreich.org 70
i * etc. Err bitreich.org 70
i */ Err bitreich.org 70
i while (recvbp != NULL) { Err bitreich.org 70
i- /* Traverse multiple / in selector. */ Err bitreich.org 70
i- for (sep = recvbp; sep != recvbp && sep != recvbp+1; Err bitreich.org 70
i- sep = strsep(&recvbp, "/")); Err bitreich.org 70
i- printf("traversal directory = %s\n", sep); Err bitreich.org 70
i+ /* Traverse multiple empty / in selector. */ Err bitreich.org 70
i+ while(recvbp[0] == '/') Err bitreich.org 70
i+ recvbp++; Err bitreich.org 70
i+ sep = strchr(recvbp, '/'); Err bitreich.org 70
i+ if (sep != NULL) Err bitreich.org 70
i+ *sep++ = '\0'; Err bitreich.org 70
i Err bitreich.org 70
i- /* Append found directory to path. */ Err bitreich.org 70
i snprintf(path+strlen(path), sizeof(path)-strlen(path), Err bitreich.org 70
i- "/%s", sep); Err bitreich.org 70
i+ "/%s", recvbp); Err bitreich.org 70
i /* path is now always at least '/' */ Err bitreich.org 70
i- printf("full traversal path = %s\n", path); Err bitreich.org 70
i- Err bitreich.org 70
i if (stat(path, &dir) == -1) { Err bitreich.org 70
i- /* Err bitreich.org 70
i- * Current try was not found. Go back one Err bitreich.org 70
i- * step and finish. Err bitreich.org 70
i- */ Err bitreich.org 70
i- c = strrchr(path, '/'); Err bitreich.org 70
i- if (c != NULL) { Err bitreich.org 70
i- *c++ = '\0'; Err bitreich.org 70
i- snprintf(args, sizeof(args), Err bitreich.org 70
i- "/%s%s%s%s", Err bitreich.org 70
i- c, Err bitreich.org 70
i- (recvbp != NULL)? "/" : "", Err bitreich.org 70
i- (recvbp != NULL)? recvbp : "", Err bitreich.org 70
i- (argsc[0] != '\0')? argsc : "" Err bitreich.org 70
i- ); Err bitreich.org 70
i- printf("args = %s\n", args); Err bitreich.org 70
i- } Err bitreich.org 70
i+ path[strlen(path)-strlen(recvbp)-1] = '\0'; Err bitreich.org 70
i+ snprintf(traverse, sizeof(traverse), Err bitreich.org 70
i+ "/%s%s%s%s", Err bitreich.org 70
i+ recvbp, Err bitreich.org 70
i+ (sep != NULL)? "/" : "", Err bitreich.org 70
i+ (sep != NULL)? sep : "", Err bitreich.org 70
i+ (traversec[0] != '\0')? traversec : "" Err bitreich.org 70
i+ ); Err bitreich.org 70
i /* path fallthrough */ Err bitreich.org 70
i pathfallthrough = 1; Err bitreich.org 70
i printf("pathfallthrough = 1\n"); Err bitreich.org 70
i break; Err bitreich.org 70
i } Err bitreich.org 70
i+ /* Append found directory to path. */ Err bitreich.org 70
i+ recvbp = sep; Err bitreich.org 70
i } Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i- printf("path = %s\n", path); Err bitreich.org 70
i- if (stat(path, &dir) != -1) { Err bitreich.org 70
i+ if (realpath(path, (char *)&rpath) == NULL) { Err bitreich.org 70
i+ dprintf(sock, notfounderr, recvc); Err bitreich.org 70
i+ if (loglvl & ERRORS) Err bitreich.org 70
i+ logentry(clienth, clientp, recvc, "not found"); Err bitreich.org 70
i+ } Err bitreich.org 70
i+ printf("rpath = %s\n", rpath); Err bitreich.org 70
i+ if (stat(rpath, &dir) != -1) { Err bitreich.org 70
i /* Err bitreich.org 70
i * If sticky bit is set, only serve if this is encrypted. Err bitreich.org 70
i */ Err bitreich.org 70
i@@ -349,9 +349,9 @@ handlerequest(int sock, char *req, int rlen, char *base, char *ohost, Err bitreich.org 70
i printf("S_ISDIR\n"); Err bitreich.org 70
i for (i = 0; i < sizeof(indexf)/sizeof(indexf[0]); Err bitreich.org 70
i i++) { Err bitreich.org 70
i- len = strlen(path); Err bitreich.org 70
i- if (len + strlen(indexf[i]) + (path[len-1] == '/')? 0 : 1 Err bitreich.org 70
i- >= sizeof(path)) { Err bitreich.org 70
i+ len = strlen(rpath); Err bitreich.org 70
i+ if (len + strlen(indexf[i]) + (rpath[len-1] == '/')? 0 : 1 Err bitreich.org 70
i+ >= sizeof(rpath)) { Err bitreich.org 70
i if (loglvl & ERRORS) { Err bitreich.org 70
i logentry(clienth, clientp, Err bitreich.org 70
i recvc, Err bitreich.org 70
i@@ -359,21 +359,19 @@ handlerequest(int sock, char *req, int rlen, char *base, char *ohost, Err bitreich.org 70
i } Err bitreich.org 70
i return; Err bitreich.org 70
i } Err bitreich.org 70
i- sprintf(path, "%s%s%s", Err bitreich.org 70
i- path, Err bitreich.org 70
i- (path[len-1] == '/')? "" : "/", Err bitreich.org 70
i- indexf[i]); Err bitreich.org 70
i- printf("path index = %s\n", path); Err bitreich.org 70
i- fd = open(path, O_RDONLY); Err bitreich.org 70
i+ if (rpath[len-1] != '/') Err bitreich.org 70
i+ strcat(rpath, "/"); Err bitreich.org 70
i+ strcat(rpath, indexf[i]); Err bitreich.org 70
i+ printf("path index = %s\n", rpath); Err bitreich.org 70
i+ fd = open(rpath, O_RDONLY); Err bitreich.org 70
i if (fd >= 0) Err bitreich.org 70
i break; Err bitreich.org 70
i Err bitreich.org 70
i /* Not found. Clear path from indexf. */ Err bitreich.org 70
i- printf("len = %d\n", len); Err bitreich.org 70
i- path[len] = '\0'; Err bitreich.org 70
i+ rpath[len] = '\0'; Err bitreich.org 70
i } Err bitreich.org 70
i } else { Err bitreich.org 70
i- fd = open(path, O_RDONLY); Err bitreich.org 70
i+ fd = open(rpath, O_RDONLY); Err bitreich.org 70
i if (fd < 0) { Err bitreich.org 70
i dprintf(sock, notfounderr, recvc); Err bitreich.org 70
i if (loglvl & ERRORS) { Err bitreich.org 70
i@@ -389,9 +387,9 @@ handlerequest(int sock, char *req, int rlen, char *base, char *ohost, Err bitreich.org 70
i if (fd >= 0) { Err bitreich.org 70
i close(fd); Err bitreich.org 70
i Err bitreich.org 70
i- c = strrchr(path, '/'); Err bitreich.org 70
i+ c = strrchr(rpath, '/'); Err bitreich.org 70
i if (c == NULL) Err bitreich.org 70
i- c = path; Err bitreich.org 70
i+ c = rpath; Err bitreich.org 70
i type = gettype(c); Err bitreich.org 70
i Err bitreich.org 70
i /* Err bitreich.org 70
i@@ -416,8 +414,8 @@ handlerequest(int sock, char *req, int rlen, char *base, char *ohost, Err bitreich.org 70
i if (loglvl & FILES) Err bitreich.org 70
i logentry(clienth, clientp, recvc, "serving"); Err bitreich.org 70
i Err bitreich.org 70
i- type->f(sock, path, port, base, args, sear, ohost, Err bitreich.org 70
i- clienth, serverh, istls); Err bitreich.org 70
i+ type->f(sock, rpath, port, base, args, sear, ohost, Err bitreich.org 70
i+ clienth, serverh, istls, recvc, traverse); Err bitreich.org 70
i } Err bitreich.org 70
i } else { Err bitreich.org 70
i if (pathfallthrough && S_ISDIR(dir.st_mode)) { Err bitreich.org 70
i@@ -429,8 +427,8 @@ handlerequest(int sock, char *req, int rlen, char *base, char *ohost, Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i if (!pathfallthrough && S_ISDIR(dir.st_mode)) { Err bitreich.org 70
i- handledir(sock, path, port, base, args, sear, ohost, Err bitreich.org 70
i- clienth, serverh, istls); Err bitreich.org 70
i+ handledir(sock, rpath, port, base, args, sear, ohost, Err bitreich.org 70
i+ clienth, serverh, istls, recvc, traverse); Err bitreich.org 70
i if (loglvl & DIRS) { Err bitreich.org 70
i logentry(clienth, clientp, recvc, Err bitreich.org 70
i "dir listing"); Err bitreich.org 70
.
Response:
text/plain