| We do not need the realpath. Only serve in basepath. - geomyidae - A small C-ba… | |
| git clone git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfri… | |
| Log | |
| Files | |
| Refs | |
| Tags | |
| README | |
| LICENSE | |
| --- | |
| commit 9884d6e830dba5751c5363086e74b5f9a9c1691d | |
| parent cdf260787abd32506e151744c411d0e1057757d8 | |
| Author: Christoph Lohmann <[email protected]> | |
| 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, ch… | |
| char *serverp, int nocgi, int istls) | |
| { | |
| struct stat dir; | |
| - char recvc[1025], recvb[1025], path[PATH_MAX+1], rpath[PATH_MAX+1], ar… | |
| + 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, … | |
| if (strchr(recvb, '/')) | |
| goto dothegopher; | |
| if (snprintf(path, sizeof(path), "%s/%s", base, recvb) <= size… | |
| - if (realpath(path, (char *)rpath)) { | |
| - if (stat(rpath, &dir) == 0) { | |
| - if (loglvl & FILES) | |
| - logentry(clienth, clientp, rec… | |
| + if (stat(path, &dir) == 0) { | |
| + if (loglvl & FILES) | |
| + logentry(clienth, clientp, recvc, "com… | |
| - handlecgi(sock, rpath, port, base, "",… | |
| - clienth, serverh, istls, req, … | |
| - return; | |
| - } | |
| + handlecgi(sock, path, port, base, "", "", ohos… | |
| + 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] =… | |
| - >= sizeof(rpath)) { | |
| + len = strlen(path); | |
| + if (len + strlen(indexf[i]) + ((path[len-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"); |