iWe do not need the realpath. Only serve in basepath. - 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 9884d6e830dba5751c5363086e74b5f9a9c1691d /scm/geomyidae/commit/9884d6e830dba5751c5363086e74b5f9a9c1691d.gph bitreich.org 70 1parent cdf260787abd32506e151744c411d0e1057757d8 /scm/geomyidae/commit/cdf260787abd32506e151744c411d0e1057757d8.gph bitreich.org 70 hAuthor: Christoph Lohmann <20h@r-36.net> URL:mailto:20h@r-36.net bitreich.org 70 iDate: Wed, 23 Aug 2023 14:49:23 +0200 Err bitreich.org 70 i Err bitreich.org 70 iWe do not need the realpath. Only serve in basepath. Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M main.c | 49 +++++++++++++------------------ Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 20 insertions(+), 29 deletions(-) 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@@ -138,7 +138,7 @@ 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[PATH_MAX+1], rpath[PATH_MAX+1], args[1025], Err bitreich.org 70 i+ char recvc[1025], recvb[1025], path[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@@ -190,15 +190,13 @@ handlerequest(int sock, char *req, int rlen, char *base, char *ohost, Err bitreich.org 70 i if (strchr(recvb, '/')) Err bitreich.org 70 i goto dothegopher; Err bitreich.org 70 i if (snprintf(path, sizeof(path), "%s/%s", base, recvb) <= sizeof(path)) { Err bitreich.org 70 i- if (realpath(path, (char *)rpath)) { Err bitreich.org 70 i- if (stat(rpath, &dir) == 0) { Err bitreich.org 70 i- if (loglvl & FILES) Err bitreich.org 70 i- logentry(clienth, clientp, recvc, "compatibility serving"); Err bitreich.org 70 i+ if (stat(path, &dir) == 0) { Err bitreich.org 70 i+ if (loglvl & FILES) Err bitreich.org 70 i+ logentry(clienth, clientp, recvc, "compatibility serving"); Err bitreich.org 70 i Err bitreich.org 70 i- handlecgi(sock, rpath, port, base, "", "", ohost, Err bitreich.org 70 i- clienth, serverh, istls, req, ""); Err bitreich.org 70 i- return; Err bitreich.org 70 i- } Err bitreich.org 70 i+ handlecgi(sock, path, port, base, "", "", ohost, Err bitreich.org 70 i+ clienth, serverh, istls, req, ""); Err bitreich.org 70 i+ return; Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i@@ -325,14 +323,7 @@ dothegopher: Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i 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- return; Err bitreich.org 70 i- } Err bitreich.org 70 i- Err bitreich.org 70 i- if (stat(rpath, &dir) != -1) { Err bitreich.org 70 i+ if (stat(path, &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@@ -348,9 +339,9 @@ dothegopher: Err bitreich.org 70 i if (S_ISDIR(dir.st_mode)) { 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(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+ 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 if (loglvl & ERRORS) { Err bitreich.org 70 i logentry(clienth, clientp, Err bitreich.org 70 i recvc, Err bitreich.org 70 i@@ -369,18 +360,18 @@ dothegopher: Err bitreich.org 70 i * strncat of one char static char array Err bitreich.org 70 i * is an overflow. Err bitreich.org 70 i */ 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- fd = open(rpath, O_RDONLY); Err bitreich.org 70 i+ if (path[len-1] != '/') Err bitreich.org 70 i+ strcat(path, "/"); Err bitreich.org 70 i+ strcat(path, indexf[i]); Err bitreich.org 70 i+ fd = open(path, 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- rpath[len] = '\0'; Err bitreich.org 70 i+ path[len] = '\0'; Err bitreich.org 70 i } Err bitreich.org 70 i } else { Err bitreich.org 70 i- fd = open(rpath, O_RDONLY); Err bitreich.org 70 i+ fd = open(path, 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@@ -396,9 +387,9 @@ dothegopher: 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(rpath, '/'); Err bitreich.org 70 i+ c = strrchr(path, '/'); Err bitreich.org 70 i if (c == NULL) Err bitreich.org 70 i- c = rpath; Err bitreich.org 70 i+ c = path; Err bitreich.org 70 i type = gettype(c); Err bitreich.org 70 i Err bitreich.org 70 i /* Err bitreich.org 70 i@@ -880,7 +871,7 @@ main(int argc, char *argv[]) Err bitreich.org 70 i Err bitreich.org 70 i #ifdef __OpenBSD__ Err bitreich.org 70 i char promises[31]; /* check the size needed in the fork too */ Err bitreich.org 70 i- snprintf(promises, sizeof(promises), "rpath inet stdio proc exec %s", Err bitreich.org 70 i+ snprintf(promises, sizeof(promises), "inet stdio proc exec %s", Err bitreich.org 70 i revlookup ? "dns" : ""); Err bitreich.org 70 i if (pledge(promises, NULL) == -1) { Err bitreich.org 70 i perror("pledge"); Err bitreich.org 70 .