Esme Povirk (@madewokherd) commented about dlls/windowscodecs/metadataquery.c:
+ ULONG fetched_items; + + if (!(vars = calloc(vars_count * 2, sizeof(*vars)))) + return E_OUTOFMEMORY; + schemas = vars; + ids = vars + vars_count; + + fetched_items = 0; + if (SUCCEEDED(hr = IWICEnumMetadataItem_Next(enumerator->metadata_enumerator, count, schemas, ids, NULL, &fetched_items))) + { + for (ULONG i = 0; i < fetched_items && SUCCEEDED(hr); ++i) + { + WCHAR *schema_name = NULL, *id_name = NULL; + size_t size; + + if (schemas[i].vt != VT_EMPTY) I think that if we break the loop early due to a failing hr, the later values in `schemas` and `ids` are leaked. I suggest moving `SUCCEEDED(hr)` from the loop test into this if statement.
-- https://gitlab.winehq.org/wine/wine/-/merge_requests/7407#note_96704