From: Daniel Stenberg Date: Tue, 20 May 2025 07:05:16 +0000 (+0200) Subject: formdata: fix memory leak in OOM situation X-Git-Tag: curl-8_14_0~46 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3ec6aa5c07407d96ca2b3fc8a95d16cb16826ef6;p=thirdparty%2Fcurl.git formdata: fix memory leak in OOM situation Fixes #17390 Follow-up to c26da713e7dfa8c26a71bf3c0c75 Reported-by: Viktor Szakats Closes #17393 --- 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; }