From 999de2bf6a634fd2cb71437c4c18e0fdb65bfa40 Mon Sep 17 00:00:00 2001 From: Gregory Oschwald Date: Tue, 2 Jan 2018 10:24:39 -0800 Subject: [PATCH 1/4] Add missing char_array_destroy when numex is invalid --- src/numex.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/numex.c b/src/numex.c index 7f4ef630..bc342310 100644 --- a/src/numex.c +++ b/src/numex.c @@ -1232,6 +1232,7 @@ char *replace_numeric_expressions(char *str, char *lang) { if (!have_valid_numex) { numex_result_array_destroy(results); + char_array_destroy(replacement); return NULL; } From 95ea873498823785eef964bfc9db452188b454dd Mon Sep 17 00:00:00 2001 From: Gregory Oschwald Date: Tue, 2 Jan 2018 10:38:12 -0800 Subject: [PATCH 2/4] Fix memory leaks in test_trie The primary motivation is to make the test suite run clean under Valgrind so that we don't need to wade through unimportant failures. --- test/test_trie.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/test_trie.c b/test/test_trie.c index 457e7222..d3adaf97 100644 --- a/test/test_trie.c +++ b/test/test_trie.c @@ -49,6 +49,8 @@ TEST test_trie(void) { ASSERT(phrase.start == 2); ASSERT(phrase.len == 1); + phrase_array_destroy(phrases); + token_array_destroy(tokens); trie_destroy(trie); PASS(); From 18cc0e37e644c85f2833c4be68d6107db310bdfb Mon Sep 17 00:00:00 2001 From: Gregory Oschwald Date: Tue, 2 Jan 2018 11:56:02 -0800 Subject: [PATCH 3/4] Only create parser response when it is used Previously, an unused response would not be freed, causing a leak. --- src/address_parser.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/address_parser.c b/src/address_parser.c index 9cfa17a6..2b7c8811 100644 --- a/src/address_parser.c +++ b/src/address_parser.c @@ -1755,8 +1755,6 @@ libpostal_address_parser_response_t *address_parser_parse(char *address, char *l label = strdup(ADDRESS_PARSER_LABEL_POSTAL_CODE); } - response = address_parser_response_new(); - // Implicit: if most_common is not one of the above, ignore and parse regularly if (label != NULL) { char **single_label = malloc(sizeof(char *)); @@ -1764,6 +1762,8 @@ libpostal_address_parser_response_t *address_parser_parse(char *address, char *l char **single_component = malloc(sizeof(char *)); single_component[0] = strdup(normalized); + response = address_parser_response_new(); + response->num_components = 1; response->labels = single_label; response->components = single_component; From 2f6749fe039c658a4bb954a97c723460cfa432d8 Mon Sep 17 00:00:00 2001 From: Gregory Oschwald Date: Tue, 2 Jan 2018 13:28:51 -0800 Subject: [PATCH 4/4] Fix segfault in expand_alternative_phrase_option string_tree_get_alternative can return NULL --- src/expand.c | 8 ++++++-- test/test_expand.c | 10 ++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/expand.c b/src/expand.c index 2268acc6..a6296ffc 100644 --- a/src/expand.c +++ b/src/expand.c @@ -1491,8 +1491,12 @@ void expand_alternative_phrase_option(cstring_array *strings, khash_t(str_set) * for (; !string_tree_iterator_done(iter); string_tree_iterator_next(iter)) { char_array_clear(temp_string); string_tree_iterator_foreach_token(iter, token, { - log_debug("token=%s\n", token); - char_array_append(temp_string, token); + if (token == NULL) { + log_debug("token=NULL\n"); + } else { + log_debug("token=%s\n", token); + char_array_append(temp_string, token); + } }) char_array_terminate(temp_string); diff --git a/test/test_expand.c b/test/test_expand.c index 9a4e4da8..e823ea53 100644 --- a/test/test_expand.c +++ b/test/test_expand.c @@ -135,6 +135,15 @@ TEST test_expansions(void) { CHECK_CALL(test_expansion_contains_with_languages("Marktstrasse", "markt strasse", options, 1, "de")); CHECK_CALL(test_expansion_contains_with_languages("Hoofdstraat", "hoofdstraat", options, 1, "nl")); CHECK_CALL(test_expansion_contains_with_languages("มงแตร", "มงแตร", options, 1, "th")); + + PASS(); +} + +TEST test_expansion_for_invalid_input(void) { + size_t num_expansions; + + // This is tested as the input caused a segfault in expand_alternative_phrase_option + libpostal_expand_address("bob-ad1233@blah.co", libpostal_get_default_options(), &num_expansions); PASS(); } @@ -314,6 +323,7 @@ SUITE(libpostal_expansion_tests) { RUN_TEST(test_po_box_root_expansions); RUN_TEST(test_expansions_language_classifier); RUN_TEST(test_expansions_no_options); + RUN_TEST(test_expansion_for_invalid_input); libpostal_teardown(); libpostal_teardown_language_classifier();