http2: fix memory-leak when denying push streams
Reported-by: zelinchen@users.noreply.github.com Fixes #1229
This commit is contained in:
parent
e1187c42a4
commit
bde1e2e09b
30
lib/http2.c
30
lib/http2.c
@ -116,18 +116,11 @@ static int http2_getsock(struct connectdata *conn,
|
|||||||
return http2_perform_getsock(conn, sock, numsocks);
|
return http2_perform_getsock(conn, sock, numsocks);
|
||||||
}
|
}
|
||||||
|
|
||||||
static CURLcode http2_disconnect(struct connectdata *conn,
|
/*
|
||||||
bool dead_connection)
|
* http2_stream_free() free HTTP2 stream related data
|
||||||
|
*/
|
||||||
|
static void http2_stream_free(struct HTTP *http)
|
||||||
{
|
{
|
||||||
struct HTTP *http = conn->data->req.protop;
|
|
||||||
struct http_conn *c = &conn->proto.httpc;
|
|
||||||
(void)dead_connection;
|
|
||||||
|
|
||||||
DEBUGF(infof(conn->data, "HTTP/2 DISCONNECT starts now\n"));
|
|
||||||
|
|
||||||
nghttp2_session_del(c->h2);
|
|
||||||
Curl_safefree(c->inbuf);
|
|
||||||
|
|
||||||
if(http) {
|
if(http) {
|
||||||
Curl_add_buffer_free(http->header_recvbuf);
|
Curl_add_buffer_free(http->header_recvbuf);
|
||||||
http->header_recvbuf = NULL; /* clear the pointer */
|
http->header_recvbuf = NULL; /* clear the pointer */
|
||||||
@ -139,6 +132,19 @@ static CURLcode http2_disconnect(struct connectdata *conn,
|
|||||||
free(http->push_headers);
|
free(http->push_headers);
|
||||||
http->push_headers = NULL;
|
http->push_headers = NULL;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static CURLcode http2_disconnect(struct connectdata *conn,
|
||||||
|
bool dead_connection)
|
||||||
|
{
|
||||||
|
struct http_conn *c = &conn->proto.httpc;
|
||||||
|
(void)dead_connection;
|
||||||
|
|
||||||
|
DEBUGF(infof(conn->data, "HTTP/2 DISCONNECT starts now\n"));
|
||||||
|
|
||||||
|
nghttp2_session_del(c->h2);
|
||||||
|
Curl_safefree(c->inbuf);
|
||||||
|
http2_stream_free(conn->data->req.protop);
|
||||||
|
|
||||||
DEBUGF(infof(conn->data, "HTTP/2 DISCONNECT done\n"));
|
DEBUGF(infof(conn->data, "HTTP/2 DISCONNECT done\n"));
|
||||||
|
|
||||||
@ -419,6 +425,7 @@ static int push_promise(struct Curl_easy *data,
|
|||||||
|
|
||||||
if(rv) {
|
if(rv) {
|
||||||
/* denied, kill off the new handle again */
|
/* denied, kill off the new handle again */
|
||||||
|
http2_stream_free(newhandle->req.protop);
|
||||||
(void)Curl_close(newhandle);
|
(void)Curl_close(newhandle);
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
@ -433,6 +440,7 @@ static int push_promise(struct Curl_easy *data,
|
|||||||
rc = Curl_multi_add_perform(data->multi, newhandle, conn);
|
rc = Curl_multi_add_perform(data->multi, newhandle, conn);
|
||||||
if(rc) {
|
if(rc) {
|
||||||
infof(data, "failed to add handle to multi\n");
|
infof(data, "failed to add handle to multi\n");
|
||||||
|
http2_stream_free(newhandle->req.protop);
|
||||||
Curl_close(newhandle);
|
Curl_close(newhandle);
|
||||||
rv = 1;
|
rv = 1;
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user