From 77c2ff8922d3f547adc1c2c815a3fd01cbd73ce9 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 16 Jul 2021 08:05:41 +0200 Subject: [PATCH] libnm/tests: add test for broken behavior of nm_utils_bin_utf8safe_escape() (cherry picked from commit 5f54270d93b5c32be93737b0b2fe997979dce7b4) --- src/libnm-core-impl/tests/test-general.c | 40 +++++++++++++++++++++--- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/src/libnm-core-impl/tests/test-general.c b/src/libnm-core-impl/tests/test-general.c index 9594a480a7..cbe33aa57b 100644 --- a/src/libnm-core-impl/tests/test-general.c +++ b/src/libnm-core-impl/tests/test-general.c @@ -9137,6 +9137,12 @@ _do_test_utils_str_utf8safe(const char * str, ((nmtst_get_rand_bool()) ? NM_UTILS_STR_UTF8_SAFE_FLAG_NONE \ : NM_UTILS_STR_UTF8_SAFE_FLAG_SECRET) + if (expected && strlen(expected) == str_len && memcmp(str, expected, str_len) == 0) { + g_error("Test error: pass expected as NULL (instead of \"%s\", if the escaping will " + "produce no difference.", + expected); + } + buf_safe = nm_utils_buf_utf8safe_escape(str, str_len, flags | RND_FLAG, &str_free_1); str_safe = nm_utils_str_utf8safe_escape(str, flags | RND_FLAG, &str_free_2); @@ -9195,11 +9201,16 @@ _do_test_utils_str_utf8safe(const char * str, g_assert(str); g_assert(str_safe != str); g_assert(str_safe == str_free_2); - g_assert(strchr(str, '\\') || !g_utf8_validate(str, -1, NULL) - || (NM_FLAGS_HAS(flags, NM_UTILS_STR_UTF8_SAFE_FLAG_ESCAPE_NON_ASCII) - && NM_STRCHAR_ANY(str, ch, (guchar) ch >= 127)) - || (NM_FLAGS_HAS(flags, NM_UTILS_STR_UTF8_SAFE_FLAG_ESCAPE_CTRL) - && NM_STRCHAR_ANY(str, ch, (guchar) ch < ' '))); + if (nm_streq(str, "ab∞c")) { + /* Hack to pass test for broken behavior. */ + g_assert(((char) -1) < 0); + } else { + g_assert(strchr(str, '\\') || !g_utf8_validate(str, -1, NULL) + || (NM_FLAGS_HAS(flags, NM_UTILS_STR_UTF8_SAFE_FLAG_ESCAPE_NON_ASCII) + && NM_STRCHAR_ANY(str, ch, (guchar) ch >= 127)) + || (NM_FLAGS_HAS(flags, NM_UTILS_STR_UTF8_SAFE_FLAG_ESCAPE_CTRL) + && NM_STRCHAR_ANY(str, ch, (guchar) ch < ' '))); + } g_assert(g_utf8_validate(str_safe, -1, NULL)); str_free_6 = g_strcompress(str_safe); @@ -9273,6 +9284,25 @@ test_utils_str_utf8safe(void) do_test_utils_str_utf8safe_unescape("\n\\012", "\n\012"); do_test_utils_str_utf8safe_unescape("\n\\.", "\n."); do_test_utils_str_utf8safe_unescape("\\n\\.3\\r", "\n.3\r"); + + if (((char) -1) < 0) { + /* Test buggy behavior on systems with signed "char". Will be fixed next. */ + do_test_utils_str_utf8safe("ab∞c", + "ab\\342\\210\\236c", + NM_UTILS_STR_UTF8_SAFE_FLAG_ESCAPE_CTRL); + do_test_utils_str_utf8safe("ab\ab∞c", + "ab\\007b\\342\\210\\236c", + NM_UTILS_STR_UTF8_SAFE_FLAG_ESCAPE_CTRL); + } else { + do_test_utils_str_utf8safe("ab∞c", NULL, NM_UTILS_STR_UTF8_SAFE_FLAG_ESCAPE_CTRL); + do_test_utils_str_utf8safe("ab\ab∞c", + "ab\\007b∞c", + NM_UTILS_STR_UTF8_SAFE_FLAG_ESCAPE_CTRL); + } + do_test_utils_str_utf8safe("ab\ab∞c", + "ab\\007b\\342\\210\\236c", + NM_UTILS_STR_UTF8_SAFE_FLAG_ESCAPE_CTRL + | NM_UTILS_STR_UTF8_SAFE_FLAG_ESCAPE_NON_ASCII); } /*****************************************************************************/