mirror of https://github.com/omar-polo/gmid.git
use the correct document root
pass the correct loc_off to the executor, so the various variables that depends on the matched location (like DOCUMENT_ROOT) are computed correctly.
This commit is contained in:
parent
91b9f2a8f9
commit
1feaf2a618
2
ex.c
2
ex.c
|
@ -290,7 +290,7 @@ handle_imsg_cgi_req(struct imsgbuf *ibuf, struct imsg *imsg, size_t datalen)
|
||||||
if ((h = host_nth(req.host_off)) == NULL)
|
if ((h = host_nth(req.host_off)) == NULL)
|
||||||
abort();
|
abort();
|
||||||
|
|
||||||
if ((l = loc_nth(h, req.host_off)) == NULL)
|
if ((l = loc_nth(h, req.loc_off)) == NULL)
|
||||||
abort();
|
abort();
|
||||||
|
|
||||||
fd = launch_cgi(&iri, &req, h, l);
|
fd = launch_cgi(&iri, &req, h, l);
|
||||||
|
|
3
gmid.h
3
gmid.h
|
@ -245,6 +245,7 @@ struct client {
|
||||||
|
|
||||||
struct sockaddr_storage addr;
|
struct sockaddr_storage addr;
|
||||||
struct vhost *host; /* host they're talking to */
|
struct vhost *host; /* host they're talking to */
|
||||||
|
size_t loc; /* location matched */
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct client clients[MAX_USERS];
|
extern struct client clients[MAX_USERS];
|
||||||
|
@ -342,7 +343,7 @@ const char *vhost_index(struct vhost*, const char*);
|
||||||
int vhost_auto_index(struct vhost*, const char*);
|
int vhost_auto_index(struct vhost*, const char*);
|
||||||
int vhost_block_return(struct vhost*, const char*, int*, const char**);
|
int vhost_block_return(struct vhost*, const char*, int*, const char**);
|
||||||
int vhost_fastcgi(struct vhost*, const char*);
|
int vhost_fastcgi(struct vhost*, const char*);
|
||||||
int vhost_dirfd(struct vhost*, const char*);
|
int vhost_dirfd(struct vhost*, const char*, size_t*);
|
||||||
int vhost_strip(struct vhost*, const char*);
|
int vhost_strip(struct vhost*, const char*);
|
||||||
X509_STORE *vhost_require_ca(struct vhost*, const char*);
|
X509_STORE *vhost_require_ca(struct vhost*, const char*);
|
||||||
int vhost_disable_log(struct vhost*, const char*);
|
int vhost_disable_log(struct vhost*, const char*);
|
||||||
|
|
13
server.c
13
server.c
|
@ -222,20 +222,25 @@ vhost_fastcgi(struct vhost *v, const char *path)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
vhost_dirfd(struct vhost *v, const char *path)
|
vhost_dirfd(struct vhost *v, const char *path, size_t *retloc)
|
||||||
{
|
{
|
||||||
struct location *loc;
|
struct location *loc;
|
||||||
|
size_t l = 0;
|
||||||
|
|
||||||
if (v == NULL || path == NULL)
|
if (v == NULL || path == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
loc = TAILQ_FIRST(&v->locations);
|
loc = TAILQ_FIRST(&v->locations);
|
||||||
while ((loc = TAILQ_NEXT(loc, locations)) != NULL) {
|
while ((loc = TAILQ_NEXT(loc, locations)) != NULL) {
|
||||||
|
l++;
|
||||||
if (loc->dirfd != -1)
|
if (loc->dirfd != -1)
|
||||||
if (matches(loc->match, path))
|
if (matches(loc->match, path)) {
|
||||||
|
*retloc = l;
|
||||||
return loc->dirfd;
|
return loc->dirfd;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*retloc = 0;
|
||||||
loc = TAILQ_FIRST(&v->locations);
|
loc = TAILQ_FIRST(&v->locations);
|
||||||
return loc->dirfd;
|
return loc->dirfd;
|
||||||
}
|
}
|
||||||
|
@ -322,7 +327,7 @@ check_path(struct client *c, const char *path, int *fd)
|
||||||
if (*p == '\0')
|
if (*p == '\0')
|
||||||
p = ".";
|
p = ".";
|
||||||
|
|
||||||
dirfd = vhost_dirfd(c->host, path);
|
dirfd = vhost_dirfd(c->host, path, &c->loc);
|
||||||
log_debug(c, "check_path: strip=%d path=%s original=%s",
|
log_debug(c, "check_path: strip=%d path=%s original=%s",
|
||||||
strip, p, path);
|
strip, p, path);
|
||||||
flags = O_RDONLY | O_NOFOLLOW;
|
flags = O_RDONLY | O_NOFOLLOW;
|
||||||
|
@ -683,6 +688,7 @@ handle_open_conn(int fd, short ev, void *d)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (c->host->entrypoint != NULL) {
|
if (c->host->entrypoint != NULL) {
|
||||||
|
c->loc = 0;
|
||||||
start_cgi(c->host->entrypoint, c->iri.path, c);
|
start_cgi(c->host->entrypoint, c->iri.path, c);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -802,6 +808,7 @@ start_cgi(const char *spath, const char *relpath, struct client *c)
|
||||||
req.notafter = tls_peer_cert_notafter(c->ctx);
|
req.notafter = tls_peer_cert_notafter(c->ctx);
|
||||||
|
|
||||||
req.host_off = host_nth(c->host);
|
req.host_off = host_nth(c->host);
|
||||||
|
req.loc_off = c->loc;
|
||||||
|
|
||||||
imsg_compose(&exibuf, IMSG_CGI_REQ, c->id, 0, -1, &req, sizeof(req));
|
imsg_compose(&exibuf, IMSG_CGI_REQ, c->id, 0, -1, &req, sizeof(req));
|
||||||
imsg_flush(&exibuf);
|
imsg_flush(&exibuf);
|
||||||
|
|
Loading…
Reference in New Issue