diff -Naur a/lib/http2.c b/lib/http2.c --- a/lib/http2.c 2024-04-13 14:42:27.209977032 +0800 +++ b/lib/http2.c 2024-04-13 14:33:11.606622746 +0800 @@ -547,6 +547,15 @@ return 0; } +static void free_push_headers(struct h2_stream_ctx *stream) +{ + size_t i; + for(i = 0; ipush_headers_used; i++) + free(stream->push_headers[i]); + Curl_safefree(stream->push_headers); + stream->push_headers_used = 0; +} + static int push_promise(struct Curl_easy *data, struct connectdata *conn, const nghttp2_push_promise *frame) @@ -560,7 +569,6 @@ struct curl_pushheaders heads; CURLMcode rc; struct http_conn *httpc; - size_t i; /* clone the parent */ struct Curl_easy *newhandle = duphandle(data); if(!newhandle) { @@ -596,11 +604,7 @@ Curl_set_in_callback(data, false); /* free the headers again */ - for(i = 0; ipush_headers_used; i++) - free(stream->push_headers[i]); - free(stream->push_headers); - stream->push_headers = NULL; - stream->push_headers_used = 0; + free_push_headers(stream); if(rv) { DEBUGASSERT((rv > CURL_PUSH_OK) && (rv <= CURL_PUSH_ERROROUT)); @@ -1036,10 +1040,9 @@ stream->push_headers_alloc) { char **headp; stream->push_headers_alloc *= 2; - headp = Curl_saferealloc(stream->push_headers, - stream->push_headers_alloc * sizeof(char *)); + headp = realloc(stream->push_headers, stream->push_headers_alloc * sizeof(char *)); if(!headp) { - stream->push_headers = NULL; + free_push_headers(stream); return NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE; } stream->push_headers = headp; @@ -1205,15 +1208,8 @@ setup */ Curl_dyn_free(&http->header_recvbuf); Curl_dyn_free(&http->trailer_recvbuf); - if(http->push_headers) { - /* if they weren't used and then freed before */ - for(; http->push_headers_used > 0; --http->push_headers_used) { - free(http->push_headers[http->push_headers_used - 1]); - } - free(http->push_headers); - http->push_headers = NULL; - } + free_push_headers(http); if(!(data->conn->handler->protocol&PROTO_FAMILY_HTTP) || !httpc->h2) /* not HTTP/2 ? */ return;