iFix relative printelem with ? in name. - 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 6f22091df20685c8b7a8a89823aa31606bea2be0 /scm/geomyidae/commit/6f22091df20685c8b7a8a89823aa31606bea2be0.gph bitreich.org 70 1parent 42b52f54ede822d8e937025394d69702d5f910d3 /scm/geomyidae/commit/42b52f54ede822d8e937025394d69702d5f910d3.gph bitreich.org 70 hAuthor: Christoph Lohmann <20h@r-36.net> URL:mailto:20h@r-36.net bitreich.org 70 iDate: Sun, 4 Apr 2021 20:57:28 +0200 Err bitreich.org 70 i Err bitreich.org 70 iFix relative printelem with ? in name. Err bitreich.org 70 i Err bitreich.org 70 i* Thanks adc for reporting. Err bitreich.org 70 i Err bitreich.org 70 i* Add more comments in special selector request casing. Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M ind.c | 36 +++++++++++++++++++++----------- Err bitreich.org 70 i M main.c | 12 ++++++++++-- Err bitreich.org 70 i Err bitreich.org 70 i2 files changed, 34 insertions(+), 14 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/ind.c b/ind.c /scm/geomyidae/file/ind.c.gph bitreich.org 70 i@@ -403,8 +403,8 @@ scanfile(char *fname) Err bitreich.org 70 i int Err bitreich.org 70 i printelem(int fd, Elems *el, char *file, char *base, char *addr, char *port) Err bitreich.org 70 i { Err bitreich.org 70 i- char *path, *p, buf[PATH_MAX+1]; Err bitreich.org 70 i- int len; Err bitreich.org 70 i+ char *path, *p, *argbase, buf[PATH_MAX+1]; Err bitreich.org 70 i+ int len, blen; Err bitreich.org 70 i Err bitreich.org 70 i if (!strcmp(el->e[3], "server")) { Err bitreich.org 70 i free(el->e[3]); Err bitreich.org 70 i@@ -417,24 +417,36 @@ printelem(int fd, Elems *el, char *file, char *base, char *addr, char *port) Err bitreich.org 70 i Err bitreich.org 70 i /* Err bitreich.org 70 i * Ignore if the path is from base, if it might be some h type with Err bitreich.org 70 i- * some URL and ignore various types that have different semantics but Err bitreich.org 70 i- * to point to some file or directory. Err bitreich.org 70 i+ * some URL and ignore various types that have different semantics, Err bitreich.org 70 i+ * do not point to some file or directory. Err bitreich.org 70 i+ */ Err bitreich.org 70 i+ /* Err bitreich.org 70 i+ * FUTURE: If ever special requests with no beginning '/' are used in Err bitreich.org 70 i+ * geomyidae, this is the place to control this. Err bitreich.org 70 i */ Err bitreich.org 70 i if ((el->e[2][0] != '\0' Err bitreich.org 70 i- && el->e[2][0] != '/' Err bitreich.org 70 i- && el->e[0][0] != 'i' Err bitreich.org 70 i- && el->e[0][0] != '2' Err bitreich.org 70 i- && el->e[0][0] != '3' Err bitreich.org 70 i- && el->e[0][0] != '8' Err bitreich.org 70 i- && el->e[0][0] != 'w' Err bitreich.org 70 i- && el->e[0][0] != 'T') && Err bitreich.org 70 i+ && el->e[2][0] != '/' /* Absolute Request. */ Err bitreich.org 70 i+ && el->e[0][0] != 'i' /* Informational item. */ Err bitreich.org 70 i+ && el->e[0][0] != '2' /* CSO server */ Err bitreich.org 70 i+ && el->e[0][0] != '3' /* Error */ Err bitreich.org 70 i+ && el->e[0][0] != '8' /* Telnet */ Err bitreich.org 70 i+ && el->e[0][0] != 'w' /* Selector is direct URI. */ Err bitreich.org 70 i+ && el->e[0][0] != 'T') && /* tn3270 */ Err bitreich.org 70 i !(el->e[0][0] == 'h' && !strncmp(el->e[2], "URL:", 4))) { Err bitreich.org 70 i path = file + strlen(base); Err bitreich.org 70 i if ((p = strrchr(path, '/'))) Err bitreich.org 70 i len = p - path; Err bitreich.org 70 i else Err bitreich.org 70 i len = strlen(path); Err bitreich.org 70 i- snprintf(buf, sizeof(buf), "%s%.*s/%s", base, len, path, el->e[2]); Err bitreich.org 70 i+ Err bitreich.org 70 i+ argbase = strchr(el->e[2], '?'); Err bitreich.org 70 i+ if (argbase != NULL) Err bitreich.org 70 i+ blen = argbase - el->e[2]; Err bitreich.org 70 i+ else Err bitreich.org 70 i+ blen = strlen(el->e[2]); Err bitreich.org 70 i+ Err bitreich.org 70 i+ snprintf(buf, sizeof(buf), "%s%.*s/%.*s", base, len, Err bitreich.org 70 i+ path, blen, el->e[2]); Err bitreich.org 70 i Err bitreich.org 70 i if ((path = realpath(buf, NULL)) && Err bitreich.org 70 i !strncmp(base, path, strlen(base))) { Err bitreich.org 70 1diff --git a/main.c b/main.c /scm/geomyidae/file/main.c.gph bitreich.org 70 i@@ -177,6 +177,7 @@ handlerequest(int sock, char *req, int rlen, char *base, char *ohost, Err bitreich.org 70 i Err bitreich.org 70 i memmove(recvc, recvb, rlen+1); Err bitreich.org 70 i Err bitreich.org 70 i+ /* Redirect to HTML redirecting to the specified URI. */ Err bitreich.org 70 i if (!strncmp(recvb, "URL:", 4)) { Err bitreich.org 70 i len = snprintf(path, sizeof(path), htredir, Err bitreich.org 70 i recvb + 4, recvb + 4, recvb + 4); Err bitreich.org 70 i@@ -189,8 +190,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 /* Err bitreich.org 70 i- * Valid cases in gopher we overwrite here, but could be used for Err bitreich.org 70 i- * other geomyidae features: Err bitreich.org 70 i+ * FUTURE: Valid cases in gopher we overwrite here, but could be used Err bitreich.org 70 i+ * for other geomyidae features: Err bitreich.org 70 i * Err bitreich.org 70 i * request string = "?..." -> "/?..." Err bitreich.org 70 i * request string = "" -> "/" Err bitreich.org 70 i@@ -198,6 +199,9 @@ handlerequest(int sock, char *req, int rlen, char *base, char *ohost, Err bitreich.org 70 i * Err bitreich.org 70 i * Be careful, when you consider those special cases to be used Err bitreich.org 70 i * for some feature. You can easily do good and bad. Err bitreich.org 70 i+ * Err bitreich.org 70 i+ * Look at printelem() in ind.c for the counterpart of producing Err bitreich.org 70 i+ * selectors. Err bitreich.org 70 i */ Err bitreich.org 70 i Err bitreich.org 70 i args = strchr(recvb, '?'); Err bitreich.org 70 i@@ -209,6 +213,10 @@ handlerequest(int sock, char *req, int rlen, char *base, char *ohost, Err bitreich.org 70 i recvb[1] = '\0'; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i+ /* Err bitreich.org 70 i+ * Do not allow requests not beginning with '/' or which contain Err bitreich.org 70 i+ * "..". Err bitreich.org 70 i+ */ Err bitreich.org 70 i if (recvb[0] != '/' || strstr(recvb, "..")){ Err bitreich.org 70 i dprintf(sock, "%s", selinval); Err bitreich.org 70 i return; Err bitreich.org 70 .