[PATCH BlueZ v1 1/3] sdp-xml: Fix leaking the parse stack on malformed input
Luiz Augusto von Dentz <[email protected]>
| Newsgroups | org.kernel.vger.linux-bluetooth |
|---|---|
| Message-ID | <[email protected]> |
From: Luiz Augusto von Dentz <[email protected]> sdp_xml_parse_record() frees its context but never the elements left on ctx_data->stack_head. element_end() returns early without popping the stack when it rejects a document, for instance on a mismatched </sequence> close, so a malformed record leaves its elements behind and they are never freed. Free the remaining stack elements before returning. Found with the compute-seq-size-type-confusion.xml test: 56 (direct) + 1,072 (indirect) bytes in 1 blocks are definitely lost at calloc (vg_replace_malloc.c:1678) by sdp_xml_data_alloc (sdp-xml.c:73) by element_start (sdp-xml.c:473) by g_markup_parse_context_parse (gmarkup.c:1369) by sdp_xml_parse_record (sdp-xml.c:696) Assisted-by: Claude:claude-opus-5 --- src/sdp-xml.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/sdp-xml.c b/src/sdp-xml.c index bad9e289344f..bcd5785f87ca 100644 --- a/src/sdp-xml.c +++ b/src/sdp-xml.c @@ -551,6 +551,17 @@ static void sdp_xml_data_free(struct sdp_xml_data *elem) free(elem); } +/* Free the elements left on the stack, e.g. by a document that is malformed */ +static void sdp_xml_data_free_stack(struct sdp_xml_data *elem) +{ + while (elem) { + struct sdp_xml_data *next = elem->next; + + sdp_xml_data_free(elem); + elem = next; + } +} + static void element_end(GMarkupParseContext *context, const char *element_name, gpointer user_data, GError **err) { @@ -696,6 +707,7 @@ sdp_record_t *sdp_xml_parse_record(const char *data, int size) if (g_markup_parse_context_parse(ctx, data, size, NULL) == FALSE) { error("XML parsing error"); g_markup_parse_context_free(ctx); + sdp_xml_data_free_stack(ctx_data->stack_head); sdp_record_free(record); free(ctx_data); return NULL; @@ -703,6 +715,8 @@ sdp_record_t *sdp_xml_parse_record(const char *data, int size) g_markup_parse_context_free(ctx); + sdp_xml_data_free_stack(ctx_data->stack_head); + free(ctx_data); return record; -- 2.54.0