From 3ec6aa5c07407d96ca2b3fc8a95d16cb16826ef6 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Tue, 20 May 2025 09:05:16 +0200 Subject: [PATCH] formdata: fix memory leak in OOM situation Fixes #17390 Follow-up to c26da713e7dfa8c26a71bf3c0c75 Reported-by: Viktor Szakats Closes #17393 --- lib/formdata.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/lib/formdata.c b/lib/formdata.c index d6b55b7683..2aa8eee94a 100644 --- a/lib/formdata.c +++ b/lib/formdata.c @@ -310,6 +310,19 @@ static CURLFORMcode FormAddCheck(struct FormInfo *first_form, return CURL_FORMADD_OK; } +/* Shallow cleanup. Remove the newly created chain, the structs only and not + the content they point to */ +static void free_chain(struct curl_httppost *c) +{ + while(c) { + struct curl_httppost *next = c->next; + if(c->more) + free_chain(c->more); + free(c); + c = next; + } +} + static CURLFORMcode FormAdd(struct curl_httppost **httppost, struct curl_httppost **last_post, @@ -648,14 +661,8 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost, (*last_post) = lastnode; } - else { - /* remove the newly created chain */ - while(newchain) { - struct curl_httppost *next = newchain->next; - free(newchain); - newchain = next; - } - } + else + free_chain(newchain); return retval; }