1
0
mirror of https://github.com/fumiama/simple-http-server.git synced 2026-06-05 00:30:23 +08:00

fix: pipe not closed after error cgi

This commit is contained in:
源文雨
2024-06-03 00:03:26 +09:00
parent efdd929708
commit 4236f3ab9d

View File

@@ -82,7 +82,7 @@ static void serve_file(int, const char *);
static int startup(uint16_t *, int); static int startup(uint16_t *, int);
static int startupunix(char *, int); static int startupunix(char *, int);
static void unimplemented(int); static void unimplemented(int);
static void wait_pid_push(void*);
/**********************************************************************/ /**********************************************************************/
/* A request has caused a call to accept() on the server port to /* A request has caused a call to accept() on the server port to
* return. Process the request appropriately. * return. Process the request appropriately.
@@ -254,7 +254,18 @@ static void execute_cgi(tcpool_thread_timer_t *timer, int content_length, const
pid_t pid; pid_t pid;
int client = timer->accept_fd; int client = timer->accept_fd;
if(pipe(cgi_output) < 0 || pipe(cgi_input) < 0 || (pid = fork()) < 0) { if(pipe(cgi_output) < 0) {
internal_error(client);
return;
}
if(pipe(cgi_input) < 0) {
close(cgi_output[0]); close(cgi_output[1]);
internal_error(client);
return;
}
if((pid = fork()) < 0) {
close(cgi_output[0]); close(cgi_output[1]);
close(cgi_input[0]); close(cgi_input[1]);
internal_error(client); internal_error(client);
return; return;
} }
@@ -268,6 +279,9 @@ static void execute_cgi(tcpool_thread_timer_t *timer, int content_length, const
execl(request->path, request->path, request->method, request->query_string, NULL); execl(request->path, request->path, request->method, request->query_string, NULL);
exit(EXIT_FAILURE); // a success execl will never return exit(EXIT_FAILURE); // a success execl will never return
} }
pthread_cleanup_push((void (*)(void*))&close, cgi_output[0]);
pthread_cleanup_push((void (*)(void*))&close, cgi_input[1]);
pthread_cleanup_push((void (*)(void*))&wait_pid_push, pid);
/* parent */ /* parent */
is_in_cgi[timer->index] = 1; is_in_cgi[timer->index] = 1;
close(cgi_output[1]); close(cgi_output[1]);
@@ -334,9 +348,9 @@ static void execute_cgi(tcpool_thread_timer_t *timer, int content_length, const
printf("send %d bytes.\n", len); printf("send %d bytes.\n", len);
} }
CGI_CLOSE: CGI_CLOSE:
close(cgi_output[0]); pthread_cleanup_pop(1);
close(cgi_input[1]); pthread_cleanup_pop(1);
waitpid(pid, NULL, 0); pthread_cleanup_pop(1);
is_in_cgi[timer->index] = 0; is_in_cgi[timer->index] = 0;
} }
@@ -496,6 +510,10 @@ static void unimplemented(int client) {
puts("501 Method Not Implemented."); puts("501 Method Not Implemented.");
} }
static void wait_pid_push(void* pid) {
waitpid((pid_t)((uintptr_t)pid), NULL, 0);
}
#define argequ(arg) (*(uint16_t*)argv[i] == *(uint16_t*)(arg)) #define argequ(arg) (*(uint16_t*)argv[i] == *(uint16_t*)(arg))
#define USAGE "Usage:\tsimple-http-server [-d] [-h] [-n host.name.com:port] [-p <port|unix socket path>] [-q 16] [-r <rootdir>] [-u <uid>]\n -d:\trun as daemon.\n -h:\tdisplay this help.\n -n:\tcheck hostname and port.\n -p:\tif not set, we will choose a random port.\n -q:\tlisten queue length (defalut is 16).\n -r:\thttp root dir.\n -u:\trun as this uid." #define USAGE "Usage:\tsimple-http-server [-d] [-h] [-n host.name.com:port] [-p <port|unix socket path>] [-q 16] [-r <rootdir>] [-u <uid>]\n -d:\trun as daemon.\n -h:\tdisplay this help.\n -n:\tcheck hostname and port.\n -p:\tif not set, we will choose a random port.\n -q:\tlisten queue length (defalut is 16).\n -r:\thttp root dir.\n -u:\trun as this uid."
int main(int argc, char **argv) { int main(int argc, char **argv) {