From 5bbfee2ed836fc433cf1d71c91b0091a2df723cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Mo=C5=84?= Date: Sat, 27 Mar 2021 17:34:06 +0100 Subject: [PATCH] protobuf: fix leaking tokens Move scanner destroy call to pbl_clear_state() so it is freed if parsing fails. This eliminates most of leaked memory reported in #17305. --- epan/protobuf_lang_parser.lemon | 8 +++++--- epan/protobuf_lang_scanner.l | 1 + 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/epan/protobuf_lang_parser.lemon b/epan/protobuf_lang_parser.lemon index 4446f64a36..84cd55a3d5 100644 --- a/epan/protobuf_lang_parser.lemon +++ b/epan/protobuf_lang_parser.lemon @@ -571,10 +571,14 @@ pbl_clear_state(protobuf_lang_state_t *state, pbl_descriptor_pool_t* pool) state->pool = NULL; state->file = NULL; - state->scanner = NULL; state->grammar_error = FALSE; state->tmp_token = NULL; + if (state->scanner) { + protobuf_lang_lex_destroy(state->scanner); + state->scanner = NULL; + } + if (state->pParser) { ProtobufLangParserFree(state->pParser, g_free); state->pParser = NULL; @@ -664,8 +668,6 @@ int run_pbl_parser(pbl_descriptor_pool_t* pool) ProtobufLangParser(state.pParser, 0, NULL, &state); } - protobuf_lang_lex_destroy(scanner); - /* remove the parsed file from list */ pool->proto_files_to_be_parsed = it = g_slist_delete_link(pool->proto_files_to_be_parsed, it); } diff --git a/epan/protobuf_lang_scanner.l b/epan/protobuf_lang_scanner.l index 0751544480..dca3d79749 100644 --- a/epan/protobuf_lang_scanner.l +++ b/epan/protobuf_lang_scanner.l @@ -89,6 +89,7 @@ strdup_and_store(void* yyscanner, const char* text); #define PROTOBUF_LANG_PARSE(token_type) \ protobuf_lang_get_extra(yyscanner)->tmp_token = g_new0(protobuf_lang_token_t, 1); \ + pbl_store_struct_token(protobuf_lang_get_extra(yyscanner), protobuf_lang_get_extra(yyscanner)->tmp_token); \ protobuf_lang_get_extra(yyscanner)->tmp_token->v = strdup_and_store(yyscanner, yytext); \ protobuf_lang_get_extra(yyscanner)->tmp_token->ln = protobuf_lang_get_lineno(yyscanner); \ return (token_type);