mirror of
https://github.com/cesanta/mongoose.git
synced 2026-11-06 15:51:25 +00:00
Fix bug when network conn is closed before CGI
NULL out cgi_nc->user_data so it doesn't touch nc anymore. PUBLISHED_FROM=de2f76981c377d8951fb8e18e8b3d41dbfcf38b1
This commit is contained in:
1 parent
27a9a62843
commit
a8b74a9021
1 file changed
+13
-7
+13
-7
@@ -8461,6 +8461,8 @@ void mg_register_http_endpoint(struct mg_connection *nc, const char *uri_path,
|
|||||||
#define MG_ENV_EXPORT_TO_CGI "MONGOOSE_CGI"
|
#define MG_ENV_EXPORT_TO_CGI "MONGOOSE_CGI"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define MG_F_HTTP_CGI_PARSE_HEADERS MG_F_USER_1
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This structure helps to create an environment for the spawned CGI program.
|
* This structure helps to create an environment for the spawned CGI program.
|
||||||
* Environment is an array of "VARIABLE=VALUE\0" ASCIIZ strings,
|
* Environment is an array of "VARIABLE=VALUE\0" ASCIIZ strings,
|
||||||
@@ -8826,6 +8828,7 @@ static void mg_cgi_ev_handler(struct mg_connection *cgi_nc, int ev,
|
|||||||
(void) ev_data;
|
(void) ev_data;
|
||||||
|
|
||||||
if (nc == NULL) {
|
if (nc == NULL) {
|
||||||
|
/* The corresponding network connection was closed. */
|
||||||
cgi_nc->flags |= MG_F_CLOSE_IMMEDIATELY;
|
cgi_nc->flags |= MG_F_CLOSE_IMMEDIATELY;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -8845,7 +8848,7 @@ static void mg_cgi_ev_handler(struct mg_connection *cgi_nc, int ev,
|
|||||||
* been received, send appropriate reply line, and forward all
|
* been received, send appropriate reply line, and forward all
|
||||||
* received headers to the client.
|
* received headers to the client.
|
||||||
*/
|
*/
|
||||||
if (nc->flags & MG_F_USER_1) {
|
if (nc->flags & MG_F_HTTP_CGI_PARSE_HEADERS) {
|
||||||
struct mbuf *io = &cgi_nc->recv_mbuf;
|
struct mbuf *io = &cgi_nc->recv_mbuf;
|
||||||
int len = mg_http_get_request_len(io->buf, io->len);
|
int len = mg_http_get_request_len(io->buf, io->len);
|
||||||
|
|
||||||
@@ -8865,13 +8868,14 @@ static void mg_cgi_ev_handler(struct mg_connection *cgi_nc, int ev,
|
|||||||
mg_printf(nc, "%s", "HTTP/1.1 200 OK\r\n");
|
mg_printf(nc, "%s", "HTTP/1.1 200 OK\r\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
nc->flags &= ~MG_F_USER_1;
|
nc->flags &= ~MG_F_HTTP_CGI_PARSE_HEADERS;
|
||||||
}
|
}
|
||||||
if (!(nc->flags & MG_F_USER_1)) {
|
if (!(nc->flags & MG_F_HTTP_CGI_PARSE_HEADERS)) {
|
||||||
mg_forward(cgi_nc, nc);
|
mg_forward(cgi_nc, nc);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case MG_EV_CLOSE:
|
case MG_EV_CLOSE:
|
||||||
|
DBG(("%p CLOSE", cgi_nc));
|
||||||
mg_http_free_proto_data_cgi(&mg_http_get_proto_data(nc)->cgi);
|
mg_http_free_proto_data_cgi(&mg_http_get_proto_data(nc)->cgi);
|
||||||
nc->flags |= MG_F_SEND_AND_CLOSE;
|
nc->flags |= MG_F_SEND_AND_CLOSE;
|
||||||
break;
|
break;
|
||||||
@@ -8925,7 +8929,7 @@ MG_INTERNAL void mg_handle_cgi(struct mg_connection *nc, const char *prog,
|
|||||||
#if !MG_ENABLE_CALLBACK_USERDATA
|
#if !MG_ENABLE_CALLBACK_USERDATA
|
||||||
cgi_pd->cgi.cgi_nc->user_data = nc;
|
cgi_pd->cgi.cgi_nc->user_data = nc;
|
||||||
#endif
|
#endif
|
||||||
nc->flags |= MG_F_USER_1;
|
nc->flags |= MG_F_HTTP_CGI_PARSE_HEADERS;
|
||||||
/* Push POST data to the CGI */
|
/* Push POST data to the CGI */
|
||||||
if (n > 0 && n < nc->recv_mbuf.len) {
|
if (n > 0 && n < nc->recv_mbuf.len) {
|
||||||
mg_send(cgi_pd->cgi.cgi_nc, hm->body.p, n);
|
mg_send(cgi_pd->cgi.cgi_nc, hm->body.p, n);
|
||||||
@@ -8942,10 +8946,12 @@ MG_INTERNAL void mg_handle_cgi(struct mg_connection *nc, const char *prog,
|
|||||||
}
|
}
|
||||||
|
|
||||||
MG_INTERNAL void mg_http_free_proto_data_cgi(struct mg_http_proto_data_cgi *d) {
|
MG_INTERNAL void mg_http_free_proto_data_cgi(struct mg_http_proto_data_cgi *d) {
|
||||||
if (d != NULL) {
|
if (d == NULL) return;
|
||||||
if (d->cgi_nc != NULL) d->cgi_nc->flags |= MG_F_CLOSE_IMMEDIATELY;
|
if (d->cgi_nc != NULL) {
|
||||||
memset(d, 0, sizeof(struct mg_http_proto_data_cgi));
|
d->cgi_nc->flags |= MG_F_CLOSE_IMMEDIATELY;
|
||||||
|
d->cgi_nc->user_data = NULL;
|
||||||
}
|
}
|
||||||
|
memset(d, 0, sizeof(*d));
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* MG_ENABLE_HTTP && MG_ENABLE_HTTP_CGI */
|
#endif /* MG_ENABLE_HTTP && MG_ENABLE_HTTP_CGI */
|
||||||
|
|||||||
Reference in new issue
Block a user