use fork() to get the real byte size sent when using cgi
This commit is contained in:
parent
750ca51e43
commit
62bc1d852f
38
vger.c
38
vger.c
|
@ -159,7 +159,7 @@ drop_privileges(const char *user, const char *chroot_dir, const char *cgi_dir)
|
||||||
|
|
||||||
/* promise permissions */
|
/* promise permissions */
|
||||||
if (*cgi_dir)
|
if (*cgi_dir)
|
||||||
epledge("stdio rpath exec", NULL);
|
epledge("stdio rpath exec proc", NULL);
|
||||||
else
|
else
|
||||||
epledge("stdio rpath", NULL);
|
epledge("stdio rpath", NULL);
|
||||||
#endif
|
#endif
|
||||||
|
@ -313,15 +313,41 @@ autoindex(const char *path)
|
||||||
void
|
void
|
||||||
cgi(const char *cgicmd)
|
cgi(const char *cgicmd)
|
||||||
{
|
{
|
||||||
/* TODO? cgi currently return the wrong data size unless we switch from execl to popen */
|
int fildes[2] = {0};
|
||||||
|
int retcode = 0;
|
||||||
|
pid_t pid = 0;
|
||||||
|
FILE *output = NULL;
|
||||||
|
|
||||||
/* run cgicmd replacing current process */
|
if (pipe(fildes) != 0)
|
||||||
_datasiz = -1; /* bytes sent by cgi are unknown */
|
goto cgierr;
|
||||||
execl(cgicmd, cgicmd, NULL);
|
|
||||||
|
if ((pid = fork()) < 0)
|
||||||
|
goto cgierr;
|
||||||
|
|
||||||
|
if (pid > 0) { /* parent */
|
||||||
|
close(fildes[1]); /* make sure entry is closed to get EOF */
|
||||||
|
if ((output = fdopen(fildes[0], "r")) == NULL)
|
||||||
|
goto cgierr;
|
||||||
|
|
||||||
|
_datasiz += print_file(output);
|
||||||
|
close(fildes[0]);
|
||||||
|
fclose(output);
|
||||||
|
waitpid(pid, &retcode, 0);
|
||||||
|
stop(EXIT_SUCCESS, "cgi ran with exit code %d", status);
|
||||||
|
|
||||||
|
} else { /* child */
|
||||||
|
/* set pipe output equal to stdout & stderr */
|
||||||
|
dup2(fildes[1], STDOUT_FILENO);
|
||||||
|
close(fildes[1]); /* no longer required */
|
||||||
|
execl(cgicmd, cgicmd, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
cgierr:
|
||||||
/* if execl is ok, this will never be reached */
|
/* if execl is ok, this will never be reached */
|
||||||
|
close(fildes[0]);
|
||||||
|
close(fildes[1]);
|
||||||
status(42, "error when trying run cgi");
|
status(42, "error when trying run cgi");
|
||||||
stop(EXIT_FAILURE, "error when trying to execl %s", cgicmd);
|
stop(EXIT_FAILURE, "error when trying to execl %s", cgicmd);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
char *
|
char *
|
||||||
|
|
Loading…
Reference in New Issue