We do not need the realpath. Only serve in basepath. - geomyidae - a small C-ba… | |
git clone git://git.codemadness.org/geomyidae | |
Log | |
Files | |
Refs | |
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"); |