]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Test and fix for correct merging of duplicated terminal sequences
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Tue, 7 Jun 2022 16:45:37 +0000 (12:45 -0400)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Wed, 8 Jun 2022 16:08:05 +0000 (12:08 -0400)
src/lib/util/sbuff.c
src/lib/util/sbuff_tests.c

index 4f00ba5ee67e3b76f6c5d899169eeee61cf85e86..e62714ebcef5267efed9a837e9f3afaa679074cd 100644 (file)
@@ -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;
index 4cf3ea1fef792f84247bbbac99e32ba0adcb586f..583c49b94ae44f525305818aa48ef10e378a9963 100644 (file)
@@ -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