strlcat.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. // SPDX-License-Identifier: GPL-2.1+
  2. /*
  3. * Copyright (C) 2021 Sean Anderson <seanga2@gmail.com>
  4. * Copyright (C) 2011-2021 Free Software Foundation, Inc.
  5. *
  6. * These tests adapted from glibc's string/test-strncat.c
  7. */
  8. #include <common.h>
  9. #include <test/lib.h>
  10. #include <test/test.h>
  11. #include <test/ut.h>
  12. #define BUF_SIZE 4096
  13. char buf1[BUF_SIZE], buf2[BUF_SIZE];
  14. static int do_test_strlcat(struct unit_test_state *uts, int line, size_t align1,
  15. size_t align2, size_t len1, size_t len2, size_t n)
  16. {
  17. char *s1, *s2;
  18. size_t i, len, expected, actual;
  19. align1 &= 7;
  20. if (align1 + len1 >= BUF_SIZE)
  21. return 0;
  22. if (align1 + n > BUF_SIZE)
  23. return 0;
  24. align2 &= 7;
  25. if (align2 + len1 + len2 >= BUF_SIZE)
  26. return 0;
  27. if (align2 + len1 + n > BUF_SIZE)
  28. return 0;
  29. s1 = buf1 + align1;
  30. s2 = buf2 + align2;
  31. for (i = 0; i < len1 - 1; i++)
  32. s1[i] = 32 + 23 * i % (127 - 32);
  33. s1[len1 - 1] = '\0';
  34. for (i = 0; i < len2 - 1; i++)
  35. s2[i] = 32 + 23 * i % (127 - 32);
  36. s2[len2 - 1] = '\0';
  37. expected = len2 < n ? min(len1 + len2 - 1, n) : n;
  38. actual = strlcat(s2, s1, n);
  39. if (expected != actual) {
  40. ut_failf(uts, __FILE__, line, __func__,
  41. "strlcat(s2, s1, 2) == len2 < n ? min(len1 + len2, n) : n",
  42. "Expected %#zx (%zd), got %#zx (%zd)",
  43. expected, expected, actual, actual);
  44. return CMD_RET_FAILURE;
  45. }
  46. len = min3(len1, n - len2, (size_t)0);
  47. if (memcmp(s2 + len2, s1, len)) {
  48. ut_failf(uts, __FILE__, line, __func__,
  49. "s2 + len1 == s1",
  50. "Expected \"%.*s\", got \"%.*s\"",
  51. (int)len, s1, (int)len, s2 + len2);
  52. return CMD_RET_FAILURE;
  53. }
  54. i = min(n, len1 + len2 - 1) - 1;
  55. if (len2 < n && s2[i] != '\0') {
  56. ut_failf(uts, __FILE__, line, __func__,
  57. "n < len1 && s2[len2 + n] == '\\0'",
  58. "Expected s2[%zd] = '\\0', got %d ('%c')",
  59. i, s2[i], s2[i]);
  60. return CMD_RET_FAILURE;
  61. }
  62. return 0;
  63. }
  64. #define test_strlcat(align1, align2, len1, len2, n) do { \
  65. int ret = do_test_strlcat(uts, __LINE__, align1, align2, len1, len2, \
  66. n); \
  67. if (ret) \
  68. return ret; \
  69. } while (0)
  70. static int lib_test_strlcat(struct unit_test_state *uts)
  71. {
  72. size_t i, n;
  73. test_strlcat(0, 2, 2, 2, SIZE_MAX);
  74. test_strlcat(0, 0, 4, 4, SIZE_MAX);
  75. test_strlcat(4, 0, 4, 4, SIZE_MAX);
  76. test_strlcat(0, 0, 8, 8, SIZE_MAX);
  77. test_strlcat(0, 8, 8, 8, SIZE_MAX);
  78. for (i = 1; i < 8; i++) {
  79. test_strlcat(0, 0, 8 << i, 8 << i, SIZE_MAX);
  80. test_strlcat(8 - i, 2 * i, 8 << i, 8 << i, SIZE_MAX);
  81. test_strlcat(0, 0, 8 << i, 2 << i, SIZE_MAX);
  82. test_strlcat(8 - i, 2 * i, 8 << i, 2 << i, SIZE_MAX);
  83. test_strlcat(i, 2 * i, 8 << i, 1, SIZE_MAX);
  84. test_strlcat(2 * i, i, 8 << i, 1, SIZE_MAX);
  85. test_strlcat(i, i, 8 << i, 10, SIZE_MAX);
  86. }
  87. for (n = 2; n <= 2048; n *= 4) {
  88. test_strlcat(0, 2, 2, 2, n);
  89. test_strlcat(0, 0, 4, 4, n);
  90. test_strlcat(4, 0, 4, 4, n);
  91. test_strlcat(0, 0, 8, 8, n);
  92. test_strlcat(0, 8, 8, 8, n);
  93. for (i = 1; i < 8; i++) {
  94. test_strlcat(0, 0, 8 << i, 8 << i, n);
  95. test_strlcat(8 - i, 2 * i, 8 << i, 8 << i, n);
  96. test_strlcat(0, 0, 8 << i, 2 << i, n);
  97. test_strlcat(8 - i, 2 * i, 8 << i, 2 << i, n);
  98. test_strlcat(i, 2 * i, 8 << i, 1, n);
  99. test_strlcat(2 * i, i, 8 << i, 1, n);
  100. test_strlcat(i, i, 8 << i, 10, n);
  101. }
  102. }
  103. return 0;
  104. }
  105. LIB_TEST(lib_test_strlcat, 0);