We do not need the realpath. Only serve in basepath. - geomyidae - A small C-based gopherd.
git clone git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/geomyidae/
Log
Files
Refs
Tags
README
LICENSE
---
commit 9884d6e830dba5751c5363086e74b5f9a9c1691d
parent cdf260787abd32506e151744c411d0e1057757d8
Author: Christoph Lohmann <20h@r-36.net>
Date:   Wed, 23 Aug 2023 14:49:23 +0200

We do not need the realpath. Only serve in basepath.

Diffstat:
  M main.c                              |      49 +++++++++++++------------------

1 file changed, 20 insertions(+), 29 deletions(-)
---
diff --git a/main.c b/main.c
@@ -138,7 +138,7 @@ handlerequest(int sock, char *req, int rlen, char *base, char *ohost,
               char *serverp, int nocgi, int istls)
 {
         struct stat dir;
-        char recvc[1025], recvb[1025], path[PATH_MAX+1], rpath[PATH_MAX+1], args[1025],
+        char recvc[1025], recvb[1025], path[PATH_MAX+1], args[1025],
                 argsc[1025], traverse[1025], traversec[1025],
                 *sear, *sep, *recvbp, *c;
         int len = 0, fd, i, maxrecv, pathfallthrough = 0;
@@ -190,15 +190,13 @@ handlerequest(int sock, char *req, int rlen, char *base, char *ohost,
                 if (strchr(recvb, '/'))
                         goto dothegopher;
                 if (snprintf(path, sizeof(path), "%s/%s", base, recvb) <= sizeof(path)) {
-                        if (realpath(path, (char *)rpath)) {
-                                if (stat(rpath, &dir) == 0) {
-                                        if (loglvl & FILES)
-                                                logentry(clienth, clientp, recvc, "compatibility serving");
+                        if (stat(path, &dir) == 0) {
+                                if (loglvl & FILES)
+                                        logentry(clienth, clientp, recvc, "compatibility serving");
 
-                                        handlecgi(sock, rpath, port, base, "", "", ohost,
-                                                clienth, serverh, istls, req, "");
-                                        return;
-                                }
+                                handlecgi(sock, path, port, base, "", "", ohost,
+                                        clienth, serverh, istls, req, "");
+                                return;
                         }
                 }
         }
@@ -325,14 +323,7 @@ dothegopher:
                 }
         }
 
-        if (realpath(path, (char *)&rpath) == NULL) {
-                dprintf(sock, notfounderr, recvc);
-                if (loglvl & ERRORS)
-                        logentry(clienth, clientp, recvc, "not found");
-                return;
-        }
-
-        if (stat(rpath, &dir) != -1) {
+        if (stat(path, &dir) != -1) {
                 /*
                  * If sticky bit is set, only serve if this is encrypted.
                  */
@@ -348,9 +339,9 @@ dothegopher:
                 if (S_ISDIR(dir.st_mode)) {
                         for (i = 0; i < sizeof(indexf)/sizeof(indexf[0]);
                                         i++) {
-                                len = strlen(rpath);
-                                if (len + strlen(indexf[i]) + ((rpath[len-1] == '/')? 0 : 1)
-                                                >= sizeof(rpath)) {
+                                len = strlen(path);
+                                if (len + strlen(indexf[i]) + ((path[len-1] == '/')? 0 : 1)
+                                                >= sizeof(path)) {
                                         if (loglvl & ERRORS) {
                                                 logentry(clienth, clientp,
                                                         recvc,
@@ -369,18 +360,18 @@ dothegopher:
                                  * strncat of one char static char array
                                  * is an overflow.
                                  */
-                                if (rpath[len-1] != '/')
-                                        strcat(rpath, "/");
-                                strcat(rpath, indexf[i]);
-                                fd = open(rpath, O_RDONLY);
+                                if (path[len-1] != '/')
+                                        strcat(path, "/");
+                                strcat(path, indexf[i]);
+                                fd = open(path, O_RDONLY);
                                 if (fd >= 0)
                                         break;
 
                                 /* Not found. Clear path from indexf. */
-                                rpath[len] = '\0';
+                                path[len] = '\0';
                         }
                 } else {
-                        fd = open(rpath, O_RDONLY);
+                        fd = open(path, O_RDONLY);
                         if (fd < 0) {
                                 dprintf(sock, notfounderr, recvc);
                                 if (loglvl & ERRORS) {
@@ -396,9 +387,9 @@ dothegopher:
         if (fd >= 0) {
                 close(fd);
 
-                c = strrchr(rpath, '/');
+                c = strrchr(path, '/');
                 if (c == NULL)
-                        c = rpath;
+                        c = path;
                 type = gettype(c);
 
                 /*
@@ -880,7 +871,7 @@ main(int argc, char *argv[])
 
 #ifdef __OpenBSD__
         char promises[31]; /* check the size needed in the fork too */
-        snprintf(promises, sizeof(promises), "rpath inet stdio proc exec %s",
+        snprintf(promises, sizeof(promises), "inet stdio proc exec %s",
                  revlookup ? "dns" : "");
         if (pledge(promises, NULL) == -1) {
                 perror("pledge");