SMOLNET PORTAL home about changes
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
Original URLgopher://bitreich.org/0/scm/geomyidae/commit/a291bc8c9930...
Content-Typetext/plain; charset=utf-8