diff options
Diffstat (limited to 'lib/test-string_helpers.c')
-rw-r--r-- | lib/test-string_helpers.c | 40 |
1 files changed, 20 insertions, 20 deletions
diff --git a/lib/test-string_helpers.c b/lib/test-string_helpers.c index ab0d30e1e18f..8e376efd88a4 100644 --- a/lib/test-string_helpers.c +++ b/lib/test-string_helpers.c | |||
@@ -260,16 +260,28 @@ static __init const char *test_string_find_match(const struct test_string_2 *s2, | |||
260 | return NULL; | 260 | return NULL; |
261 | } | 261 | } |
262 | 262 | ||
263 | static __init void | ||
264 | test_string_escape_overflow(const char *in, int p, unsigned int flags, const char *esc, | ||
265 | int q_test, const char *name) | ||
266 | { | ||
267 | int q_real; | ||
268 | |||
269 | q_real = string_escape_mem(in, p, NULL, 0, flags, esc); | ||
270 | if (q_real != q_test) | ||
271 | pr_warn("Test '%s' failed: flags = %u, osz = 0, expected %d, got %d\n", | ||
272 | name, flags, q_test, q_real); | ||
273 | } | ||
274 | |||
263 | static __init void test_string_escape(const char *name, | 275 | static __init void test_string_escape(const char *name, |
264 | const struct test_string_2 *s2, | 276 | const struct test_string_2 *s2, |
265 | unsigned int flags, const char *esc) | 277 | unsigned int flags, const char *esc) |
266 | { | 278 | { |
267 | int q_real = 512; | 279 | size_t out_size = 512; |
268 | char *out_test = kmalloc(q_real, GFP_KERNEL); | 280 | char *out_test = kmalloc(out_size, GFP_KERNEL); |
269 | char *out_real = kmalloc(q_real, GFP_KERNEL); | 281 | char *out_real = kmalloc(out_size, GFP_KERNEL); |
270 | char *in = kmalloc(256, GFP_KERNEL); | 282 | char *in = kmalloc(256, GFP_KERNEL); |
271 | char *buf = out_real; | ||
272 | int p = 0, q_test = 0; | 283 | int p = 0, q_test = 0; |
284 | int q_real; | ||
273 | 285 | ||
274 | if (!out_test || !out_real || !in) | 286 | if (!out_test || !out_real || !in) |
275 | goto out; | 287 | goto out; |
@@ -301,29 +313,19 @@ static __init void test_string_escape(const char *name, | |||
301 | q_test += len; | 313 | q_test += len; |
302 | } | 314 | } |
303 | 315 | ||
304 | q_real = string_escape_mem(in, p, &buf, q_real, flags, esc); | 316 | q_real = string_escape_mem(in, p, out_real, out_size, flags, esc); |
305 | 317 | ||
306 | test_string_check_buf(name, flags, in, p, out_real, q_real, out_test, | 318 | test_string_check_buf(name, flags, in, p, out_real, q_real, out_test, |
307 | q_test); | 319 | q_test); |
320 | |||
321 | test_string_escape_overflow(in, p, flags, esc, q_test, name); | ||
322 | |||
308 | out: | 323 | out: |
309 | kfree(in); | 324 | kfree(in); |
310 | kfree(out_real); | 325 | kfree(out_real); |
311 | kfree(out_test); | 326 | kfree(out_test); |
312 | } | 327 | } |
313 | 328 | ||
314 | static __init void test_string_escape_nomem(void) | ||
315 | { | ||
316 | char *in = "\eb \\C\007\"\x90\r]"; | ||
317 | char out[64], *buf = out; | ||
318 | int rc = -ENOMEM, ret; | ||
319 | |||
320 | ret = string_escape_str_any_np(in, &buf, strlen(in), NULL); | ||
321 | if (ret == rc) | ||
322 | return; | ||
323 | |||
324 | pr_err("Test 'escape nomem' failed: got %d instead of %d\n", ret, rc); | ||
325 | } | ||
326 | |||
327 | static int __init test_string_helpers_init(void) | 329 | static int __init test_string_helpers_init(void) |
328 | { | 330 | { |
329 | unsigned int i; | 331 | unsigned int i; |
@@ -342,8 +344,6 @@ static int __init test_string_helpers_init(void) | |||
342 | for (i = 0; i < (ESCAPE_ANY_NP | ESCAPE_HEX) + 1; i++) | 344 | for (i = 0; i < (ESCAPE_ANY_NP | ESCAPE_HEX) + 1; i++) |
343 | test_string_escape("escape 1", escape1, i, TEST_STRING_2_DICT_1); | 345 | test_string_escape("escape 1", escape1, i, TEST_STRING_2_DICT_1); |
344 | 346 | ||
345 | test_string_escape_nomem(); | ||
346 | |||
347 | return -EINVAL; | 347 | return -EINVAL; |
348 | } | 348 | } |
349 | module_init(test_string_helpers_init); | 349 | module_init(test_string_helpers_init); |