From: Arran Cudbard-Bell Date: Tue, 7 Jun 2022 16:45:37 +0000 (-0400) Subject: Test and fix for correct merging of duplicated terminal sequences X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ef9cd449190dfdfa682273265ffda066b43197a4;p=thirdparty%2Ffreeradius-server.git Test and fix for correct merging of duplicated terminal sequences --- diff --git a/src/lib/util/sbuff.c b/src/lib/util/sbuff.c index 4f00ba5ee67..e62714ebcef 100644 --- a/src/lib/util/sbuff.c +++ b/src/lib/util/sbuff.c @@ -614,7 +614,7 @@ fr_sbuff_term_t *fr_sbuff_terminals_amerge(TALLOC_CTX *ctx, fr_sbuff_term_t cons j = 0; /* Tmp index */ k = 0; /* How many non-nulls we've found */ - while (j < i) { + while (k < i) { if (tmp[j] == NULL) { j++; continue; diff --git a/src/lib/util/sbuff_tests.c b/src/lib/util/sbuff_tests.c index 4cf3ea1fef7..583c49b94ae 100644 --- a/src/lib/util/sbuff_tests.c +++ b/src/lib/util/sbuff_tests.c @@ -730,6 +730,70 @@ static void test_eof_terminal(void) TEST_CHECK(fr_sbuff_is_terminal(&sbuff, &tt) == false); } +static void test_terminal_merge(void) +{ + size_t i; + fr_sbuff_term_t a = FR_SBUFF_TERMS( + L(""), + L("\t"), + L("\r"), + L("\n"), + L(" "), + L("!"), + L("%"), + L("&"), + L("*"), + L("+"), + L("-"), + L("/"), + L("<"), + L("="), + L(">"), + L("^"), + L("{"), + L("|"), + L("~") + ); + fr_sbuff_term_t b = FR_SBUFF_TERMS( + L(")"), + L("") + ); + + fr_sbuff_term_t expect = + FR_SBUFF_TERMS( + L(""), + L("\t"), + L("\n"), + L("\r"), + L(" "), + L("!"), + L("%"), + L("&"), + L(")"), + L("*"), + L("+"), + L("-"), + L("/"), + L("<"), + L("="), + L(">"), + L("^"), + L("{"), + L("|"), + L("~") + ); + fr_sbuff_term_t *result; + + result = fr_sbuff_terminals_amerge(NULL, &a, &b); + TEST_CHECK_LEN(result->len, expect.len); + + for (i = 0; i < result->len; i++) { + TEST_CHECK_STRCMP(result->elem[i].str, expect.elem[i].str); + } + + talloc_free(result); +} + static void test_no_advance(void) { char const *in = "i am a test string"; @@ -1442,6 +1506,7 @@ TEST_LIST = { { "multi-char terminals", test_unescape_multi_char_terminals }, { "fr_sbuff_out_unescape_until", test_unescape_until }, { "fr_sbuff_terminal_eof", test_eof_terminal }, + { "terminal merge", test_terminal_merge }, /* * Extending buffer