lib/test-string_helpers: add test cases for new features
We have got new flags and hence new features of string_escape_mem(). Add test cases for that. Link: https://lkml.kernel.org/r/20210504180819.73127-10-andriy.shevchenko@linux.intel.com Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Cc: Alexander Viro <viro@zeniv.linux.org.uk> Cc: Chuck Lever <chuck.lever@oracle.com> Cc: "J. Bruce Fields" <bfields@fieldses.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
69325698df
commit
259fa5d7d8
@ -26,6 +26,8 @@ void string_get_size(u64 size, u64 blk_size, enum string_size_units units,
|
|||||||
#define UNESCAPE_ANY \
|
#define UNESCAPE_ANY \
|
||||||
(UNESCAPE_SPACE | UNESCAPE_OCTAL | UNESCAPE_HEX | UNESCAPE_SPECIAL)
|
(UNESCAPE_SPACE | UNESCAPE_OCTAL | UNESCAPE_HEX | UNESCAPE_SPECIAL)
|
||||||
|
|
||||||
|
#define UNESCAPE_ALL_MASK GENMASK(3, 0)
|
||||||
|
|
||||||
int string_unescape(char *src, char *dst, size_t size, unsigned int flags);
|
int string_unescape(char *src, char *dst, size_t size, unsigned int flags);
|
||||||
|
|
||||||
static inline int string_unescape_inplace(char *buf, unsigned int flags)
|
static inline int string_unescape_inplace(char *buf, unsigned int flags)
|
||||||
@ -56,6 +58,8 @@ static inline int string_unescape_any_inplace(char *buf)
|
|||||||
#define ESCAPE_NAP BIT(7)
|
#define ESCAPE_NAP BIT(7)
|
||||||
#define ESCAPE_APPEND BIT(8)
|
#define ESCAPE_APPEND BIT(8)
|
||||||
|
|
||||||
|
#define ESCAPE_ALL_MASK GENMASK(8, 0)
|
||||||
|
|
||||||
int string_escape_mem(const char *src, size_t isz, char *dst, size_t osz,
|
int string_escape_mem(const char *src, size_t isz, char *dst, size_t osz,
|
||||||
unsigned int flags, const char *only);
|
unsigned int flags, const char *only);
|
||||||
|
|
||||||
|
@ -202,11 +202,25 @@ static const struct test_string_2 escape0[] __initconst = {{
|
|||||||
},{
|
},{
|
||||||
/* terminator */
|
/* terminator */
|
||||||
}}
|
}}
|
||||||
|
},{
|
||||||
|
.in = "\007 \eb\"\x90\xCF\r",
|
||||||
|
.s1 = {{
|
||||||
|
.out = "\007 \eb\"\\220\\317\r",
|
||||||
|
.flags = ESCAPE_OCTAL | ESCAPE_NA,
|
||||||
|
},{
|
||||||
|
.out = "\007 \eb\"\\x90\\xcf\r",
|
||||||
|
.flags = ESCAPE_HEX | ESCAPE_NA,
|
||||||
|
},{
|
||||||
|
.out = "\007 \eb\"\x90\xCF\r",
|
||||||
|
.flags = ESCAPE_NA,
|
||||||
|
},{
|
||||||
|
/* terminator */
|
||||||
|
}}
|
||||||
},{
|
},{
|
||||||
/* terminator */
|
/* terminator */
|
||||||
}};
|
}};
|
||||||
|
|
||||||
#define TEST_STRING_2_DICT_1 "b\\ \t\r"
|
#define TEST_STRING_2_DICT_1 "b\\ \t\r\xCF"
|
||||||
static const struct test_string_2 escape1[] __initconst = {{
|
static const struct test_string_2 escape1[] __initconst = {{
|
||||||
.in = "\f\\ \n\r\t\v",
|
.in = "\f\\ \n\r\t\v",
|
||||||
.s1 = {{
|
.s1 = {{
|
||||||
@ -215,14 +229,38 @@ static const struct test_string_2 escape1[] __initconst = {{
|
|||||||
},{
|
},{
|
||||||
.out = "\f\\x5c\\x20\n\\x0d\\x09\v",
|
.out = "\f\\x5c\\x20\n\\x0d\\x09\v",
|
||||||
.flags = ESCAPE_HEX,
|
.flags = ESCAPE_HEX,
|
||||||
|
},{
|
||||||
|
.out = "\f\\134\\040\n\\015\\011\v",
|
||||||
|
.flags = ESCAPE_ANY | ESCAPE_APPEND,
|
||||||
|
},{
|
||||||
|
.out = "\\014\\134\\040\\012\\015\\011\\013",
|
||||||
|
.flags = ESCAPE_OCTAL | ESCAPE_APPEND | ESCAPE_NAP,
|
||||||
|
},{
|
||||||
|
.out = "\\x0c\\x5c\\x20\\x0a\\x0d\\x09\\x0b",
|
||||||
|
.flags = ESCAPE_HEX | ESCAPE_APPEND | ESCAPE_NAP,
|
||||||
|
},{
|
||||||
|
.out = "\f\\134\\040\n\\015\\011\v",
|
||||||
|
.flags = ESCAPE_OCTAL | ESCAPE_APPEND | ESCAPE_NA,
|
||||||
|
},{
|
||||||
|
.out = "\f\\x5c\\x20\n\\x0d\\x09\v",
|
||||||
|
.flags = ESCAPE_HEX | ESCAPE_APPEND | ESCAPE_NA,
|
||||||
},{
|
},{
|
||||||
/* terminator */
|
/* terminator */
|
||||||
}}
|
}}
|
||||||
},{
|
},{
|
||||||
.in = "\\h\\\"\a\e\\",
|
.in = "\\h\\\"\a\xCF\e\\",
|
||||||
.s1 = {{
|
.s1 = {{
|
||||||
.out = "\\134h\\134\"\a\e\\134",
|
.out = "\\134h\\134\"\a\\317\e\\134",
|
||||||
.flags = ESCAPE_OCTAL,
|
.flags = ESCAPE_OCTAL,
|
||||||
|
},{
|
||||||
|
.out = "\\134h\\134\"\a\\317\e\\134",
|
||||||
|
.flags = ESCAPE_ANY | ESCAPE_APPEND,
|
||||||
|
},{
|
||||||
|
.out = "\\134h\\134\"\\007\\317\\033\\134",
|
||||||
|
.flags = ESCAPE_OCTAL | ESCAPE_APPEND | ESCAPE_NAP,
|
||||||
|
},{
|
||||||
|
.out = "\\134h\\134\"\a\\317\e\\134",
|
||||||
|
.flags = ESCAPE_OCTAL | ESCAPE_APPEND | ESCAPE_NA,
|
||||||
},{
|
},{
|
||||||
/* terminator */
|
/* terminator */
|
||||||
}}
|
}}
|
||||||
@ -234,6 +272,88 @@ static const struct test_string_2 escape1[] __initconst = {{
|
|||||||
},{
|
},{
|
||||||
/* terminator */
|
/* terminator */
|
||||||
}}
|
}}
|
||||||
|
},{
|
||||||
|
.in = "\007 \eb\"\x90\xCF\r",
|
||||||
|
.s1 = {{
|
||||||
|
.out = "\007 \eb\"\x90\xCF\r",
|
||||||
|
.flags = ESCAPE_NA,
|
||||||
|
},{
|
||||||
|
.out = "\007 \eb\"\x90\xCF\r",
|
||||||
|
.flags = ESCAPE_SPACE | ESCAPE_NA,
|
||||||
|
},{
|
||||||
|
.out = "\007 \eb\"\x90\xCF\r",
|
||||||
|
.flags = ESCAPE_SPECIAL | ESCAPE_NA,
|
||||||
|
},{
|
||||||
|
.out = "\007 \eb\"\x90\xCF\r",
|
||||||
|
.flags = ESCAPE_SPACE | ESCAPE_SPECIAL | ESCAPE_NA,
|
||||||
|
},{
|
||||||
|
.out = "\007 \eb\"\x90\\317\r",
|
||||||
|
.flags = ESCAPE_OCTAL | ESCAPE_NA,
|
||||||
|
},{
|
||||||
|
.out = "\007 \eb\"\x90\\317\r",
|
||||||
|
.flags = ESCAPE_SPACE | ESCAPE_OCTAL | ESCAPE_NA,
|
||||||
|
},{
|
||||||
|
.out = "\007 \eb\"\x90\\317\r",
|
||||||
|
.flags = ESCAPE_SPECIAL | ESCAPE_OCTAL | ESCAPE_NA,
|
||||||
|
},{
|
||||||
|
.out = "\007 \eb\"\x90\\317\r",
|
||||||
|
.flags = ESCAPE_ANY | ESCAPE_NA,
|
||||||
|
},{
|
||||||
|
.out = "\007 \eb\"\x90\\xcf\r",
|
||||||
|
.flags = ESCAPE_HEX | ESCAPE_NA,
|
||||||
|
},{
|
||||||
|
.out = "\007 \eb\"\x90\\xcf\r",
|
||||||
|
.flags = ESCAPE_SPACE | ESCAPE_HEX | ESCAPE_NA,
|
||||||
|
},{
|
||||||
|
.out = "\007 \eb\"\x90\\xcf\r",
|
||||||
|
.flags = ESCAPE_SPECIAL | ESCAPE_HEX | ESCAPE_NA,
|
||||||
|
},{
|
||||||
|
.out = "\007 \eb\"\x90\\xcf\r",
|
||||||
|
.flags = ESCAPE_SPACE | ESCAPE_SPECIAL | ESCAPE_HEX | ESCAPE_NA,
|
||||||
|
},{
|
||||||
|
/* terminator */
|
||||||
|
}}
|
||||||
|
},{
|
||||||
|
.in = "\007 \eb\"\x90\xCF\r",
|
||||||
|
.s1 = {{
|
||||||
|
.out = "\007 \eb\"\x90\xCF\r",
|
||||||
|
.flags = ESCAPE_NAP,
|
||||||
|
},{
|
||||||
|
.out = "\007 \eb\"\x90\xCF\\r",
|
||||||
|
.flags = ESCAPE_SPACE | ESCAPE_NAP,
|
||||||
|
},{
|
||||||
|
.out = "\007 \eb\"\x90\xCF\r",
|
||||||
|
.flags = ESCAPE_SPECIAL | ESCAPE_NAP,
|
||||||
|
},{
|
||||||
|
.out = "\007 \eb\"\x90\xCF\\r",
|
||||||
|
.flags = ESCAPE_SPACE | ESCAPE_SPECIAL | ESCAPE_NAP,
|
||||||
|
},{
|
||||||
|
.out = "\007 \eb\"\x90\\317\\015",
|
||||||
|
.flags = ESCAPE_OCTAL | ESCAPE_NAP,
|
||||||
|
},{
|
||||||
|
.out = "\007 \eb\"\x90\\317\\r",
|
||||||
|
.flags = ESCAPE_SPACE | ESCAPE_OCTAL | ESCAPE_NAP,
|
||||||
|
},{
|
||||||
|
.out = "\007 \eb\"\x90\\317\\015",
|
||||||
|
.flags = ESCAPE_SPECIAL | ESCAPE_OCTAL | ESCAPE_NAP,
|
||||||
|
},{
|
||||||
|
.out = "\007 \eb\"\x90\\317\r",
|
||||||
|
.flags = ESCAPE_ANY | ESCAPE_NAP,
|
||||||
|
},{
|
||||||
|
.out = "\007 \eb\"\x90\\xcf\\x0d",
|
||||||
|
.flags = ESCAPE_HEX | ESCAPE_NAP,
|
||||||
|
},{
|
||||||
|
.out = "\007 \eb\"\x90\\xcf\\r",
|
||||||
|
.flags = ESCAPE_SPACE | ESCAPE_HEX | ESCAPE_NAP,
|
||||||
|
},{
|
||||||
|
.out = "\007 \eb\"\x90\\xcf\\x0d",
|
||||||
|
.flags = ESCAPE_SPECIAL | ESCAPE_HEX | ESCAPE_NAP,
|
||||||
|
},{
|
||||||
|
.out = "\007 \eb\"\x90\\xcf\\r",
|
||||||
|
.flags = ESCAPE_SPACE | ESCAPE_SPECIAL | ESCAPE_HEX | ESCAPE_NAP,
|
||||||
|
},{
|
||||||
|
/* terminator */
|
||||||
|
}}
|
||||||
},{
|
},{
|
||||||
/* terminator */
|
/* terminator */
|
||||||
}};
|
}};
|
||||||
@ -315,9 +435,14 @@ static __init void test_string_escape(const char *name,
|
|||||||
/* NULL injection */
|
/* NULL injection */
|
||||||
if (flags & ESCAPE_NULL) {
|
if (flags & ESCAPE_NULL) {
|
||||||
in[p++] = '\0';
|
in[p++] = '\0';
|
||||||
|
/* '\0' passes isascii() test */
|
||||||
|
if (flags & ESCAPE_NA && !(flags & ESCAPE_APPEND && esc)) {
|
||||||
|
out_test[q_test++] = '\0';
|
||||||
|
} else {
|
||||||
out_test[q_test++] = '\\';
|
out_test[q_test++] = '\\';
|
||||||
out_test[q_test++] = '0';
|
out_test[q_test++] = '0';
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Don't try strings that have no output */
|
/* Don't try strings that have no output */
|
||||||
out = test_string_find_match(s2, flags);
|
out = test_string_find_match(s2, flags);
|
||||||
@ -459,17 +584,17 @@ static int __init test_string_helpers_init(void)
|
|||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
pr_info("Running tests...\n");
|
pr_info("Running tests...\n");
|
||||||
for (i = 0; i < UNESCAPE_ANY + 1; i++)
|
for (i = 0; i < UNESCAPE_ALL_MASK + 1; i++)
|
||||||
test_string_unescape("unescape", i, false);
|
test_string_unescape("unescape", i, false);
|
||||||
test_string_unescape("unescape inplace",
|
test_string_unescape("unescape inplace",
|
||||||
get_random_int() % (UNESCAPE_ANY + 1), true);
|
get_random_int() % (UNESCAPE_ANY + 1), true);
|
||||||
|
|
||||||
/* Without dictionary */
|
/* Without dictionary */
|
||||||
for (i = 0; i < (ESCAPE_ANY_NP | ESCAPE_HEX) + 1; i++)
|
for (i = 0; i < ESCAPE_ALL_MASK + 1; i++)
|
||||||
test_string_escape("escape 0", escape0, i, TEST_STRING_2_DICT_0);
|
test_string_escape("escape 0", escape0, i, TEST_STRING_2_DICT_0);
|
||||||
|
|
||||||
/* With dictionary */
|
/* With dictionary */
|
||||||
for (i = 0; i < (ESCAPE_ANY_NP | ESCAPE_HEX) + 1; i++)
|
for (i = 0; i < ESCAPE_ALL_MASK + 1; i++)
|
||||||
test_string_escape("escape 1", escape1, i, TEST_STRING_2_DICT_1);
|
test_string_escape("escape 1", escape1, i, TEST_STRING_2_DICT_1);
|
||||||
|
|
||||||
/* Test string_get_size() */
|
/* Test string_get_size() */
|
||||||
|
Loading…
Reference in New Issue
Block a user