|
25 | 25 | #define FAST_MEMCPY |
26 | 26 |
|
27 | 27 | #include <check.h> |
| 28 | +#include <limits.h> |
28 | 29 | #include <stdint.h> |
29 | 30 | #include <string.h> |
| 31 | +#ifdef __linux__ |
| 32 | +#include <sys/mman.h> |
| 33 | +#endif |
30 | 34 |
|
31 | 35 | #include "string.c" |
32 | 36 |
|
@@ -325,6 +329,31 @@ START_TEST(test_memcpy_memmove) |
325 | 329 | } |
326 | 330 | END_TEST |
327 | 331 |
|
| 332 | +#if defined(__linux__) && (SIZE_MAX > INT_MAX) |
| 333 | +START_TEST(test_memmove_large_overlap_length) |
| 334 | +{ |
| 335 | + size_t n = (size_t)INT_MAX + 2U; |
| 336 | + size_t len = n + 1U; |
| 337 | + unsigned char *region = mmap(NULL, len, PROT_READ | PROT_WRITE, |
| 338 | + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); |
| 339 | + |
| 340 | + ck_assert_ptr_ne(region, MAP_FAILED); |
| 341 | + |
| 342 | + region[0] = 0x11; |
| 343 | + region[1] = 0x22; |
| 344 | + region[n - 1] = 0x33; |
| 345 | + region[n] = 0x44; |
| 346 | + |
| 347 | + memmove(region + 1, region, n); |
| 348 | + |
| 349 | + ck_assert_uint_eq(region[1], 0x11); |
| 350 | + ck_assert_uint_eq(region[n], 0x33); |
| 351 | + |
| 352 | + ck_assert_int_eq(munmap(region, len), 0); |
| 353 | +} |
| 354 | +END_TEST |
| 355 | +#endif |
| 356 | + |
328 | 357 | START_TEST(test_memcpy_aligned_buffers) |
329 | 358 | { |
330 | 359 | union { |
@@ -443,6 +472,9 @@ Suite *string_suite(void) |
443 | 472 | tcase_add_test(tcase_misc, test_strcpy_strncpy_strcat_strncat); |
444 | 473 | tcase_add_test(tcase_misc, test_strncmp); |
445 | 474 | tcase_add_test(tcase_misc, test_memcpy_memmove); |
| 475 | +#if defined(__linux__) && (SIZE_MAX > INT_MAX) |
| 476 | + tcase_add_test(tcase_misc, test_memmove_large_overlap_length); |
| 477 | +#endif |
446 | 478 | tcase_add_test(tcase_misc, test_memcpy_aligned_buffers); |
447 | 479 | tcase_add_test(tcase_misc, test_uart_writenum_basic); |
448 | 480 | tcase_add_test(tcase_misc, test_uart_printf_formats); |
|
0 commit comments