From 05a4aaf2c08aff8654cab4d7fcdf482b62748494 Mon Sep 17 00:00:00 2001 From: Jhonny Sousa Date: Thu, 13 Nov 2025 11:40:07 -0300 Subject: [PATCH] util/misc: Change shortening format and add unittests Ticket: #5583 --- src/util-device.c | 2 +- src/util-misc.c | 63 +++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 54 insertions(+), 11 deletions(-) diff --git a/src/util-device.c b/src/util-device.c index 0d5409c3a6..75a9f89cad 100644 --- a/src/util-device.c +++ b/src/util-device.c @@ -248,7 +248,7 @@ static int LiveSafeDeviceName(const char *devname, char *newdevname, size_t dest return 1; } - ShortenString(devname, newdevname, destlen, '.'); + ShortenString(devname, newdevname, destlen, '~'); SCLogInfo("%s: shortening device name to %s", devname, newdevname); } else { diff --git a/src/util-misc.c b/src/util-misc.c index 2d33cac12c..9ee69b794e 100644 --- a/src/util-misc.c +++ b/src/util-misc.c @@ -222,20 +222,17 @@ void ShortenString(const char *input, if (half == 0 || half > output_size) return; - size_t spaces = (output_size - 1) - (half * 2); - /* Add the first half to the new string */ snprintf(output, half+1, "%s", input); - /* Add the amount of spaces wanted */ - size_t length = half; - for (size_t i = half; i < half + spaces; i++) { - char s[2] = ""; - snprintf(s, sizeof(s), "%c", c); - length = strlcat(output, s, output_size); - } + const size_t second_half_len = (output_size - 1) - half - 1; + + /* Add space and the separator character */ + const char *second_half_start = input + (str_len - second_half_len); - snprintf(output + length, half + 1, "%s", input + (str_len - half)); + size_t remaining_size = output_size - half; + + snprintf(output + half, remaining_size, "%c%s", c, second_half_start); } /*********************************Unittests********************************/ @@ -813,10 +810,56 @@ static int UtilMiscParseSizeStringTest02(void) PASS; } +static int UtilMiscShortenStringTest01(void) +{ + char buffer[100]; + const char *original = "abcdefghijklmnopqrstuvwxyz"; + const char sep = '~'; + const char *expected = NULL; + + memset(buffer, 0, sizeof(buffer)); + expected = "abc~wxyz"; + ShortenString(original, buffer, 9, sep); + FAIL_IF_NOT(strcmp(buffer, expected) == 0); + + memset(buffer, 0, sizeof(buffer)); + expected = "abcd~wxyz"; + ShortenString(original, buffer, 10, sep); + FAIL_IF_NOT(strcmp(buffer, expected) == 0); + + memset(buffer, 0, sizeof(buffer)); + expected = "a~z"; + ShortenString(original, buffer, 4, sep); + FAIL_IF_NOT(strcmp(buffer, expected) == 0); + + memset(buffer, 0, sizeof(buffer)); + expected = ""; + ShortenString(original, buffer, 3, sep); + FAIL_IF_NOT(strcmp(buffer, expected) == 0); + + memset(buffer, 0, sizeof(buffer)); + expected = ""; + ShortenString(original, buffer, 2, sep); + FAIL_IF_NOT(strcmp(buffer, expected) == 0); + + memset(buffer, 0, sizeof(buffer)); + expected = ""; + ShortenString(original, buffer, 1, sep); + FAIL_IF_NOT(strcmp(buffer, expected) == 0); + + memset(buffer, 0, sizeof(buffer)); + expected = ""; + ShortenString(original, buffer, 0, sep); + FAIL_IF_NOT(strcmp(buffer, expected) == 0); + + PASS; +} + void UtilMiscRegisterTests(void) { UtRegisterTest("UtilMiscParseSizeStringTest01", UtilMiscParseSizeStringTest01); UtRegisterTest("UtilMiscParseSizeStringTest02", UtilMiscParseSizeStringTest02); + UtRegisterTest("UtilMiscShortenStringTest01", UtilMiscShortenStringTest01); } #endif /* UNITTESTS */